From c0e76778ad4149565de0f2729c6c36464fb522f0 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Sat, 29 Aug 2015 23:48:01 -0400 Subject: Implement part of the Python API to register new architectures --- architecture.cpp | 14 +++++++++++--- binaryninjaapi.h | 3 ++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/architecture.cpp b/architecture.cpp index ae4dd225..e4d3e4f0 100644 --- a/architecture.cpp +++ b/architecture.cpp @@ -47,6 +47,13 @@ Architecture::Architecture(const string& name): m_nameForRegister(name) } +void Architecture::InitCallback(void* ctxt, BNArchitecture* obj) +{ + Architecture* arch = (Architecture*)ctxt; + arch->m_arch = obj; +} + + BNEndianness Architecture::GetEndiannessCallback(void* ctxt) { Architecture* arch = (Architecture*)ctxt; @@ -179,10 +186,10 @@ void Architecture::FreeRegisterListCallback(void*, uint32_t* regs) } -BNRegisterInfo Architecture::GetRegisterInfoCallback(void* ctxt, uint32_t reg) +void Architecture::GetRegisterInfoCallback(void* ctxt, uint32_t reg, BNRegisterInfo* result) { Architecture* arch = (Architecture*)ctxt; - return arch->GetRegisterInfo(reg); + *result = arch->GetRegisterInfo(reg); } @@ -273,6 +280,7 @@ void Architecture::Register(Architecture* arch) { BNCustomArchitecture callbacks; callbacks.context = arch; + callbacks.init = InitCallback; callbacks.getEndianness = GetEndiannessCallback; callbacks.getAddressSize = GetAddressSizeCallback; callbacks.getDefaultIntegerSize = GetDefaultIntegerSizeCallback; @@ -298,7 +306,7 @@ void Architecture::Register(Architecture* arch) callbacks.alwaysBranch = AlwaysBranchCallback; callbacks.invertBranch = InvertBranchCallback; callbacks.skipAndReturnValue = SkipAndReturnValueCallback; - arch->m_arch = BNRegisterArchitecture(arch->m_nameForRegister.c_str(), &callbacks); + BNRegisterArchitecture(arch->m_nameForRegister.c_str(), &callbacks); } diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 2c6f4b03..94857d52 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -831,6 +831,7 @@ namespace BinaryNinja Architecture(BNArchitecture* arch); + static void InitCallback(void* ctxt, BNArchitecture* obj); static BNEndianness GetEndiannessCallback(void* ctxt); static size_t GetAddressSizeCallback(void* ctxt); static size_t GetDefaultIntegerSizeCallback(void* ctxt); @@ -847,7 +848,7 @@ namespace BinaryNinja static uint32_t* GetFullWidthRegistersCallback(void* ctxt, size_t* count); static uint32_t* GetAllRegistersCallback(void* ctxt, size_t* count); static void FreeRegisterListCallback(void* ctxt, uint32_t* regs); - static BNRegisterInfo GetRegisterInfoCallback(void* ctxt, uint32_t reg); + static void GetRegisterInfoCallback(void* ctxt, uint32_t reg, BNRegisterInfo* result); static uint32_t GetStackPointerRegisterCallback(void* ctxt); static bool AssembleCallback(void* ctxt, const char* code, uint64_t addr, BNDataBuffer* result, char** errors); -- cgit v1.3.1