Skip to content

Commit 1474219

Browse files
committed
LinearDisassemblyLine: Add field for BinaryView
1 parent 714af09 commit 1474219

10 files changed

Lines changed: 51 additions & 11 deletions

binaryninjaapi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5100,6 +5100,7 @@ namespace BinaryNinja {
51005100
struct LinearDisassemblyLine
51015101
{
51025102
BNLinearDisassemblyLineType type;
5103+
Ref<BinaryView> view;
51035104
Ref<Function> function;
51045105
Ref<BasicBlock> block;
51055106
DisassemblyTextLine contents;

binaryninjacore.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2577,6 +2577,7 @@ extern "C"
25772577
typedef struct BNLinearDisassemblyLine
25782578
{
25792579
BNLinearDisassemblyLineType type;
2580+
BNBinaryView* view;
25802581
BNFunction* function;
25812582
BNBasicBlock* block;
25822583
BNDisassemblyTextLine contents;

linearviewobject.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ BNLinearDisassemblyLine LinearDisassemblyLine::GetAPIObject() const
2828
{
2929
BNLinearDisassemblyLine result;
3030
result.type = this->type;
31+
Ref<BinaryView> binaryView = this->view;
32+
if (!binaryView && this->function)
33+
binaryView = this->function->GetView();
34+
result.view = binaryView ? BNNewViewReference(binaryView->GetObject()) : nullptr;
3135
result.function = this->function ? BNNewFunctionReference(this->function->GetObject()) : nullptr;
3236
result.block = this->block ? BNNewBasicBlockReference(this->block->GetObject()) : nullptr;
3337
result.contents = this->contents.GetAPIObject();
@@ -39,6 +43,7 @@ LinearDisassemblyLine LinearDisassemblyLine::FromAPIObject(const BNLinearDisasse
3943
{
4044
LinearDisassemblyLine result;
4145
result.type = line->type;
46+
result.view = line->view ? new BinaryView(BNNewViewReference(line->view)) : nullptr;
4247
result.function = line->function ? new Function(BNNewFunctionReference(line->function)) : nullptr;
4348
result.block = line->block ? new BasicBlock(BNNewBasicBlockReference(line->block)) : nullptr;
4449
result.contents = DisassemblyTextLine::FromAPIObject(&line->contents);
@@ -48,6 +53,8 @@ LinearDisassemblyLine LinearDisassemblyLine::FromAPIObject(const BNLinearDisasse
4853

4954
void LinearDisassemblyLine::FreeAPIObject(BNLinearDisassemblyLine* line)
5055
{
56+
if (line->view)
57+
BNFreeBinaryView(line->view);
5158
if (line->function)
5259
BNFreeFunction(line->function);
5360
if (line->block)

python/examples/linear_mlil.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,19 @@ def generateLines(self):
5353
result.append(
5454
LinearDisassemblyLine(
5555
LinearDisassemblyLineType.FunctionHeaderStartLineType, self.function, None,
56-
DisassemblyTextLine([], self.function.start)
56+
DisassemblyTextLine([], self.function.start), self.data
5757
)
5858
)
5959
result.append(
6060
LinearDisassemblyLine(
6161
LinearDisassemblyLineType.FunctionHeaderLineType, self.function, None,
62-
DisassemblyTextLine(self.function.type_tokens, self.function.start)
62+
DisassemblyTextLine(self.function.type_tokens, self.function.start), self.data
6363
)
6464
)
6565
result.append(
6666
LinearDisassemblyLine(
6767
LinearDisassemblyLineType.FunctionHeaderEndLineType, self.function, None,
68-
DisassemblyTextLine([], self.function.start)
68+
DisassemblyTextLine([], self.function.start), self.data
6969
)
7070
)
7171

@@ -78,7 +78,7 @@ def generateLines(self):
7878
# Blank line between basic blocks
7979
result.append(
8080
LinearDisassemblyLine(
81-
LinearDisassemblyLineType.CodeDisassemblyLineType, self.function, block, DisassemblyTextLine([], lastAddr)
81+
LinearDisassemblyLineType.CodeDisassemblyLineType, self.function, block, DisassemblyTextLine([], lastAddr), self.data
8282
)
8383
)
8484
for i in block:
@@ -87,14 +87,14 @@ def generateLines(self):
8787
lineIndex = 0
8888
for line in lines:
8989
result.append(
90-
LinearDisassemblyLine(LinearDisassemblyLineType.CodeDisassemblyLineType, self.function, block, line[0])
90+
LinearDisassemblyLine(LinearDisassemblyLineType.CodeDisassemblyLineType, self.function, block, line[0], self.data)
9191
)
9292
lineIndex += 1
9393
lastBlock = block
9494

9595
result.append(
9696
LinearDisassemblyLine(
97-
LinearDisassemblyLineType.FunctionEndLineType, self.function, lastBlock, DisassemblyTextLine([], lastAddr)
97+
LinearDisassemblyLineType.FunctionEndLineType, self.function, lastBlock, DisassemblyTextLine([], lastAddr), self.data
9898
)
9999
)
100100

python/examples/newline_render_layer.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,8 @@ def apply_to_high_level_il_body(
178178
line.type,
179179
line.function,
180180
line.block,
181-
first_contents
181+
first_contents,
182+
line.view
182183
)
183184
new_lines.append(first_line)
184185

@@ -200,7 +201,8 @@ def apply_to_high_level_il_body(
200201
line.type,
201202
line.function,
202203
line.block,
203-
cont_contents
204+
cont_contents,
205+
line.view
204206
)
205207

206208
new_lines.append(cont_line)

python/lineardisassembly.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,11 @@
3131

3232

3333
class LinearDisassemblyLine:
34-
def __init__(self, line_type: LinearDisassemblyLineType, func: Optional[_function.Function], block: Optional[basicblock.BasicBlock], contents: _function.DisassemblyTextLine):
34+
def __init__(self, line_type: LinearDisassemblyLineType, func: Optional[_function.Function], block: Optional[basicblock.BasicBlock], contents: _function.DisassemblyTextLine, view: Optional['binaryview.BinaryView'] = None):
3535
self.type = line_type
36+
if view is None and func is not None:
37+
view = func.view
38+
self.view = view
3639
self.function = func
3740
self.block = block
3841
self.contents = contents
@@ -45,6 +48,9 @@ def __str__(self):
4548

4649
@classmethod
4750
def _from_core_struct(cls, struct: core.BNLinearDisassemblyLine, obj: Optional['LinearViewObject'] = None) -> 'LinearDisassemblyLine':
51+
view = None
52+
if struct.view:
53+
view = binaryview.BinaryView(handle=core.BNNewViewReference(struct.view))
4854
function = None
4955
if struct.function:
5056
function = _function.Function(handle=core.BNNewFunctionReference(struct.function))
@@ -66,11 +72,14 @@ def _from_core_struct(cls, struct: core.BNLinearDisassemblyLine, obj: Optional['
6672
il_func = function.hlil
6773

6874
contents = _function.DisassemblyTextLine._from_core_struct(struct.contents, il_func)
69-
return LinearDisassemblyLine(LinearDisassemblyLineType(struct.type), function, block, contents)
75+
return LinearDisassemblyLine(LinearDisassemblyLineType(struct.type), function, block, contents, view)
7076

7177
def _to_core_struct(self) -> core.BNLinearDisassemblyLine:
7278
result = core.BNLinearDisassemblyLine()
7379
result.type = self.type
80+
result.view = None
81+
if self.view is not None:
82+
result.view = self.view.handle
7483
result.function = None
7584
if self.function is not None:
7685
result.function = self.function.handle

python/renderlayer.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,13 +380,15 @@ def process_disasm():
380380
disasm_lines = self.apply_to_block(last_block, disasm_lines)
381381
func = block_lines[0].function
382382
block = block_lines[0].block
383+
view = block_lines[0].view
383384
for block_line in disasm_lines:
384385
new_block_lines.append(
385386
LinearDisassemblyLine(
386387
LinearDisassemblyLineType.CodeDisassemblyLineType,
387388
func,
388389
block,
389-
block_line
390+
block_line,
391+
view
390392
)
391393
)
392394
disasm_lines = []

renderlayer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,11 +215,13 @@ void RenderLayer::ApplyToLinearViewObject(
215215
if (!disasmLines.empty())
216216
{
217217
ApplyToBlock(lastBlock, disasmLines);
218+
Ref<BinaryView> view = blockLines[0].view;
218219
Ref<Function> func = blockLines[0].function;
219220
Ref<BasicBlock> block = blockLines[0].block;
220221
for (auto& blockLine: disasmLines)
221222
{
222223
LinearDisassemblyLine newLine;
224+
newLine.view = view;
223225
newLine.type = CodeDisassemblyLineType;
224226
newLine.function = func;
225227
newLine.block = block;

rust/src/linear_view.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,13 +426,19 @@ unsafe impl Sync for LinearViewCursor {}
426426
#[derive(Clone, PartialEq, Debug, Eq)]
427427
pub struct LinearDisassemblyLine {
428428
pub ty: LinearDisassemblyLineType,
429+
pub view: Option<Ref<BinaryView>>,
429430
pub function: Option<Ref<Function>>,
430431
pub basic_block: Option<Ref<BasicBlock<NativeBlock>>>,
431432
pub contents: DisassemblyTextLine,
432433
}
433434

434435
impl LinearDisassemblyLine {
435436
pub(crate) unsafe fn from_raw(value: &BNLinearDisassemblyLine) -> Self {
437+
let view = if !value.view.is_null() {
438+
Some(unsafe { BinaryView::from_raw(value.view).to_owned() })
439+
} else {
440+
None
441+
};
436442
let function = if !value.function.is_null() {
437443
Some(unsafe { Function::from_raw(value.function).to_owned() })
438444
} else {
@@ -445,6 +451,7 @@ impl LinearDisassemblyLine {
445451
};
446452
Self {
447453
ty: value.type_,
454+
view,
448455
function,
449456
basic_block,
450457
contents: DisassemblyTextLine::from_raw(&value.contents),
@@ -459,6 +466,10 @@ impl LinearDisassemblyLine {
459466
}
460467

461468
pub(crate) fn into_raw(value: Self) -> BNLinearDisassemblyLine {
469+
let view_ptr = value
470+
.view
471+
.map(|v| unsafe { Ref::into_raw(v) }.handle)
472+
.unwrap_or(std::ptr::null_mut());
462473
let function_ptr = value
463474
.function
464475
.map(|f| unsafe { Ref::into_raw(f) }.handle)
@@ -469,13 +480,17 @@ impl LinearDisassemblyLine {
469480
.unwrap_or(std::ptr::null_mut());
470481
BNLinearDisassemblyLine {
471482
type_: value.ty,
483+
view: view_ptr,
472484
function: function_ptr,
473485
block: block_ptr,
474486
contents: DisassemblyTextLine::into_raw(value.contents),
475487
}
476488
}
477489

478490
pub(crate) fn free_raw(value: BNLinearDisassemblyLine) {
491+
if !value.view.is_null() {
492+
let _ = unsafe { BinaryView::ref_from_raw(value.view) };
493+
}
479494
if !value.function.is_null() {
480495
let _ = unsafe { Function::ref_from_raw(value.function) };
481496
}

rust/src/render_layer.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ pub trait RenderLayer: Sized {
9999
|function: &Function, block: &BasicBlock<NativeBlock>, text: DisassemblyTextLine| {
100100
LinearDisassemblyLine {
101101
ty: LinearDisassemblyLineType::CodeDisassemblyLineType,
102+
view: Some(function.view()),
102103
function: Some(function.to_owned()),
103104
basic_block: Some(block.to_owned()),
104105
contents: text,

0 commit comments

Comments
 (0)