Skip to content

Commit ded6f35

Browse files
committed
Fix for issue with custom display types
1 parent 4dbfe8a commit ded6f35

File tree

4 files changed

+37
-21
lines changed

4 files changed

+37
-21
lines changed

binaryninjaapi.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4714,9 +4714,9 @@ __attribute__ ((format (printf, 1, 2)))
47144714
class DataRenderer: public CoreRefCountObject<BNDataRenderer, BNNewDataRendererReference, BNFreeDataRenderer>
47154715
{
47164716
static bool IsValidForDataCallback(void* ctxt, BNBinaryView* data, uint64_t addr, BNType* type,
4717-
BNTypeContext** typeCtx, size_t ctxCount);
4717+
BNTypeContext* typeCtx, size_t ctxCount);
47184718
static BNDisassemblyTextLine* GetLinesForDataCallback(void* ctxt, BNBinaryView* data, uint64_t addr, BNType* type,
4719-
const BNInstructionTextToken* prefix, size_t prefixCount, size_t width, size_t* count, BNTypeContext** typeCxt,
4719+
const BNInstructionTextToken* prefix, size_t prefixCount, size_t width, size_t* count, BNTypeContext* typeCxt,
47204720
size_t ctxCount);
47214721
static void FreeCallback(void* ctxt);
47224722
public:

binaryninjacore.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1919,10 +1919,10 @@ extern "C"
19191919
{
19201920
void* context;
19211921
void (*freeObject)(void* ctxt);
1922-
bool (*isValidForData)(void* ctxt, BNBinaryView* view, uint64_t addr, BNType* type, BNTypeContext** typeCtx,
1922+
bool (*isValidForData)(void* ctxt, BNBinaryView* view, uint64_t addr, BNType* type, BNTypeContext* typeCtx,
19231923
size_t ctxCount);
19241924
BNDisassemblyTextLine* (*getLinesForData)(void* ctxt, BNBinaryView* view, uint64_t addr, BNType* type,
1925-
const BNInstructionTextToken* prefix, size_t prefixCount, size_t width, size_t* count, BNTypeContext** typeCtx,
1925+
const BNInstructionTextToken* prefix, size_t prefixCount, size_t width, size_t* count, BNTypeContext* typeCtx,
19261926
size_t ctxCount);
19271927
};
19281928

@@ -4197,10 +4197,10 @@ __attribute__ ((format (printf, 1, 2)))
41974197
BINARYNINJACOREAPI BNDataRenderer* BNCreateDataRenderer(BNCustomDataRenderer* renderer);
41984198
BINARYNINJACOREAPI BNDataRenderer* BNNewDataRendererReference(BNDataRenderer* renderer);
41994199
BINARYNINJACOREAPI bool BNIsValidForData(void* ctxt, BNBinaryView* view, uint64_t addr, BNType* type,
4200-
BNTypeContext** typeCtx, size_t ctxCount);
4200+
BNTypeContext* typeCtx, size_t ctxCount);
42014201
BINARYNINJACOREAPI BNDisassemblyTextLine* BNGetLinesForData(void* ctxt, BNBinaryView* view, uint64_t addr,
42024202
BNType* type, const BNInstructionTextToken* prefix, size_t prefixCount, size_t width, size_t* count,
4203-
BNTypeContext** typeCtx, size_t ctxCount);
4203+
BNTypeContext* typeCtx, size_t ctxCount);
42044204
BINARYNINJACOREAPI void BNFreeDataRenderer(BNDataRenderer* renderer);
42054205
BINARYNINJACOREAPI BNDataRendererContainer* BNGetDataRendererContainer();
42064206
BINARYNINJACOREAPI void BNRegisterGenericDataRenderer(BNDataRendererContainer* container, BNDataRenderer* renderer);

datarenderer.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,22 +38,22 @@ bool DataRenderer::IsStructOfTypeName(Type* type, const string& name, vector<pai
3838

3939

4040
bool DataRenderer::IsValidForDataCallback(void* ctxt, BNBinaryView* view, uint64_t addr, BNType* type,
41-
BNTypeContext** typeCtx, size_t ctxCount)
41+
BNTypeContext* typeCtx, size_t ctxCount)
4242
{
4343
DataRenderer* renderer = (DataRenderer*)ctxt;
4444
Ref<BinaryView> viewObj = new BinaryView(BNNewViewReference(view));
4545
Ref<Type> typeObj = new Type(BNNewTypeReference(type));
4646
vector<pair<Type*, size_t>> context;
4747
context.reserve(ctxCount);
4848
for (size_t i = 0; i < ctxCount; i++)
49-
context.push_back({new Type(BNNewTypeReference(typeCtx[i]->type)), typeCtx[i]->offset});
49+
context.push_back({new Type(BNNewTypeReference(typeCtx[i].type)), typeCtx[i].offset});
5050

5151
return renderer->IsValidForData(viewObj, addr, typeObj, context);
5252
}
5353

5454

