diff options
| author | Rusty Wagner <rusty@vector35.com> | 2015-04-06 14:29:51 -0700 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2015-04-06 14:29:51 -0700 |
| commit | a641c5266ad2a55af2bdd277a2b889ced4eb7235 (patch) | |
| tree | e30a13162d29641d285951df10030c95e73ebef7 | |
| parent | d5dc1c2e3169760156ac54c976bbe1ea3d9a8441 (diff) | |
Implement follow pointer in hex view
| -rw-r--r-- | architecture.cpp | 28 | ||||
| -rw-r--r-- | binaryninjaapi.h | 14 | ||||
| -rw-r--r-- | binaryview.cpp | 48 |
3 files changed, 90 insertions, 0 deletions
diff --git a/architecture.cpp b/architecture.cpp index fc5b0466..268fcece 100644 --- a/architecture.cpp +++ b/architecture.cpp @@ -42,6 +42,20 @@ Architecture::Architecture(const string& name): m_nameForRegister(name) } +BNEndianness Architecture::GetEndiannessCallback(void* ctxt) +{ + Architecture* arch = (Architecture*)ctxt; + return arch->GetEndianness(); +} + + +size_t Architecture::GetAddressSizeCallback(void* ctxt) +{ + Architecture* arch = (Architecture*)ctxt; + return arch->GetAddressSize(); +} + + bool Architecture::GetInstructionInfoCallback(void* ctxt, const uint8_t* data, uint64_t addr, size_t maxLen, BNInstructionInfo* result) { @@ -105,6 +119,8 @@ void Architecture::Register(Architecture* arch) { BNCustomArchitecture callbacks; callbacks.context = arch; + callbacks.getEndianness = GetEndiannessCallback; + callbacks.getAddressSize = GetAddressSizeCallback; callbacks.getInstructionInfo = GetInstructionInfoCallback; callbacks.getInstructionText = GetInstructionTextCallback; callbacks.freeInstructionText = FreeInstructionTextCallback; @@ -151,6 +167,18 @@ CoreArchitecture::CoreArchitecture(BNArchitecture* arch): Architecture(arch) } +BNEndianness CoreArchitecture::GetEndianness() const +{ + return BNGetArchitectureEndianness(m_arch); +} + + +size_t CoreArchitecture::GetAddressSize() const +{ + return BNGetArchitectureAddressSize(m_arch); +} + + bool CoreArchitecture::GetInstructionInfo(const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result) { return BNGetInstructionInfo(m_arch, data, addr, maxLen, &result); diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 358d278b..c29804b6 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -387,6 +387,8 @@ namespace BinaryNinja virtual uint64_t PerformGetLength() const { return 0; } virtual uint64_t PerformGetEntryPoint() const { return 0; } virtual bool PerformIsExecutable() const { return false; } + virtual BNEndianness PerformGetDefaultEndianness() const; + virtual size_t PerformGetAddressSize() const; virtual bool PerformSave(FileAccessor* file) { (void)file; return false; } @@ -405,6 +407,8 @@ namespace BinaryNinja static uint64_t GetLengthCallback(void* ctxt); static uint64_t GetEntryPointCallback(void* ctxt); static bool IsExecutableCallback(void* ctxt); + static BNEndianness GetDefaultEndiannessCallback(void* ctxt); + static size_t GetAddressSizeCallback(void* ctxt); static bool SaveCallback(void* ctxt, BNFileAccessor* file); public: @@ -449,6 +453,9 @@ namespace BinaryNinja Ref<Architecture> GetDefaultArchitecture() const; void SetDefaultArchitecture(Architecture* arch); + BNEndianness GetDefaultEndianness() const; + size_t GetAddressSize() const; + bool IsExecutable() const; bool Save(FileAccessor* file); @@ -722,6 +729,8 @@ namespace BinaryNinja Architecture(BNArchitecture* arch); + static BNEndianness GetEndiannessCallback(void* ctxt); + static size_t GetAddressSizeCallback(void* ctxt); static bool GetInstructionInfoCallback(void* ctxt, const uint8_t* data, uint64_t addr, size_t maxLen, BNInstructionInfo* result); static bool GetInstructionTextCallback(void* ctxt, const uint8_t* data, uint64_t addr, @@ -740,6 +749,9 @@ namespace BinaryNinja std::string GetName() const; + virtual BNEndianness GetEndianness() const = 0; + virtual size_t GetAddressSize() const = 0; + virtual bool GetInstructionInfo(const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result) = 0; virtual bool GetInstructionText(const uint8_t* data, uint64_t addr, size_t& len, std::vector<InstructionTextToken>& result) = 0; @@ -751,6 +763,8 @@ namespace BinaryNinja { public: CoreArchitecture(BNArchitecture* arch); + virtual BNEndianness GetEndianness() const override; + virtual size_t GetAddressSize() const override; virtual bool GetInstructionInfo(const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result) override; virtual bool GetInstructionText(const uint8_t* data, uint64_t addr, size_t& len, std::vector<InstructionTextToken>& result) override; diff --git a/binaryview.cpp b/binaryview.cpp index 8d75e7a7..02f0501b 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -143,6 +143,8 @@ BinaryView::BinaryView(FileMetadata* file) view.getLength = GetLengthCallback; view.getEntryPoint = GetEntryPointCallback; view.isExecutable = IsExecutableCallback; + view.getDefaultEndianness = GetDefaultEndiannessCallback; + view.getAddressSize = GetAddressSizeCallback; view.save = SaveCallback; m_file = file; @@ -233,6 +235,20 @@ bool BinaryView::IsExecutableCallback(void* ctxt) } +BNEndianness BinaryView::GetDefaultEndiannessCallback(void* ctxt) +{ + BinaryView* view = (BinaryView*)ctxt; + return view->GetDefaultEndianness(); +} + + +size_t BinaryView::GetAddressSizeCallback(void* ctxt) +{ + BinaryView* view = (BinaryView*)ctxt; + return view->GetAddressSize(); +} + + bool BinaryView::SaveCallback(void* ctxt, BNFileAccessor* file) { BinaryView* view = (BinaryView*)ctxt; @@ -248,6 +264,26 @@ bool BinaryView::PerformIsValidOffset(uint64_t offset) } +BNEndianness BinaryView::PerformGetDefaultEndianness() const +{ + Ref<Architecture> arch = GetDefaultArchitecture(); + if (arch) + return arch->GetEndianness(); + return LittleEndian; +} + + +size_t BinaryView::PerformGetAddressSize() const +{ + Ref<Architecture> arch = GetDefaultArchitecture(); + if (arch) + return arch->GetAddressSize(); + if (GetEnd() > (1LL << 32)) + return 8; + return 4; +} + + void BinaryView::NotifyDataWritten(uint64_t offset, size_t len) { BNNotifyDataWritten(m_view, offset, len); @@ -443,6 +479,18 @@ void BinaryView::SetDefaultArchitecture(Architecture* arch) } +BNEndianness BinaryView::GetDefaultEndianness() const +{ + return BNGetDefaultEndianness(m_view); +} + + +size_t BinaryView::GetAddressSize() const +{ + return BNGetViewAddressSize(m_view); +} + + bool BinaryView::IsExecutable() const { return BNIsExecutableView(m_view); |
