summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2015-04-06 14:29:51 -0700
committerRusty Wagner <rusty@vector35.com>2015-04-06 14:29:51 -0700
commita641c5266ad2a55af2bdd277a2b889ced4eb7235 (patch)
treee30a13162d29641d285951df10030c95e73ebef7
parentd5dc1c2e3169760156ac54c976bbe1ea3d9a8441 (diff)
Implement follow pointer in hex view
-rw-r--r--architecture.cpp28
-rw-r--r--binaryninjaapi.h14
-rw-r--r--binaryview.cpp48
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);