5555
BNDisassemblyTextLine* DataRenderer::GetLinesForDataCallback(void* ctxt, BNBinaryView* view, uint64_t addr, BNType* type,
56-
const BNInstructionTextToken* prefix, size_t prefixCount, size_t width, size_t* count, BNTypeContext** typeCtx,
56+
const BNInstructionTextToken* prefix, size_t prefixCount, size_t width, size_t* count, BNTypeContext* typeCtx,
5757
size_t ctxCount)
5858
{
5959
DataRenderer* renderer = (DataRenderer*)ctxt;
@@ -64,7 +64,7 @@ BNDisassemblyTextLine* DataRenderer::GetLinesForDataCallback(void* ctxt, BNBinar
6464
vector<pair<Type*, size_t>> context;
6565
context.reserve(ctxCount);
6666
for (size_t i = 0; i < ctxCount; i++)
67-
context.push_back({new Type(BNNewTypeReference(typeCtx[i]->type)), typeCtx[i]->offset});
67+
context.push_back({new Type(BNNewTypeReference(typeCtx[i].type)), typeCtx[i].offset});
6868
auto lines = renderer->GetLinesForData(viewObj, addr, typeObj, prefixes, width, context);
6969
*count = lines.size();
7070
BNDisassemblyTextLine* buf = new BNDisassemblyTextLine[lines.size()];
@@ -91,11 +91,11 @@ void DataRenderer::FreeCallback(void* ctxt)
9191

9292
bool DataRenderer::IsValidForData(BinaryView* data, uint64_t addr, Type* type, vector<pair<Type*, size_t>>& context)
9393
{
94-
BNTypeContext** typeCtx = new BNTypeContext*[context.size()];
94+
BNTypeContext* typeCtx = new BNTypeContext[context.size()];
9595
for (size_t i = 0; i < context.size(); i++)
9696
{
97-
typeCtx[i]->type = context[i].first->GetObject();
98-
typeCtx[i]->offset = context[i].second;
97+
typeCtx[i].type = context[i].first->GetObject();
98+
typeCtx[i].offset = context[i].second;
9999
}
100100
bool result = BNIsValidForData(m_object, data->GetObject(), addr, type->GetObject(), typeCtx, context.size());
101101
delete[] typeCtx;
@@ -107,11 +107,11 @@ vector<DisassemblyTextLine> DataRenderer::GetLinesForData(BinaryView* data, uint
107107
const std::vector<InstructionTextToken>& prefix, size_t width, vector<pair<Type*, size_t>>& context)
108108
{
109109
BNInstructionTextToken* prefixes = InstructionTextToken::CreateInstructionTextTokenList(prefix);
110-
BNTypeContext** typeCtx = new BNTypeContext*[context.size()];
110+
BNTypeContext* typeCtx = new BNTypeContext[context.size()];
111111
for (size_t i = 0; i < context.size(); i++)
112112
{
113-
typeCtx[i]->type = context[i].first->GetObject();
114-
typeCtx[i]->offset = context[i].second;
113+
typeCtx[i].type = context[i].first->GetObject();
114+
typeCtx[i].offset = context[i].second;
115115
}
116116
size_t count = 0;
117117
BNDisassemblyTextLine* lines = BNGetLinesForData(m_object, data->GetObject(), addr, type->GetObject(), prefixes,

python/datarender.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,22 @@
3232
from binaryninja import types
3333
from binaryninja import highlight
3434

35+
36+
class TypeContext(object):
37+
def __init__(self, _type, _offset):
38+
self._type = _type
39+
self._offset = _offset
40+
41+
@property
42+
def type(self):
43+
"""The Type object for the current context record"""
44+
return self._type
45+
46+
@property
47+
def offset(self):
48+
"""The offset into the given type object"""
49+
return self._offset
50+
3551
class DataRenderer(object):
3652
"""
3753
DataRenderer objects tell the Linear View how to render specific types.
@@ -61,7 +77,7 @@ def perform_get_lines_for_data(self, ctxt, view, addr, type, prefix, width, cont
6177
return [DisassemblyTextLine(prefix, addr)]
6278
def __del__(self):
6379
pass
64-
80+
6581
BarDataRenderer().register_type_specific()
6682
6783
Note that the formatting is sub-optimal to work around an issue with Sphinx and reStructured text
@@ -79,8 +95,8 @@ def __init__(self, context=None):
7995
@classmethod
8096
def is_type_of_struct_name(cls, type, name, context):
8197
return (type.type_class == enums.TypeClass.StructureTypeClass and len(context) > 0
82-
and context[-1].type_class == enums.TypeClass.NamedTypeReferenceClass and
83-
context[-1].named_type_reference.name == name)
98+
and context[-1].type.type_class == enums.TypeClass.NamedTypeReferenceClass and
99+
context[-1].type.named_type_reference.name == name)
84100

85101
def register_type_specific(self):
86102
core.BNRegisterTypeSpecificDataRenderer(core.BNGetDataRendererContainer(), self.handle)
@@ -103,7 +119,7 @@ def _is_valid_for_data(self, ctxt, view, addr, type, context, ctxCount):
103119
type = types.Type(handle=core.BNNewTypeReference(type))
104120
pycontext = []
105121
for i in range(0, ctxCount):
106-
pycontext.append(types.Type(core.BNNewTypeReference(context[i])))
122+
pycontext.append(TypeContext(types.Type(core.BNNewTypeReference(context[i].type)), context[i].offset))
107123
return self.perform_is_valid_for_data(ctxt, view, addr, type, pycontext)
108124
except:
109125
log.log_error(traceback.format_exc())
@@ -118,7 +134,7 @@ def _get_lines_for_data(self, ctxt, view, addr, type, prefix, prefixCount, width
118134
prefixTokens = function.InstructionTextToken.get_instruction_lines(prefix, prefixCount)
119135
pycontext = []
120136
for i in range(ctxCount):
121-
pycontext.append(types.Type(core.BNNewTypeReference(typeCtx[i])))
137+
pycontext.append(TypeContext(types.Type(core.BNNewTypeReference(typeCtx[i].type)), typeCtx[i].offset))
122138

123139
result = self.perform_get_lines_for_data(ctxt, view, addr, type, prefixTokens, width, pycontext)
124140

0 commit comments

Comments
 (0)