@@ -58,10 +58,83 @@ static void FreeMemoryInfoArray(BNFirmwareNinjaFunctionMemoryAccesses** fma, siz
58
58
}
59
59
60
60
61
+ FirmwareNinjaReferenceNode::FirmwareNinjaReferenceNode (BNFirmwareNinjaReferenceNode* node)
62
+ {
63
+ m_object = node;
64
+ }
65
+
66
+
67
+ FirmwareNinjaReferenceNode::~FirmwareNinjaReferenceNode ()
68
+ {
69
+ BNFreeFirmwareNinjaReferenceNode (m_object);
70
+ }
71
+
72
+
73
+ bool FirmwareNinjaReferenceNode::IsFunction ()
74
+ {
75
+ return BNFirmwareNinjaReferenceNodeIsFunction (m_object);
76
+ }
77
+
78
+
79
+ bool FirmwareNinjaReferenceNode::IsDataVariable ()
80
+ {
81
+ return BNFirmwareNinjaReferenceNodeIsDataVariable (m_object);
82
+ }
83
+
84
+
85
+ bool FirmwareNinjaReferenceNode::HasChildren ()
86
+ {
87
+ return BNFirmwareNinjaReferenceNodeHasChildren (m_object);
88
+ }
89
+
90
+
91
+ bool FirmwareNinjaReferenceNode::GetFunction (Ref<Function>& function)
92
+ {
93
+ auto bnFunction = BNFirmwareNinjaReferenceNodeGetFunction (m_object);
94
+ if (!bnFunction)
95
+ return false ;
96
+
97
+ function = new Function (BNNewFunctionReference (bnFunction));
98
+ return true ;
99
+ }
100
+
101
+
102
+ bool FirmwareNinjaReferenceNode::GetDataVariable (DataVariable& variable)
103
+ {
104
+ auto bnVariable = BNFirmwareNinjaReferenceNodeGetDataVariable (m_object);
105
+ if (!bnVariable)
106
+ return false ;
107
+
108
+ variable.address = bnVariable->address ;
109
+ variable.type = Confidence (new Type (BNNewTypeReference (bnVariable->type )), bnVariable->typeConfidence );
110
+ variable.autoDiscovered = bnVariable->autoDiscovered ;
111
+ BNFreeDataVariable (bnVariable);
112
+ return true ;
113
+ }
114
+
115
+
116
+ std::vector<Ref<FirmwareNinjaReferenceNode>> FirmwareNinjaReferenceNode::GetChildren ()
117
+ {
118
+ std::vector<Ref<FirmwareNinjaReferenceNode>> result;
119
+ size_t count = 0 ;
120
+ auto bnChildren = BNFirmwareNinjaReferenceNodeGetChildren (m_object, &count);
121
+ result.reserve (count);
122
+ for (size_t i = 0 ; i < count; ++i)
123
+ {
124
+ result.push_back (new FirmwareNinjaReferenceNode (
125
+ BNNewFirmwareNinjaReferenceNodeReference (bnChildren[i])));
126
+ }
127
+
128
+ if (count)
129
+ BNFreeFirmwareNinjaReferenceNodes (bnChildren, count);
130
+ return result;
131
+ }
132
+
133
+
61
134
FirmwareNinja::FirmwareNinja (Ref<BinaryView> view)
62
135
{
63
136
m_view = view;
64
- m_object = BNCreateFirmwareNinja (view->GetObject ());
137
+ m_object = BNCreateFirmwareNinja (view->GetObject ());
65
138
}
66
139
67
140
@@ -218,6 +291,9 @@ std::vector<FirmwareNinjaFunctionMemoryAccesses> FirmwareNinja::GetFunctionMemor
218
291
219
292
void FirmwareNinja::StoreFunctionMemoryAccesses (const std::vector<FirmwareNinjaFunctionMemoryAccesses>& fma)
220
293
{
294
+ if (fma.empty ())
295
+ return ;
296
+
221
297
BNFirmwareNinjaFunctionMemoryAccesses** fmaArray = MemoryInfoVectorToArray (fma);
222
298
BNFirmwareNinjaStoreFunctionMemoryAccessesToMetadata (m_object, fmaArray, fma.size ());
223
299
FreeMemoryInfoArray (fmaArray, fma.size ());
@@ -262,6 +338,9 @@ std::vector<FirmwareNinjaDeviceAccesses> FirmwareNinja::GetBoardDeviceAccesses(
262
338
const std::vector<FirmwareNinjaFunctionMemoryAccesses>& fma)
263
339
{
264
340
std::vector<FirmwareNinjaDeviceAccesses> result;
341
+ if (fma.empty ())
342
+ return result;
343
+
265
344
auto platform = m_view->GetDefaultPlatform ();
266
345
if (!platform)
267
346
return result;
@@ -273,11 +352,9 @@ std::vector<FirmwareNinjaDeviceAccesses> FirmwareNinja::GetBoardDeviceAccesses(
273
352
BNFirmwareNinjaFunctionMemoryAccesses** fmaArray = MemoryInfoVectorToArray (fma);
274
353
BNFirmwareNinjaDeviceAccesses* accesses;
275
354
int count = BNFirmwareNinjaGetBoardDeviceAccesses (m_object, fmaArray, fma.size (), &accesses, arch->GetObject ());
355
+ FreeMemoryInfoArray (fmaArray, fma.size ());
276
356
if (count <= 0 )
277
- {
278
- FreeMemoryInfoArray (fmaArray, fma.size ());
279
357
return result;
280
- }
281
358
282
359
result.reserve (count);
283
360
for (size_t i = 0 ; i < count; i++)
@@ -290,3 +367,56 @@ std::vector<FirmwareNinjaDeviceAccesses> FirmwareNinja::GetBoardDeviceAccesses(
290
367
291
368
return result;
292
369
}
370
+
371
+
372
+ Ref<FirmwareNinjaReferenceNode> FirmwareNinja::GetReferenceTree (
373
+ FirmwareNinjaDevice& device, const std::vector<FirmwareNinjaFunctionMemoryAccesses>& fma, uint64_t * value)
374
+ {
375
+ BNFirmwareNinjaFunctionMemoryAccesses** fmaArray = nullptr ;
376
+ if (!fma.empty ())
377
+ fmaArray = MemoryInfoVectorToArray (fma);
378
+
379
+ auto bnReferenceTree = BNFirmwareNinjaGetMemoryRegionReferenceTree (
380
+ m_object, device.start , device.end , fmaArray, fma.size (), value);
381
+
382
+ FreeMemoryInfoArray (fmaArray, fma.size ());
383
+ if (!bnReferenceTree)
384
+ return nullptr ;
385
+
386
+ return new FirmwareNinjaReferenceNode (bnReferenceTree);
387
+ }
388
+
389
+
390
+ Ref<FirmwareNinjaReferenceNode> FirmwareNinja::GetReferenceTree (
391
+ Section& section, const std::vector<FirmwareNinjaFunctionMemoryAccesses>& fma, uint64_t * value)
392
+ {
393
+ BNFirmwareNinjaFunctionMemoryAccesses** fmaArray = nullptr ;
394
+ if (!fma.empty ())
395
+ fmaArray = MemoryInfoVectorToArray (fma);
396
+
397
+ auto bnReferenceTree = BNFirmwareNinjaGetMemoryRegionReferenceTree (
398
+ m_object, section.GetStart (), section.GetStart () + section.GetLength (), fmaArray, fma.size (), value);
399
+
400
+ FreeMemoryInfoArray (fmaArray, fma.size ());
401
+ if (!bnReferenceTree)
402
+ return nullptr ;
403
+
404
+ return new FirmwareNinjaReferenceNode (bnReferenceTree);
405
+ }
406
+
407
+
408
+ Ref<FirmwareNinjaReferenceNode> FirmwareNinja::GetReferenceTree (
409
+ uint64_t address, const std::vector<FirmwareNinjaFunctionMemoryAccesses>& fma, uint64_t * value)
410
+ {
411
+ BNFirmwareNinjaFunctionMemoryAccesses** fmaArray = nullptr ;
412
+ if (!fma.empty ())
413
+ fmaArray = MemoryInfoVectorToArray (fma);
414
+
415
+ auto bnReferenceTree = BNFirmwareNinjaGetAddressReferenceTree (m_object, address, fmaArray, fma.size (), value);
416
+
417
+ FreeMemoryInfoArray (fmaArray, fma.size ());
418
+ if (!bnReferenceTree)
419
+ return nullptr ;
420
+
421
+ return new FirmwareNinjaReferenceNode (bnReferenceTree);
422
+ }
0 commit comments