diff options
| author | Jordan Wiens <jordan@psifertex.com> | 2016-08-18 22:48:36 -0400 |
|---|---|---|
| committer | Jordan Wiens <jordan@psifertex.com> | 2016-08-18 22:48:36 -0400 |
| commit | c14db29d86617ba3b040086f1f3388d8f8c5ccd1 (patch) | |
| tree | 15e0aad15a652bd8381ab493de3e1be7c7bc4ff5 /binaryninjaapi.h | |
| parent | dbb2bd3b4f329e867fac03ee11501c3529910c2e (diff) | |
| parent | e29b88a95e41aeb579b4d3bbfc0869acf1282c8b (diff) | |
Merge branch 'dev' of github.com:Vector35/binaryninja-api into dev
Diffstat (limited to 'binaryninjaapi.h')
| -rw-r--r-- | binaryninjaapi.h | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 2b2ccc48..d3234dcc 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -273,6 +273,8 @@ namespace BinaryNinja class Platform; class Type; class DataBuffer; + class MainThreadAction; + class MainThreadActionHandler; /*! Logs to the error console with the given BNLogLevel. @@ -365,6 +367,10 @@ namespace BinaryNinja Type** outType, std::vector<std::string>& outVarName); + void RegisterMainThread(MainThreadActionHandler* handler); + Ref<MainThreadAction> ExecuteOnMainThread(const std::function<void()>& action); + void ExecuteOnMainThreadAndWait(const std::function<void()>& action); + class DataBuffer { BNDataBuffer* m_buffer; @@ -2062,4 +2068,111 @@ namespace BinaryNinja Ref<Platform> GetRelatedPlatform(Architecture* arch); void AddRelatedPlatform(Architecture* arch, Platform* platform); }; + + class ScriptingOutputListener + { + BNScriptingOutputListener m_callbacks; + + static void OutputCallback(void* ctxt, const char* text); + static void ErrorCallback(void* ctxt, const char* text); + static void InputReadyStateChangedCallback(void* ctxt, BNScriptingProviderInputReadyState state); + + public: + ScriptingOutputListener(); + BNScriptingOutputListener& GetCallbacks() { return m_callbacks; } + + virtual void NotifyOutput(const std::string& text); + virtual void NotifyError(const std::string& text); + virtual void NotifyInputReadyStateChanged(BNScriptingProviderInputReadyState state); + }; + + class ScriptingProvider; + + class ScriptingInstance: public CoreRefCountObject<BNScriptingInstance, + BNNewScriptingInstanceReference, BNFreeScriptingInstance> + { + protected: + ScriptingInstance(ScriptingProvider* provider); + ScriptingInstance(BNScriptingInstance* instance); + + static void DestroyInstanceCallback(void* ctxt); + static BNScriptingProviderExecuteResult ExecuteScriptInputCallback(void* ctxt, const char* input); + static void SetCurrentBinaryViewCallback(void* ctxt, BNBinaryView* view); + static void SetCurrentFunctionCallback(void* ctxt, BNFunction* func); + static void SetCurrentBasicBlockCallback(void* ctxt, BNBasicBlock* block); + static void SetCurrentAddressCallback(void* ctxt, uint64_t addr); + static void SetCurrentSelectionCallback(void* ctxt, uint64_t begin, uint64_t end); + + virtual void DestroyInstance(); + + public: + virtual BNScriptingProviderExecuteResult ExecuteScriptInput(const std::string& input) = 0; + virtual void SetCurrentBinaryView(BinaryView* view); + virtual void SetCurrentFunction(Function* func); + virtual void SetCurrentBasicBlock(BasicBlock* block); + virtual void SetCurrentAddress(uint64_t addr); + virtual void SetCurrentSelection(uint64_t begin, uint64_t end); + + void Output(const std::string& text); + void Error(const std::string& text); + void InputReadyStateChanged(BNScriptingProviderInputReadyState state); + BNScriptingProviderInputReadyState GetInputReadyState(); + + void RegisterOutputListener(ScriptingOutputListener* listener); + void UnregisterOutputListener(ScriptingOutputListener* listener); + }; + + class CoreScriptingInstance: public ScriptingInstance + { + public: + CoreScriptingInstance(BNScriptingInstance* instance); + + virtual BNScriptingProviderExecuteResult ExecuteScriptInput(const std::string& input) override; + virtual void SetCurrentBinaryView(BinaryView* view) override; + virtual void SetCurrentFunction(Function* func) override; + virtual void SetCurrentBasicBlock(BasicBlock* block) override; + virtual void SetCurrentAddress(uint64_t addr) override; + virtual void SetCurrentSelection(uint64_t begin, uint64_t end) override; + }; + + class ScriptingProvider: public StaticCoreRefCountObject<BNScriptingProvider> + { + std::string m_nameForRegister; + + protected: + ScriptingProvider(const std::string& name); + ScriptingProvider(BNScriptingProvider* provider); + + static BNScriptingInstance* CreateInstanceCallback(void* ctxt); + + public: + virtual Ref<ScriptingInstance> CreateNewInstance() = 0; + + static std::vector<Ref<ScriptingProvider>> GetList(); + static Ref<ScriptingProvider> GetByName(const std::string& name); + static void Register(ScriptingProvider* provider); + }; + + class CoreScriptingProvider: public ScriptingProvider + { + public: + CoreScriptingProvider(BNScriptingProvider* provider); + virtual Ref<ScriptingInstance> CreateNewInstance() override; + }; + + class MainThreadAction: public CoreRefCountObject<BNMainThreadAction, + BNNewMainThreadActionReference, BNFreeMainThreadAction> + { + public: + MainThreadAction(BNMainThreadAction* action); + void Execute(); + bool IsDone() const; + void Wait(); + }; + + class MainThreadActionHandler + { + public: + virtual void AddMainThreadAction(MainThreadAction* action) = 0; + }; } |
