summaryrefslogtreecommitdiff
path: root/binaryview.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2016-07-10 02:41:25 -0400
committerRusty Wagner <rusty@vector35.com>2016-07-10 02:41:25 -0400
commit7853b6eea8c80b537e2fa199a19dde0f68845449 (patch)
treea2f9dfaad82faf2ba77df029493041fbf7707c66 /binaryview.cpp
parent05b8dae707da62437abf262fe8d1dd2b74a5f98f (diff)
Add APIs for accessing linear disassembly
Diffstat (limited to 'binaryview.cpp')
-rw-r--r--binaryview.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/binaryview.cpp b/binaryview.cpp
index a3abc02a..437c57a6 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -1100,6 +1100,116 @@ BNAnalysisProgress BinaryView::GetAnalysisProgress()
}
+uint64_t BinaryView::GetNextFunctionStartAfterAddress(uint64_t addr)
+{
+ return BNGetNextFunctionStartAfterAddress(m_object, addr);
+}
+
+
+uint64_t BinaryView::GetNextBasicBlockStartAfterAddress(uint64_t addr)
+{
+ return BNGetNextBasicBlockStartAfterAddress(m_object, addr);
+}
+
+
+uint64_t BinaryView::GetNextDataAfterAddress(uint64_t addr)
+{
+ return BNGetNextDataAfterAddress(m_object, addr);
+}
+
+
+LinearDisassemblyPosition BinaryView::GetLinearDisassemblyPositionForAddress(uint64_t addr)
+{
+ BNLinearDisassemblyPosition pos = BNGetLinearDisassemblyPositionForAddress(m_object, addr);
+
+ LinearDisassemblyPosition result;
+ result.function = pos.function ? new Function(pos.function) : nullptr;
+ result.block = pos.block ? new BasicBlock(pos.block) : nullptr;
+ result.address = pos.address;
+ return result;
+}
+
+
+vector<LinearDisassemblyLine> BinaryView::GetPreviousLinearDisassemblyLines(LinearDisassemblyPosition& pos,
+ DisassemblySettings* settings)
+{
+ BNLinearDisassemblyPosition linearPos;
+ linearPos.function = pos.function ? BNNewFunctionReference(pos.function->GetObject()) : nullptr;
+ linearPos.block = pos.block ? BNNewBasicBlockReference(pos.block->GetObject()) : nullptr;
+ linearPos.address = pos.address;
+
+ size_t count;
+ BNLinearDisassemblyLine* lines = BNGetPreviousLinearDisassemblyLines(m_object, &linearPos,
+ settings ? settings->GetObject() : nullptr, &count);
+
+ vector<LinearDisassemblyLine> result;
+ for (size_t i = 0; i < count; i++)
+ {
+ LinearDisassemblyLine line;
+ line.function = lines[i].function ? new Function(BNNewFunctionReference(lines[i].function)) : nullptr;
+ line.block = lines[i].block ? new BasicBlock(BNNewBasicBlockReference(lines[i].block)) : nullptr;
+ line.lineOffset = lines[i].lineOffset;
+ line.contents.addr = lines[i].contents.addr;
+ for (size_t j = 0; j < lines[i].contents.count; j++)
+ {
+ InstructionTextToken token;
+ token.type = lines[i].contents.tokens[j].type;
+ token.text = lines[i].contents.tokens[j].text;
+ token.value = lines[i].contents.tokens[j].value;
+ line.contents.tokens.push_back(token);
+ }
+ result.push_back(line);
+ }
+
+ pos.function = linearPos.function ? new Function(linearPos.function) : nullptr;
+ pos.block = linearPos.block ? new BasicBlock(linearPos.block) : nullptr;
+ pos.address = linearPos.address;
+
+ BNFreeLinearDisassemblyLines(lines, count);
+ return result;
+}
+
+
+vector<LinearDisassemblyLine> BinaryView::GetNextLinearDisassemblyLines(LinearDisassemblyPosition& pos,
+ DisassemblySettings* settings)
+{
+ BNLinearDisassemblyPosition linearPos;
+ linearPos.function = pos.function ? BNNewFunctionReference(pos.function->GetObject()) : nullptr;
+ linearPos.block = pos.block ? BNNewBasicBlockReference(pos.block->GetObject()) : nullptr;
+ linearPos.address = pos.address;
+
+ size_t count;
+ BNLinearDisassemblyLine* lines = BNGetNextLinearDisassemblyLines(m_object, &linearPos,
+ settings ? settings->GetObject() : nullptr, &count);
+
+ vector<LinearDisassemblyLine> result;
+ for (size_t i = 0; i < count; i++)
+ {
+ LinearDisassemblyLine line;
+ line.function = lines[i].function ? new Function(BNNewFunctionReference(lines[i].function)) : nullptr;
+ line.block = lines[i].block ? new BasicBlock(BNNewBasicBlockReference(lines[i].block)) : nullptr;
+ line.lineOffset = lines[i].lineOffset;
+ line.contents.addr = lines[i].contents.addr;
+ for (size_t j = 0; j < lines[i].contents.count; j++)
+ {
+ InstructionTextToken token;
+ token.type = lines[i].contents.tokens[j].type;
+ token.text = lines[i].contents.tokens[j].text;
+ token.value = lines[i].contents.tokens[j].value;
+ line.contents.tokens.push_back(token);
+ }
+ result.push_back(line);
+ }
+
+ pos.function = linearPos.function ? new Function(linearPos.function) : nullptr;
+ pos.block = linearPos.block ? new BasicBlock(linearPos.block) : nullptr;
+ pos.address = linearPos.address;
+
+ BNFreeLinearDisassemblyLines(lines, count);
+ return result;
+}
+
+
BinaryData::BinaryData(FileMetadata* file): BinaryView(BNCreateBinaryDataView(file->GetObject()))
{
}