summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Palmisciano <jp@jonpalmisc.com>2021-07-29 17:14:57 -0400
committerJon Palmisciano <jp@jonpalmisc.com>2021-07-30 13:36:31 -0400
commit3e0c457f6067e3360e96b9dbae2665705221a2c5 (patch)
treec5b2e307f6861e8917735f6b8a13d9730e0bf093
parentea8f992f355a9152e0a77fa861d01f39081d9670 (diff)
DataRenderer: Create binding for `RenderLinesForData`
-rw-r--r--binaryninjaapi.h2
-rw-r--r--binaryninjacore.h3
-rw-r--r--datarenderer.cpp41
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());