diff options
| author | Rusty Wagner <rusty@vector35.com> | 2020-04-10 22:04:08 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2020-04-17 14:20:25 -0400 |
| commit | 9c1577c370d76b1797d55176cb59a10666b6ef2f (patch) | |
| tree | 4b4ee97e205557c98d48be0c9abbd94bf24b95b1 /linearviewobject.cpp | |
| parent | 111a17fe65435ccf96b66d7c55a33d3642c68b9a (diff) | |
Initial implementation of new linear view API
Diffstat (limited to 'linearviewobject.cpp')
| -rw-r--r-- | linearviewobject.cpp | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/linearviewobject.cpp b/linearviewobject.cpp new file mode 100644 index 00000000..8f4fc22e --- /dev/null +++ b/linearviewobject.cpp @@ -0,0 +1,206 @@ +// Copyright (c) 2020 Vector 35 Inc +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. + +#include "binaryninjaapi.h" + +using namespace std; +using namespace BinaryNinja; + + +LinearViewObjectIdentifier::LinearViewObjectIdentifier(): + type(SingleLinearViewObject), start(0), end(0) +{ +} + + +LinearViewObjectIdentifier::LinearViewObjectIdentifier(const string& _name): + name(_name), type(SingleLinearViewObject), start(0), end(0) +{ +} + + +LinearViewObjectIdentifier::LinearViewObjectIdentifier(const string& _name, uint64_t addr): + name(_name), type(AddressLinearViewObject), start(addr), end(addr) +{ +} + + +LinearViewObjectIdentifier::LinearViewObjectIdentifier(const string& _name, uint64_t _start, uint64_t _end): + name(_name), type(AddressRangeLinearViewObject), start(_start), end(_end) +{ +} + + +LinearViewObjectIdentifier::LinearViewObjectIdentifier(const LinearViewObjectIdentifier& other): + name(other.name), type(other.type), start(other.start), end(other.end) +{ +} + + +LinearViewObject::LinearViewObject(BNLinearViewObject* obj) +{ + m_object = obj; +} + + +Ref<LinearViewObject> LinearViewObject::GetFirstChild() +{ + BNLinearViewObject* result = BNGetFirstLinearViewObjectChild(m_object); + if (result) + return new LinearViewObject(result); + return nullptr; +} + + +Ref<LinearViewObject> LinearViewObject::GetLastChild() +{ + BNLinearViewObject* result = BNGetLastLinearViewObjectChild(m_object); + if (result) + return new LinearViewObject(result); + return nullptr; +} + + +Ref<LinearViewObject> LinearViewObject::GetPreviousChild(LinearViewObject* obj) +{ + BNLinearViewObject* result = BNGetPreviousLinearViewObjectChild(m_object, obj->GetObject()); + if (result) + return new LinearViewObject(result); + return nullptr; +} + + +Ref<LinearViewObject> LinearViewObject::GetNextChild(LinearViewObject* obj) +{ + BNLinearViewObject* result = BNGetNextLinearViewObjectChild(m_object, obj->GetObject()); + if (result) + return new LinearViewObject(result); + return nullptr; +} + + +Ref<LinearViewObject> LinearViewObject::GetChildForAddress(uint64_t addr) +{ + BNLinearViewObject* result = BNGetLinearViewObjectChildForAddress(m_object, addr); + if (result) + return new LinearViewObject(result); + return nullptr; +} + + +Ref<LinearViewObject> LinearViewObject::GetChildForIdentifier(const LinearViewObjectIdentifier& id) +{ + BNLinearViewObjectIdentifier lvid; + lvid.name = BNAllocString(id.name.c_str()); + lvid.type = id.type; + lvid.start = id.start; + lvid.end = id.end; + BNLinearViewObject* result = BNGetLinearViewObjectChildForIdentifier(m_object, &lvid); + BNFreeString(lvid.name); + if (result) + return new LinearViewObject(result); + return nullptr; +} + + +int LinearViewObject::CompareChildren(LinearViewObject* a, LinearViewObject* b) +{ + return BNCompareLinearViewObjectChildren(m_object, a->GetObject(), b->GetObject()); +} + + +vector<LinearDisassemblyLine> LinearViewObject::GetLines(LinearViewObject* prev, LinearViewObject* next) +{ + size_t count; + BNLinearDisassemblyLine* lines = BNGetLinearViewObjectLines(m_object, prev ? prev->GetObject() : nullptr, + next ? next->GetObject() : nullptr, &count); + + vector<LinearDisassemblyLine> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + LinearDisassemblyLine line; + line.type = lines[i].type; + 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.contents.addr = lines[i].contents.addr; + line.contents.instrIndex = lines[i].contents.instrIndex; + line.contents.highlight = lines[i].contents.highlight; + line.contents.tokens = InstructionTextToken::ConvertInstructionTextTokenList(lines[i].contents.tokens, lines[i].contents.count); + line.contents.tags = Tag::ConvertTagList(lines[i].contents.tags, lines[i].contents.tagCount); + result.push_back(line); + } + + BNFreeLinearDisassemblyLines(lines, count); + return result; +} + + +uint64_t LinearViewObject::GetStart() const +{ + return BNGetLinearViewObjectStart(m_object); +} + + +uint64_t LinearViewObject::GetEnd() const +{ + return BNGetLinearViewObjectEnd(m_object); +} + + +LinearViewObjectIdentifier LinearViewObject::GetIdentifier() const +{ + BNLinearViewObjectIdentifier id = BNGetLinearViewObjectIdentifier(m_object); + LinearViewObjectIdentifier result; + result.name = id.name; + result.type = id.type; + result.start = id.start; + result.end = id.end; + BNFreeLinearViewObjectIdentifier(&id); + return result; +} + + +uint64_t LinearViewObject::GetOrderingIndexTotal() const +{ + return BNGetLinearViewObjectOrderingIndexTotal(m_object); +} + + +uint64_t LinearViewObject::GetOrderingIndexForChild(LinearViewObject* obj) const +{ + return BNGetLinearViewObjectOrderingIndexForChild(m_object, obj->GetObject()); +} + + +Ref<LinearViewObject> LinearViewObject::GetChildForOrderingIndex(uint64_t idx) +{ + BNLinearViewObject* result = BNGetLinearViewObjectChildForOrderingIndex(m_object, idx); + if (result) + return new LinearViewObject(result); + return nullptr; +} + + +Ref<LinearViewObject> LinearViewObject::CreateDisassemblyByBlock(BinaryView* view, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewDisassemblyByBlock(view->GetObject(), + settings ? settings->GetObject() : nullptr)); +} |
