summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2017-08-17 22:53:10 -0400
committerRusty Wagner <rusty@vector35.com>2017-08-17 22:53:10 -0400
commite40b46fdf8b76acb5ca2d0a062b0b8ac2ca99a16 (patch)
tree6f77f76307a8f08ee1e137aba2d3093e9f77c70c
parent78d90c30df96364cdc8dde1954be7341531cfe07 (diff)
Work around limitations in ctypes
-rw-r--r--binaryninjaapi.h4
-rw-r--r--binaryninjacore.h4
-rw-r--r--callingconvention.cpp8
-rw-r--r--python/callingconvention.py16
4 files changed, 18 insertions, 14 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 8a09529e..a1b31089 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -3075,8 +3075,8 @@ namespace BinaryNinja
static uint32_t GetGlobalPointerRegisterCallback(void* ctxt);
static uint32_t* GetImplicitlyDefinedRegistersCallback(void* ctxt, size_t* count);
- static BNRegisterValue GetIncomingRegisterValueCallback(void* ctxt, uint32_t reg, BNFunction* func);
- static BNRegisterValue GetIncomingFlagValueCallback(void* ctxt, uint32_t reg, BNFunction* func);
+ static void GetIncomingRegisterValueCallback(void* ctxt, uint32_t reg, BNFunction* func, BNRegisterValue* result);
+ static void GetIncomingFlagValueCallback(void* ctxt, uint32_t reg, BNFunction* func, BNRegisterValue* result);
public:
Ref<Architecture> GetArchitecture() const;
diff --git a/binaryninjacore.h b/binaryninjacore.h
index b69d79f9..5c6619b2 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -1250,8 +1250,8 @@ extern "C"
uint32_t (*getGlobalPointerRegister)(void* ctxt);
uint32_t* (*getImplicitlyDefinedRegisters)(void* ctxt, size_t* count);
- BNRegisterValue (*getIncomingRegisterValue)(void* ctxt, uint32_t reg, BNFunction* func);
- BNRegisterValue (*getIncomingFlagValue)(void* ctxt, uint32_t flag, BNFunction* func);
+ void (*getIncomingRegisterValue)(void* ctxt, uint32_t reg, BNFunction* func, BNRegisterValue* result);
+ void (*getIncomingFlagValue)(void* ctxt, uint32_t flag, BNFunction* func, BNRegisterValue* result);
};
struct BNVariableNameAndType
diff --git a/callingconvention.cpp b/callingconvention.cpp
index b0783ad6..0a7d349c 100644
--- a/callingconvention.cpp
+++ b/callingconvention.cpp
@@ -161,23 +161,23 @@ uint32_t* CallingConvention::GetImplicitlyDefinedRegistersCallback(void* ctxt, s
}
-BNRegisterValue CallingConvention::GetIncomingRegisterValueCallback(void* ctxt, uint32_t reg, BNFunction* func)
+void CallingConvention::GetIncomingRegisterValueCallback(void* ctxt, uint32_t reg, BNFunction* func, BNRegisterValue* result)
{
CallingConvention* cc = (CallingConvention*)ctxt;
Ref<Function> funcObj;
if (func)
funcObj = new Function(BNNewFunctionReference(func));
- return cc->GetIncomingRegisterValue(reg, funcObj).ToAPIObject();
+ *result = cc->GetIncomingRegisterValue(reg, funcObj).ToAPIObject();
}
-BNRegisterValue CallingConvention::GetIncomingFlagValueCallback(void* ctxt, uint32_t reg, BNFunction* func)
+void CallingConvention::GetIncomingFlagValueCallback(void* ctxt, uint32_t reg, BNFunction* func, BNRegisterValue* result)
{
CallingConvention* cc = (CallingConvention*)ctxt;
Ref<Function> funcObj;
if (func)
funcObj = new Function(BNNewFunctionReference(func));
- return cc->GetIncomingFlagValue(reg, funcObj).ToAPIObject();
+ *result = cc->GetIncomingFlagValue(reg, funcObj).ToAPIObject();
}
diff --git a/python/callingconvention.py b/python/callingconvention.py
index 609c71b0..bd8bbeee 100644
--- a/python/callingconvention.py
+++ b/python/callingconvention.py
@@ -267,25 +267,29 @@ class CallingConvention(object):
count[0] = 0
return None
- def _get_incoming_reg_value(self, ctxt, reg, func):
+ def _get_incoming_reg_value(self, ctxt, reg, func, result):
try:
func_obj = function.Function(binaryview.BinaryView(handle = core.BNGetFunctionData(func)),
core.BNNewFunctionReference(func))
reg_name = self.arch.get_reg_name(reg)
- return self.perform_get_incoming_reg_value(reg_name, func_obj)._to_api_object()
+ api_obj = self.perform_get_incoming_reg_value(reg_name, func_obj)._to_api_object()
except:
log.log_error(traceback.format_exc())
- return function.RegisterValue()._to_api_object()
+ api_obj = function.RegisterValue()._to_api_object()
+ result[0].state = api_obj.state
+ result[0].value = api_obj.value
- def _get_incoming_flag_value(self, ctxt, reg, func):
+ def _get_incoming_flag_value(self, ctxt, reg, func, result):
try:
func_obj = function.Function(binaryview.BinaryView(handle = core.BNGetFunctionData(func)),
core.BNNewFunctionReference(func))
reg_name = self.arch.get_reg_name(reg)
- return self.perform_get_incoming_flag_value(reg_name, func_obj)._to_api_object()
+ api_obj = self.perform_get_incoming_flag_value(reg_name, func_obj)._to_api_object()
except:
log.log_error(traceback.format_exc())
- return function.RegisterValue()._to_api_object()
+ api_obj = function.RegisterValue()._to_api_object()
+ result[0].state = api_obj.state
+ result[0].value = api_obj.value
def __repr__(self):
return "<calling convention: %s %s>" % (self.arch.name, self.name)