summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2015-02-19 01:32:45 -0500
committerRusty Wagner <rusty@vector35.com>2015-02-19 01:32:45 -0500
commit584e4d244a9124f6ec403162994434ff085e9c5d (patch)
tree1df2fd7d9f6f38f3217b596772c2866b2e12d606
parent3f36f01667138e248d030701b9c0c047c1c7f5d7 (diff)
Add APIs for accessing function information
-rw-r--r--api.pro4
-rw-r--r--basicblock.cpp72
-rw-r--r--binaryninjaapi.h37
-rw-r--r--function.cpp41
4 files changed, 153 insertions, 1 deletions
diff --git a/api.pro b/api.pro
index 8cd9642c..8dfd78bd 100644
--- a/api.pro
+++ b/api.pro
@@ -20,7 +20,9 @@ SOURCES += \
binaryreader.cpp \
binarywriter.cpp \
transform.cpp \
- architecture.cpp
+ architecture.cpp \
+ basicblock.cpp \
+ function.cpp
HEADERS += binaryninjaapi.h
unix {
diff --git a/basicblock.cpp b/basicblock.cpp
new file mode 100644
index 00000000..6fc72992
--- /dev/null
+++ b/basicblock.cpp
@@ -0,0 +1,72 @@
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+BasicBlock::BasicBlock(BNBasicBlock* block): m_block(block)
+{
+}
+
+
+BasicBlock::~BasicBlock()
+{
+ BNFreeBasicBlock(m_block);
+}
+
+
+Ref<Function> BasicBlock::GetFunction() const
+{
+ return new Function(BNGetBasicBlockFunction(m_block));
+}
+
+
+Ref<Architecture> BasicBlock::GetArchitecture() const
+{
+ return new CoreArchitecture(BNGetBasicBlockArchitecture(m_block));
+}
+
+
+uint64_t BasicBlock::GetStart() const
+{
+ return BNGetBasicBlockStart(m_block);
+}
+
+
+uint64_t BasicBlock::GetEnd() const
+{
+ return BNGetBasicBlockEnd(m_block);
+}
+
+
+uint64_t BasicBlock::GetLength() const
+{
+ return BNGetBasicBlockLength(m_block);
+}
+
+
+vector<uint8_t> BasicBlock::GetInstructionSizes() const
+{
+ size_t count;
+ uint8_t* array = BNGetBasicBlockInstructionSizes(m_block, &count);
+
+ vector<uint8_t> result;
+ result.insert(result.end(), &array[0], &array[count]);
+
+ BNFreeBasicBlockInstructionSizeList(array);
+ return result;
+}
+
+
+vector<BNBasicBlockEdge> BasicBlock::GetOutgoingEdges() const
+{
+ size_t count;
+ BNBasicBlockEdge* array = BNGetBasicBlockOutgoingEdges(m_block, &count);
+
+ vector<BNBasicBlockEdge> result;
+ for (size_t i = 0; i < count; i++)
+ result.push_back(array[i]);
+
+ BNFreeBasicBlockOutgoingEdgeList(array);
+ return result;
+}
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 331fa1fb..891dcda0 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -611,4 +611,41 @@ namespace BinaryNinja
CoreArchitecture(BNArchitecture* arch);
virtual bool GetInstructionInfo(BinaryView* view, uint64_t addr, InstructionInfo& result) override;
};
+
+ class Function;
+
+ class BasicBlock: public RefCountObject
+ {
+ BNBasicBlock* m_block;
+
+ public:
+ BasicBlock(BNBasicBlock* block);
+ ~BasicBlock();
+
+ Ref<Function> GetFunction() const;
+ Ref<Architecture> GetArchitecture() const;
+
+ uint64_t GetStart() const;
+ uint64_t GetEnd() const;
+ uint64_t GetLength() const;
+
+ std::vector<uint8_t> GetInstructionSizes() const;
+ std::vector<BNBasicBlockEdge> GetOutgoingEdges() const;
+ };
+
+ class Function: public RefCountObject
+ {
+ BNFunction* m_func;
+
+ public:
+ Function(BNFunction* func);
+ ~Function();
+
+ BNFunction* GetFunctionObject() const { return m_func; }
+
+ Ref<Architecture> GetArchitecture() const;
+ uint64_t GetStart() const;
+
+ std::vector<Ref<BasicBlock>> GetBasicBlocks() const;
+ };
}
diff --git a/function.cpp b/function.cpp
new file mode 100644
index 00000000..db99b97d
--- /dev/null
+++ b/function.cpp
@@ -0,0 +1,41 @@
+#include "binaryninjaapi.h"
+
+using namespace BinaryNinja;
+using namespace std;
+
+
+Function::Function(BNFunction* func): m_func(func)
+{
+}
+
+
+Function::~Function()
+{
+ BNFreeFunction(m_func);
+}
+
+
+Ref<Architecture> Function::GetArchitecture() const
+{
+ return new CoreArchitecture(BNGetFunctionArchitecture(m_func));
+}
+
+
+uint64_t Function::GetStart() const
+{
+ return BNGetFunctionStart(m_func);
+}
+
+
+vector<Ref<BasicBlock>> Function::GetBasicBlocks() const
+{
+ size_t count;
+ BNBasicBlock** blocks = BNGetFunctionBasicBlockList(m_func, &count);
+
+ vector<Ref<BasicBlock>> result;
+ for (size_t i = 0; i < count; i++)
+ result.push_back(new BasicBlock(BNNewBasicBlockReference(blocks[i])));
+
+ BNFreeBasicBlockList(blocks, count);
+ return result;
+}