@@ -58,10 +58,83 @@ static void FreeMemoryInfoArray(BNFirmwareNinjaFunctionMemoryAccesses** fma, siz
5858}
5959
6060
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+
61134FirmwareNinja::FirmwareNinja (Ref<BinaryView> view)
62135{
63136 m_view = view;
64- m_object = BNCreateFirmwareNinja (view->GetObject ());
137+ m_object = BNCreateFirmwareNinja (view->GetObject ());
65138}
66139
67140
@@ -218,6 +291,9 @@ std::vector<FirmwareNinjaFunctionMemoryAccesses> FirmwareNinja::GetFunctionMemor
218291
219292void FirmwareNinja::StoreFunctionMemoryAccesses (const std::vector<FirmwareNinjaFunctionMemoryAccesses>& fma)
220293{
294+ if (fma.empty ())
295+ return ;
296+
221297 BNFirmwareNinjaFunctionMemoryAccesses** fmaArray = MemoryInfoVectorToArray (fma);
222298 BNFirmwareNinjaStoreFunctionMemoryAccessesToMetadata (m_object, fmaArray, fma.size ());
223299 FreeMemoryInfoArray (fmaArray, fma.size ());
@@ -262,6 +338,9 @@ std::vector<FirmwareNinjaDeviceAccesses> FirmwareNinja::GetBoardDeviceAccesses(
262338 const std::vector<FirmwareNinjaFunctionMemoryAccesses>& fma)
263339{
264340 std::vector<FirmwareNinjaDeviceAccesses> result;
341+ if (fma.empty ())
342+ return result;
343+
265344 auto platform = m_view->GetDefaultPlatform ();
266345 if (!platform)
267346 return result;
@@ -273,11 +352,9 @@ std::vector<FirmwareNinjaDeviceAccesses> FirmwareNinja::GetBoardDeviceAccesses(
273352 BNFirmwareNinjaFunctionMemoryAccesses** fmaArray = MemoryInfoVectorToArray (fma);
274353 BNFirmwareNinjaDeviceAccesses* accesses;
275354 int count = BNFirmwareNinjaGetBoardDeviceAccesses (m_object, fmaArray, fma.size (), &accesses, arch->GetObject ());
355+ FreeMemoryInfoArray (fmaArray, fma.size ());
276356 if (count <= 0 )
277- {
278- FreeMemoryInfoArray (fmaArray, fma.size ());
279357 return result;
280- }
281358
282359 result.reserve (count);
283360 for (size_t i = 0 ; i < count; i++)
@@ -290,3 +367,56 @@ std::vector<FirmwareNinjaDeviceAccesses> FirmwareNinja::GetBoardDeviceAccesses(
290367
291368 return result;
292369}
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