summaryrefslogtreecommitdiff
path: root/python/__init__.py
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2017-08-31 21:41:25 -0400
committerRusty Wagner <rusty@vector35.com>2017-08-31 21:41:25 -0400
commit7cbb40a71ffb2583862191b7999e436807f9a0e8 (patch)
tree25846f8d0e811b16b28291aeaf6359bee51e28c4 /python/__init__.py
parent980e2f090fb47f7f71a46b03e8c636819f3214ec (diff)
parent0b30396eb319e89e4f69d9cbac12fc3d4b453f53 (diff)
Merge branch 'dev'
Diffstat (limited to 'python/__init__.py')
-rw-r--r--python/__init__.py50
1 files changed, 49 insertions, 1 deletions
diff --git a/python/__init__.py b/python/__init__.py
index 4f58a6db..f4a8fac8 100644
--- a/python/__init__.py
+++ b/python/__init__.py
@@ -19,6 +19,9 @@
# IN THE SOFTWARE.
+import atexit
+import sys
+
# Binary Ninja components
import _binaryninjacore as core
from .enums import *
@@ -47,6 +50,8 @@ from .undoaction import *
from .highlight import *
from .scriptingprovider import *
from .pluginmanager import *
+from .setting import *
+from .metadata import *
def shutdown():
@@ -56,6 +61,9 @@ def shutdown():
core.BNShutdown()
+atexit.register(shutdown)
+
+
def get_unique_identifier():
return core.BNGetUniqueIdentifierString()
@@ -64,11 +72,51 @@ def get_install_directory():
"""
``get_install_directory`` returns a string pointing to the installed binary currently running
- .warning:: ONLY for use within the Binary Ninja UI, behavior is undefined and unreliable if run headlessly
+ ..warning:: ONLY for use within the Binary Ninja UI, behavior is undefined and unreliable if run headlessly
"""
return core.BNGetInstallDirectory()
+_plugin_api_name = "python2"
+
+
+class PluginManagerLoadPluginCallback(object):
+ """Callback for BNLoadPluginForApi("python2", ...), dynamicly loads python plugins."""
+ def __init__(self):
+ self.cb = ctypes.CFUNCTYPE(
+ ctypes.c_bool,
+ ctypes.c_char_p,
+ ctypes.c_char_p,
+ ctypes.c_void_p)(self._load_plugin)
+
+ def _load_plugin(self, repo_path, plugin_path, ctx):
+ try:
+ repo = RepositoryManager()[repo_path]
+ plugin = repo[plugin_path]
+
+ if plugin.api != _plugin_api_name:
+ raise ValueError("Plugin api name is not " + _plugin_api_name)
+
+ if not plugin.installed:
+ plugin.installed = True
+
+ if repo.full_path not in sys.path:
+ sys.path.append(repo.full_path)
+
+ __import__(plugin.path)
+ log_info("Successfully loaded plugin: {}/{}: ".format(repo_path, plugin_path))
+ return True
+ except KeyError:
+ log_error("Failed to find python plugin: {}/{}".format(repo_path, plugin_path))
+ except ImportError as ie:
+ log_error("Failed to import python plugin: {}/{}: {}".format(repo_path, plugin_path, ie))
+ return False
+
+
+load_plugin = PluginManagerLoadPluginCallback()
+core.BNRegisterForPluginLoading(_plugin_api_name, load_plugin.cb, 0)
+
+
class _DestructionCallbackHandler(object):
def __init__(self):
self._cb = core.BNObjectDestructionCallbacks()