diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2025-07-14 22:14:21 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2025-07-15 13:55:34 -0400 |
| commit | c41b80eae54efed5cef8f9ebb32f9a7177e9fe72 (patch) | |
| tree | e7ff79b5e4d38c8f52b791a8b1c3a6093813525a /binaryview.cpp | |
| parent | 6894a946b1fa5ad24e64d24bb7f606bae14c300a (diff) | |
Add the ability to limit the number of results in the cross reference APIs
Diffstat (limited to 'binaryview.cpp')
| -rw-r--r-- | binaryview.cpp | 124 |
1 files changed, 102 insertions, 22 deletions
diff --git a/binaryview.cpp b/binaryview.cpp index 665228c1..21266886 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -2423,7 +2423,7 @@ vector<Ref<BasicBlock>> BinaryView::GetBasicBlocksStartingAtAddress(uint64_t add vector<ReferenceSource> BinaryView::GetCodeReferences(uint64_t addr) { size_t count; - BNReferenceSource* refs = BNGetCodeReferences(m_object, addr, &count); + BNReferenceSource* refs = BNGetCodeReferences(m_object, addr, &count, false, 0); vector<ReferenceSource> result; result.reserve(count); @@ -2444,7 +2444,51 @@ vector<ReferenceSource> BinaryView::GetCodeReferences(uint64_t addr) vector<ReferenceSource> BinaryView::GetCodeReferences(uint64_t addr, uint64_t len) { size_t count; - BNReferenceSource* refs = BNGetCodeReferencesInRange(m_object, addr, len, &count); + BNReferenceSource* refs = BNGetCodeReferencesInRange(m_object, addr, len, &count, false, 0); + + vector<ReferenceSource> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + ReferenceSource src; + src.func = new Function(BNNewFunctionReference(refs[i].func)); + src.arch = new CoreArchitecture(refs[i].arch); + src.addr = refs[i].addr; + result.push_back(src); + } + + BNFreeCodeReferences(refs, count); + return result; +} + + +vector<ReferenceSource> BinaryView::GetCodeReferencesWithLimit(uint64_t addr, std::optional<size_t> maxItems) +{ + size_t count; + BNReferenceSource* refs = BNGetCodeReferences(m_object, addr, &count, maxItems.has_value(), maxItems.value_or(0)); + + vector<ReferenceSource> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + ReferenceSource src; + src.func = new Function(BNNewFunctionReference(refs[i].func)); + src.arch = new CoreArchitecture(refs[i].arch); + src.addr = refs[i].addr; + result.push_back(src); + } + + BNFreeCodeReferences(refs, count); + return result; +} + + +vector<ReferenceSource> BinaryView::GetCodeReferencesInRangeWithLimit( + uint64_t addr, uint64_t len, std::optional<size_t> maxItems) +{ + size_t count; + BNReferenceSource* refs = + BNGetCodeReferencesInRange(m_object, addr, len, &count, maxItems.has_value(), maxItems.value_or(0)); vector<ReferenceSource> result; result.reserve(count); @@ -2487,7 +2531,7 @@ vector<uint64_t> BinaryView::GetCodeReferencesFrom(ReferenceSource src, uint64_t vector<uint64_t> BinaryView::GetDataReferences(uint64_t addr) { size_t count; - uint64_t* refs = BNGetDataReferences(m_object, addr, &count); + uint64_t* refs = BNGetDataReferences(m_object, addr, &count, false, 0); vector<uint64_t> result(refs, &refs[count]); BNFreeDataReferences(refs); return result; @@ -2497,7 +2541,29 @@ vector<uint64_t> BinaryView::GetDataReferences(uint64_t addr) vector<uint64_t> BinaryView::GetDataReferences(uint64_t addr, uint64_t len) { size_t count; - uint64_t* refs = BNGetDataReferencesInRange(m_object, addr, len, &count); + uint64_t* refs = BNGetDataReferencesInRange(m_object, addr, len, &count, false, 0); + vector<uint64_t> result(refs, &refs[count]); + BNFreeDataReferences(refs); + return result; +} + + +vector<uint64_t> BinaryView::GetDataReferencesWithLimit(uint64_t addr, std::optional<size_t> maxItems) +{ + size_t count; + uint64_t* refs = BNGetDataReferences(m_object, addr, &count, maxItems.has_value(), maxItems.value_or(0)); + vector<uint64_t> result(refs, &refs[count]); + BNFreeDataReferences(refs); + return result; +} + + +vector<uint64_t> BinaryView::GetDataReferencesInRangeWithLimit( + uint64_t addr, uint64_t len, std::optional<size_t> maxItems) +{ + size_t count; + uint64_t* refs = + BNGetDataReferencesInRange(m_object, addr, len, &count, maxItems.has_value(), maxItems.value_or(0)); vector<uint64_t> result(refs, &refs[count]); BNFreeDataReferences(refs); return result; @@ -2548,12 +2614,13 @@ void BinaryView::RemoveUserDataReference(uint64_t fromAddr, uint64_t toAddr) } -vector<ReferenceSource> BinaryView::GetCodeReferencesForType(const QualifiedName& type) +vector<ReferenceSource> BinaryView::GetCodeReferencesForType(const QualifiedName& type, std::optional<size_t> maxItems) { size_t count; BNQualifiedName nameObj = type.GetAPIObject(); - BNReferenceSource* refs = BNGetCodeReferencesForType(m_object, &nameObj, &count); + BNReferenceSource* refs = + BNGetCodeReferencesForType(m_object, &nameObj, &count, maxItems.has_value(), maxItems.value_or(0)); QualifiedName::FreeAPIObject(&nameObj); vector<ReferenceSource> result; @@ -2572,11 +2639,11 @@ vector<ReferenceSource> BinaryView::GetCodeReferencesForType(const QualifiedName } -vector<uint64_t> BinaryView::GetDataReferencesForType(const QualifiedName& type) +vector<uint64_t> BinaryView::GetDataReferencesForType(const QualifiedName& type, std::optional<size_t> maxItems) { size_t count; BNQualifiedName nameObj = type.GetAPIObject(); - uint64_t* refs = BNGetDataReferencesForType(m_object, &nameObj, &count); + uint64_t* refs = BNGetDataReferencesForType(m_object, &nameObj, &count, maxItems.has_value(), maxItems.value_or(0)); QualifiedName::FreeAPIObject(&nameObj); vector<uint64_t> result(refs, &refs[count]); @@ -2585,12 +2652,14 @@ vector<uint64_t> BinaryView::GetDataReferencesForType(const QualifiedName& type) } -vector<TypeReferenceSource> BinaryView::GetTypeReferencesForType(const QualifiedName& type) +vector<TypeReferenceSource> BinaryView::GetTypeReferencesForType( + const QualifiedName& type, std::optional<size_t> maxItems) { size_t count; BNQualifiedName nameObj = type.GetAPIObject(); - BNTypeReferenceSource* refs = BNGetTypeReferencesForType(m_object, &nameObj, &count); + BNTypeReferenceSource* refs = + BNGetTypeReferencesForType(m_object, &nameObj, &count, maxItems.has_value(), maxItems.value_or(0)); QualifiedName::FreeAPIObject(&nameObj); vector<TypeReferenceSource> result; @@ -2609,11 +2678,13 @@ vector<TypeReferenceSource> BinaryView::GetTypeReferencesForType(const Qualified } -vector<TypeFieldReference> BinaryView::GetCodeReferencesForTypeField(const QualifiedName& type, uint64_t offset) +vector<TypeFieldReference> BinaryView::GetCodeReferencesForTypeField( + const QualifiedName& type, uint64_t offset, std::optional<size_t> maxItems) { size_t count; BNQualifiedName nameObj = type.GetAPIObject(); - BNTypeFieldReference* refs = BNGetCodeReferencesForTypeField(m_object, &nameObj, offset, &count); + BNTypeFieldReference* refs = + BNGetCodeReferencesForTypeField(m_object, &nameObj, offset, &count, maxItems.has_value(), maxItems.value_or(0)); QualifiedName::FreeAPIObject(&nameObj); vector<TypeFieldReference> result; @@ -2636,11 +2707,13 @@ vector<TypeFieldReference> BinaryView::GetCodeReferencesForTypeField(const Quali } -vector<uint64_t> BinaryView::GetDataReferencesForTypeField(const QualifiedName& type, uint64_t offset) +vector<uint64_t> BinaryView::GetDataReferencesForTypeField( + const QualifiedName& type, uint64_t offset, std::optional<size_t> maxItems) { size_t count; BNQualifiedName nameObj = type.GetAPIObject(); - uint64_t* refs = BNGetDataReferencesForTypeField(m_object, &nameObj, offset, &count); + uint64_t* refs = + BNGetDataReferencesForTypeField(m_object, &nameObj, offset, &count, maxItems.has_value(), maxItems.value_or(0)); QualifiedName::FreeAPIObject(&nameObj); vector<uint64_t> result(refs, &refs[count]); @@ -2649,11 +2722,13 @@ vector<uint64_t> BinaryView::GetDataReferencesForTypeField(const QualifiedName& } -vector<uint64_t> BinaryView::GetDataReferencesFromForTypeField(const QualifiedName& type, uint64_t offset) +vector<uint64_t> BinaryView::GetDataReferencesFromForTypeField( + const QualifiedName& type, uint64_t offset, std::optional<size_t> maxItems) { size_t count; BNQualifiedName nameObj = type.GetAPIObject(); - uint64_t* refs = BNGetDataReferencesFromForTypeField(m_object, &nameObj, offset, &count); + uint64_t* refs = BNGetDataReferencesFromForTypeField( + m_object, &nameObj, offset, &count, maxItems.has_value(), maxItems.value_or(0)); QualifiedName::FreeAPIObject(&nameObj); vector<uint64_t> result(refs, &refs[count]); @@ -2662,11 +2737,13 @@ vector<uint64_t> BinaryView::GetDataReferencesFromForTypeField(const QualifiedNa } -vector<TypeReferenceSource> BinaryView::GetTypeReferencesForTypeField(const QualifiedName& type, uint64_t offset) +vector<TypeReferenceSource> BinaryView::GetTypeReferencesForTypeField( + const QualifiedName& type, uint64_t offset, std::optional<size_t> maxItems) { size_t count; BNQualifiedName nameObj = type.GetAPIObject(); - BNTypeReferenceSource* refs = BNGetTypeReferencesForTypeField(m_object, &nameObj, offset, &count); + BNTypeReferenceSource* refs = + BNGetTypeReferencesForTypeField(m_object, &nameObj, offset, &count, maxItems.has_value(), maxItems.value_or(0)); QualifiedName::FreeAPIObject(&nameObj); vector<TypeReferenceSource> result; @@ -2685,10 +2762,11 @@ vector<TypeReferenceSource> BinaryView::GetTypeReferencesForTypeField(const Qual } -AllTypeReferences BinaryView::GetAllReferencesForType(const QualifiedName& type) +AllTypeReferences BinaryView::GetAllReferencesForType(const QualifiedName& type, std::optional<size_t> maxItems) { BNQualifiedName nameObj = type.GetAPIObject(); - BNAllTypeReferences refs = BNGetAllReferencesForType(m_object, &nameObj); + BNAllTypeReferences refs = + BNGetAllReferencesForType(m_object, &nameObj, maxItems.has_value(), maxItems.value_or(0)); QualifiedName::FreeAPIObject(&nameObj); AllTypeReferences result; @@ -2720,10 +2798,12 @@ AllTypeReferences BinaryView::GetAllReferencesForType(const QualifiedName& type) } -AllTypeFieldReferences BinaryView::GetAllReferencesForTypeField(const QualifiedName& type, uint64_t offset) +AllTypeFieldReferences BinaryView::GetAllReferencesForTypeField( + const QualifiedName& type, uint64_t offset, std::optional<size_t> maxItems) { BNQualifiedName nameObj = type.GetAPIObject(); - BNAllTypeFieldReferences refs = BNGetAllReferencesForTypeField(m_object, &nameObj, offset); + BNAllTypeFieldReferences refs = + BNGetAllReferencesForTypeField(m_object, &nameObj, offset, maxItems.has_value(), maxItems.value_or(0)); QualifiedName::FreeAPIObject(&nameObj); AllTypeFieldReferences result; |
