diff options
| author | Jon Palmisciano <jp@jonpalmisc.com> | 2021-07-29 17:14:57 -0400 |
|---|---|---|
| committer | Jon Palmisciano <jp@jonpalmisc.com> | 2021-07-30 13:36:31 -0400 |
| commit | 3e0c457f6067e3360e96b9dbae2665705221a2c5 (patch) | |
| tree | c5b2e307f6861e8917735f6b8a13d9730e0bf093 | |
| parent | ea8f992f355a9152e0a77fa861d01f39081d9670 (diff) | |
DataRenderer: Create binding for `RenderLinesForData`
| -rw-r--r-- | binaryninjaapi.h | 2 | ||||
| -rw-r--r-- | binaryninjacore.h | 3 | ||||
| -rw-r--r-- | datarenderer.cpp | 41 |
3 files changed, 46 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 3f4b5b3c..62dd4a28 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -5606,6 +5606,8 @@ __attribute__ ((format (printf, 1, 2))) virtual bool IsValidForData(BinaryView* data, uint64_t addr, Type* type, std::vector<std::pair<Type*, size_t>>& context); virtual std::vector<DisassemblyTextLine> GetLinesForData(BinaryView* data, uint64_t addr, Type* type, const std::vector<InstructionTextToken>& prefix, size_t width, std::vector<std::pair<Type*, size_t>>& context); + std::vector<DisassemblyTextLine> RenderLinesForData(BinaryView* data, uint64_t addr, Type* type, + const std::vector<InstructionTextToken>& prefix, size_t width, std::vector<std::pair<Type*, size_t>>& context); static bool IsStructOfTypeName(Type* type, const QualifiedName& name, std::vector<std::pair<Type*, size_t>>& context); static bool IsStructOfTypeName(Type* type, const std::string& name, std::vector<std::pair<Type*, size_t>>& context); diff --git a/binaryninjacore.h b/binaryninjacore.h index d4e85e47..b12da5e2 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -5327,6 +5327,9 @@ __attribute__ ((format (printf, 1, 2))) BINARYNINJACOREAPI BNDisassemblyTextLine* BNGetLinesForData(void* ctxt, BNBinaryView* view, uint64_t addr, BNType* type, const BNInstructionTextToken* prefix, size_t prefixCount, size_t width, size_t* count, BNTypeContext* typeCtx, size_t ctxCount); + BINARYNINJACOREAPI BNDisassemblyTextLine* BNRenderLinesForData(BNBinaryView* data, uint64_t addr, BNType* type, + const BNInstructionTextToken* prefix, size_t prefixCount, size_t width, size_t* count, BNTypeContext* typeCtx, + size_t ctxCount); BINARYNINJACOREAPI void BNFreeDataRenderer(BNDataRenderer* renderer); BINARYNINJACOREAPI BNDataRendererContainer* BNGetDataRendererContainer(); BINARYNINJACOREAPI void BNRegisterGenericDataRenderer(BNDataRendererContainer* container, BNDataRenderer* renderer); diff --git a/datarenderer.cpp b/datarenderer.cpp index 18cc8d31..4d3b38ae 100644 --- a/datarenderer.cpp +++ b/datarenderer.cpp @@ -143,6 +143,47 @@ vector<DisassemblyTextLine> DataRenderer::GetLinesForData(BinaryView* data, uint } +vector<DisassemblyTextLine> DataRenderer::RenderLinesForData(BinaryView* data, uint64_t addr, Type* type, + const std::vector<InstructionTextToken>& prefix, size_t width, vector<pair<Type*, size_t>>& context) +{ + BNInstructionTextToken* prefixes = InstructionTextToken::CreateInstructionTextTokenList(prefix); + BNTypeContext* typeCtx = new BNTypeContext[context.size()]; + for (size_t i = 0; i < context.size(); i++) + { + typeCtx[i].type = context[i].first->GetObject(); + typeCtx[i].offset = context[i].second; + } + size_t count = 0; + BNDisassemblyTextLine* lines = BNRenderLinesForData(data->GetObject(), addr, type->GetObject(), prefixes, + prefix.size(), width, &count, typeCtx, context.size()); + + delete[] typeCtx; + for (size_t i = 0; i < prefix.size(); i++) + { + BNFreeString(prefixes[i].text); + for (size_t j = 0; j < prefixes[j].namesCount; j++) + BNFreeString(prefixes[i].typeNames[j]); + delete[] prefixes[i].typeNames; + } + delete[] prefixes; + + vector<DisassemblyTextLine> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + DisassemblyTextLine line; + line.addr = lines[i].addr; + line.instrIndex = lines[i].instrIndex; + line.highlight = lines[i].highlight; + line.tokens = InstructionTextToken::ConvertAndFreeInstructionTextTokenList(lines[i].tokens, lines[i].count); + line.tags = Tag::ConvertAndFreeTagList(lines[i].tags, lines[i].tagCount); + result.push_back(line); + } + + return result; +} + + void DataRendererContainer::RegisterGenericDataRenderer(DataRenderer* renderer) { BNRegisterGenericDataRenderer(BNGetDataRendererContainer(), renderer->GetObject()); |
