From 08a2e3fc0310ae7cc6d8374fef9301711cb26ae6 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Sun, 13 Dec 2015 02:22:08 -0500 Subject: Backend code for plugin command registration --- binaryninjaapi.h | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) (limited to 'binaryninjaapi.h') diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 0886a1cf..59b4379f 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1393,4 +1393,87 @@ namespace BinaryNinja static std::vector GetChannelVersions(const std::string& channel); }; + + struct PluginCommandContext + { + Ref view; + uint64_t address, length; + Ref function; + + PluginCommandContext(); + }; + + class PluginCommand + { + BNPluginCommand m_command; + + struct RegisteredDefaultCommand + { + std::function action; + std::function isValid; + }; + + struct RegisteredAddressCommand + { + std::function action; + std::function isValid; + }; + + struct RegisteredRangeCommand + { + std::function action; + std::function isValid; + }; + + struct RegisteredFunctionCommand + { + std::function action; + std::function isValid; + }; + + static void DefaultPluginCommandActionCallback(void* ctxt, BNBinaryView* view); + static void AddressPluginCommandActionCallback(void* ctxt, BNBinaryView* view, uint64_t addr); + static void RangePluginCommandActionCallback(void* ctxt, BNBinaryView* view, uint64_t addr, uint64_t len); + static void FunctionPluginCommandActionCallback(void* ctxt, BNBinaryView* view, BNFunction* func); + + static bool DefaultPluginCommandIsValidCallback(void* ctxt, BNBinaryView* view); + static bool AddressPluginCommandIsValidCallback(void* ctxt, BNBinaryView* view, uint64_t addr); + static bool RangePluginCommandIsValidCallback(void* ctxt, BNBinaryView* view, uint64_t addr, uint64_t len); + static bool FunctionPluginCommandIsValidCallback(void* ctxt, BNBinaryView* view, BNFunction* func); + + public: + PluginCommand(const BNPluginCommand& cmd); + PluginCommand(const PluginCommand& cmd); + ~PluginCommand(); + + static void Register(const std::string& name, const std::string& description, + const std::function& action); + static void Register(const std::string& name, const std::string& description, + const std::function& action, + const std::function& isValid); + static void RegisterForAddress(const std::string& name, const std::string& description, + const std::function& action); + static void RegisterForAddress(const std::string& name, const std::string& description, + const std::function& action, + const std::function& isValid); + static void RegisterForRange(const std::string& name, const std::string& description, + const std::function& action); + static void RegisterForRange(const std::string& name, const std::string& description, + const std::function& action, + const std::function& isValid); + static void RegisterForFunction(const std::string& name, const std::string& description, + const std::function& action); + static void RegisterForFunction(const std::string& name, const std::string& description, + const std::function& action, + const std::function& isValid); + + static std::vector GetList(); + static std::vector GetValidList(const PluginCommandContext& ctxt); + + std::string GetName() const { return m_command.name; } + std::string GetDescription() const { return m_command.description; } + + bool IsValid(const PluginCommandContext& ctxt); + void Execute(const PluginCommandContext& ctxt); + }; } -- cgit v1.3.1