diff options
| author | Rusty Wagner <rusty@vector35.com> | 2017-08-17 22:53:10 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2017-08-17 22:53:10 -0400 |
| commit | e40b46fdf8b76acb5ca2d0a062b0b8ac2ca99a16 (patch) | |
| tree | 6f77f76307a8f08ee1e137aba2d3093e9f77c70c | |
| parent | 78d90c30df96364cdc8dde1954be7341531cfe07 (diff) | |
Work around limitations in ctypes
| -rw-r--r-- | binaryninjaapi.h | 4 | ||||
| -rw-r--r-- | binaryninjacore.h | 4 | ||||
| -rw-r--r-- | callingconvention.cpp | 8 | ||||
| -rw-r--r-- | python/callingconvention.py | 16 |
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) |
