summaryrefslogtreecommitdiff
path: root/python/fileaccessor.py
diff options
context:
space:
mode:
authorplafosse <peter@vector35.com>2016-10-28 20:16:37 -0400
committerplafosse <peter@vector35.com>2016-10-28 20:16:37 -0400
commit5e4cca1f1796bec109adacdb049d9e34c17656eb (patch)
tree68d9effb24f5fae58c1016d992f9af57c18024cc /python/fileaccessor.py
parent253fc58d774f74edd47724eaec0197fc41561112 (diff)
Refactor python api into separate files and add Enumeration support. Also fixed bugs found with pyflakes
Diffstat (limited to 'python/fileaccessor.py')
-rw-r--r--python/fileaccessor.py88
1 files changed, 88 insertions, 0 deletions
diff --git a/python/fileaccessor.py b/python/fileaccessor.py
new file mode 100644
index 00000000..8fec43a1
--- /dev/null
+++ b/python/fileaccessor.py
@@ -0,0 +1,88 @@
+# Copyright (c) 2015-2016 Vector 35 LLC
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+import traceback
+import ctypes
+
+# Binary Ninja components
+import _binaryninjacore as core
+import log
+
+
+class FileAccessor(object):
+ def __init__(self):
+ self._cb = core.BNFileAccessor()
+ self._cb.context = 0
+ self._cb.getLength = self._cb.getLength.__class__(self._get_length)
+ self._cb.read = self._cb.read.__class__(self._read)
+ self._cb.write = self._cb.write.__class__(self._write)
+
+ def __len__(self):
+ return self.get_length()
+
+ def _get_length(self, ctxt):
+ try:
+ return self.get_length()
+ except:
+ log.log_error(traceback.format_exc())
+ return 0
+
+ def _read(self, ctxt, dest, offset, length):
+ try:
+ data = self.read(offset, length)
+ if data is None:
+ return 0
+ if len(data) > length:
+ data = data[0:length]
+ ctypes.memmove(dest, data, len(data))
+ return len(data)
+ except:
+ log.log_error(traceback.format_exc())
+ return 0
+
+ def _write(self, ctxt, offset, src, length):
+ try:
+ data = ctypes.create_string_buffer(length)
+ ctypes.memmove(data, src, length)
+ return self.write(offset, data.raw)
+ except:
+ log.log_error(traceback.format_exc())
+ return 0
+
+
+class CoreFileAccessor(FileAccessor):
+ def __init__(self, accessor):
+ self._cb.context = accessor.context
+ self._cb.getLength = accessor.getLength
+ self._cb.read = accessor.read
+ self._cb.write = accessor.write
+
+ def get_length(self):
+ return self._cb.getLength(self._cb.context)
+
+ def read(self, offset, length):
+ data = ctypes.create_string_buffer(length)
+ length = self._cb.read(self._cb.context, data, offset, length)
+ return data.raw[0:length]
+
+ def write(self, offset, value):
+ value = str(value)
+ data = ctypes.create_string_buffer(value)
+ return self._cb.write(self._cb.context, offset, data, len(value))