From f2b794bf897a2e208407bf5f4a13f4f813531e68 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Fri, 20 Feb 2015 03:12:19 -0500 Subject: Initial code for generating function graphs --- functiongraph.cpp | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 functiongraph.cpp (limited to 'functiongraph.cpp') diff --git a/functiongraph.cpp b/functiongraph.cpp new file mode 100644 index 00000000..476c2fe2 --- /dev/null +++ b/functiongraph.cpp @@ -0,0 +1,117 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +FunctionGraph::FunctionGraph(BNFunctionGraph* graph): m_graph(graph) +{ +} + + +FunctionGraph::~FunctionGraph() +{ + BNFreeFunctionGraph(m_graph); +} + + +void FunctionGraph::CompleteCallback(void* ctxt) +{ + FunctionGraph* graph = (FunctionGraph*)ctxt; + graph->m_completeFunc(); +} + + +Ref FunctionGraph::GetFunction() const +{ + return new Function(BNNewFunctionReference(BNGetFunctionForFunctionGraph(m_graph))); +} + + +int FunctionGraph::GetHorizontalBlockMargin() const +{ + return BNGetHorizontalFunctionGraphBlockMargin(m_graph); +} + + +int FunctionGraph::GetVerticalBlockMargin() const +{ + return BNGetVerticalFunctionGraphBlockMargin(m_graph); +} + + +void FunctionGraph::SetBlockMargins(int horiz, int vert) +{ + BNSetFunctionGraphBlockMargins(m_graph, horiz, vert); +} + + +void FunctionGraph::StartLayout() +{ + BNStartFunctionGraphLayout(m_graph); +} + + +bool FunctionGraph::IsLayoutComplete() +{ + return BNIsFunctionGraphLayoutComplete(m_graph); +} + + +void FunctionGraph::OnComplete(const std::function& func) +{ + m_completeFunc = func; + BNSetFunctionGraphCompleteCallback(m_graph, this, CompleteCallback); +} + + +vector> FunctionGraph::GetBlocks() const +{ + size_t count; + BNFunctionGraphBlock** blocks = BNGetFunctionGraphBlocks(m_graph, &count); + + vector> result; + for (size_t i = 0; i < count; i++) + result.push_back(new FunctionGraphBlock(BNNewFunctionGraphBlockReference(blocks[i]))); + + BNFreeFunctionGraphBlockList(blocks, count); + return result; +} + + +int FunctionGraph::GetLeftExtent() const +{ + return BNGetFunctionGraphLeftExtent(m_graph); +} + + +int FunctionGraph::GetTopExtent() const +{ + return BNGetFunctionGraphTopExtent(m_graph); +} + + +int FunctionGraph::GetRightExtent() const +{ + return BNGetFunctionGraphRightExtent(m_graph); +} + + +int FunctionGraph::GetBottomExtent() const +{ + return BNGetFunctionGraphBottomExtent(m_graph); +} + + +vector> FunctionGraph::GetBlocksInRegion(int left, int top, int right, int bottom) +{ + size_t count; + BNFunctionGraphBlock** blocks = BNGetFunctionGraphBlocksInRegion(m_graph, left, top, right, bottom, &count); + + vector> result; + for (size_t i = 0; i < count; i++) + result.push_back(new FunctionGraphBlock(BNNewFunctionGraphBlockReference(blocks[i]))); + + BNFreeFunctionGraphBlockList(blocks, count); + return result; +} -- cgit v1.3.1