summaryrefslogtreecommitdiff
path: root/binaryview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'binaryview.cpp')
-rw-r--r--binaryview.cpp222
1 files changed, 222 insertions, 0 deletions
diff --git a/binaryview.cpp b/binaryview.cpp
index d6417352..86878f8c 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -1683,6 +1683,21 @@ vector<Ref<Function>> BinaryView::GetAnalysisFunctionsForAddress(uint64_t addr)
}
+vector<Ref<Function>> BinaryView::GetAnalysisFunctionsContainingAddress(uint64_t addr)
+{
+ size_t count;
+ BNFunction** list = BNGetAnalysisFunctionsContainingAddress(m_object, addr, &count);
+
+ vector<Ref<Function>> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ result.push_back(new Function(BNNewFunctionReference(list[i])));
+
+ BNFreeFunctionList(list, count);
+ return result;
+}
+
+
Ref<Function> BinaryView::GetAnalysisEntryPoint()
{
BNFunction* func = BNGetAnalysisEntryPoint(m_object);
@@ -1847,6 +1862,213 @@ void BinaryView::RemoveUserDataReference(uint64_t fromAddr, uint64_t toAddr)
}
+vector<ReferenceSource> BinaryView::GetCodeReferencesForType(const QualifiedName& type)
+{
+ size_t count;
+
+ BNQualifiedName nameObj = type.GetAPIObject();
+ BNReferenceSource* refs = BNGetCodeReferencesForType(m_object, &nameObj, &count);
+ QualifiedName::FreeAPIObject(&nameObj);
+
+ 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<uint64_t> BinaryView::GetDataReferencesForType(const QualifiedName& type)
+{
+ size_t count;
+ BNQualifiedName nameObj = type.GetAPIObject();
+ uint64_t* refs = BNGetDataReferencesForType(m_object, &nameObj, &count);
+ QualifiedName::FreeAPIObject(&nameObj);
+
+ vector<uint64_t> result(refs, &refs[count]);
+ BNFreeDataReferences(refs);
+ return result;
+}
+
+
+vector<TypeReferenceSource> BinaryView::GetTypeReferencesForType(const QualifiedName& type)
+{
+ size_t count;
+
+ BNQualifiedName nameObj = type.GetAPIObject();
+ BNTypeReferenceSource* refs = BNGetTypeReferencesForType(m_object, &nameObj, &count);
+ QualifiedName::FreeAPIObject(&nameObj);
+
+ vector<TypeReferenceSource> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ TypeReferenceSource src;
+ src.name = QualifiedName::FromAPIObject(&refs[i].name);
+ src.offset = refs[i].offset;
+ src.type = refs[i].type;
+ result.push_back(src);
+ }
+
+ BNFreeTypeReferences(refs, count);
+ return result;
+}
+
+
+vector<ReferenceSource> BinaryView::GetCodeReferencesForTypeField(const QualifiedName& type, uint64_t offset)
+{
+ size_t count;
+ BNQualifiedName nameObj = type.GetAPIObject();
+ BNReferenceSource* refs = BNGetCodeReferencesForTypeField(m_object, &nameObj, offset, &count);
+ QualifiedName::FreeAPIObject(&nameObj);
+
+ 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<uint64_t> BinaryView::GetDataReferencesForTypeField(const QualifiedName& type, uint64_t offset)
+{
+ size_t count;
+ BNQualifiedName nameObj = type.GetAPIObject();
+ uint64_t* refs = BNGetDataReferencesForTypeField(m_object, &nameObj, offset, &count);
+ QualifiedName::FreeAPIObject(&nameObj);
+
+ vector<uint64_t> result(refs, &refs[count]);
+ BNFreeDataReferences(refs);
+ return result;
+}
+
+
+vector<TypeReferenceSource> BinaryView::GetTypeReferencesForTypeField(const QualifiedName& type, uint64_t offset)
+{
+ size_t count;
+ BNQualifiedName nameObj = type.GetAPIObject();
+ BNTypeReferenceSource* refs = BNGetTypeReferencesForTypeField(m_object, &nameObj, offset, &count);
+ QualifiedName::FreeAPIObject(&nameObj);
+
+ vector<TypeReferenceSource> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ TypeReferenceSource src;
+ src.name = QualifiedName::FromAPIObject(&refs[i].name);
+ src.offset = refs[i].offset;
+ src.type = refs[i].type;
+ result.push_back(src);
+ }
+
+ BNFreeTypeReferences(refs, count);
+ return result;
+}
+
+
+vector<TypeReferenceSource> BinaryView::GetCodeReferencesForTypeFrom(ReferenceSource src)
+{
+ size_t count;
+ BNReferenceSource _src{ src.func->m_object, src.arch->m_object, src.addr };
+ BNTypeReferenceSource* refs = BNGetCodeReferencesForTypeFrom(m_object, &_src, &count);
+
+ vector<TypeReferenceSource> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ TypeReferenceSource src;
+ src.name = QualifiedName::FromAPIObject(&refs[i].name);
+ src.offset = refs[i].offset;
+ src.type = refs[i].type;
+ result.push_back(src);
+ }
+
+ BNFreeTypeReferences(refs, count);
+ return result;
+}
+
+
+vector<TypeReferenceSource> BinaryView::GetCodeReferencesForTypeFrom(ReferenceSource src, uint64_t len)
+{
+ size_t count;
+ BNReferenceSource _src{ src.func->m_object, src.arch->m_object, src.addr };
+ BNTypeReferenceSource* refs = BNGetCodeReferencesForTypeFromInRange(m_object, &_src, len, &count);
+
+ vector<TypeReferenceSource> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ TypeReferenceSource src;
+ src.name = QualifiedName::FromAPIObject(&refs[i].name);
+ src.offset = refs[i].offset;
+ src.type = refs[i].type;
+ result.push_back(src);
+ }
+
+ BNFreeTypeReferences(refs, count);
+ return result;
+}
+
+vector<TypeReferenceSource> BinaryView::GetCodeReferencesForTypeFieldFrom(ReferenceSource src)
+{
+ size_t count;
+ BNReferenceSource _src{ src.func->m_object, src.arch->m_object, src.addr };
+ BNTypeReferenceSource* refs = BNGetCodeReferencesForTypeFieldsFrom(m_object, &_src, &count);
+
+ vector<TypeReferenceSource> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ TypeReferenceSource src;
+ src.name = QualifiedName::FromAPIObject(&refs[i].name);
+ src.offset = refs[i].offset;
+ src.type = refs[i].type;
+ result.push_back(src);
+ }
+
+ BNFreeTypeReferences(refs, count);
+ return result;
+}
+
+
+vector<TypeReferenceSource> BinaryView::GetCodeReferencesForTypeFieldFrom(ReferenceSource src, uint64_t len)
+{
+ size_t count;
+ BNReferenceSource _src{ src.func->m_object, src.arch->m_object, src.addr };
+ BNTypeReferenceSource* refs = BNGetCodeReferencesForTypeFieldsFromInRange(m_object, &_src, len, &count);
+
+ vector<TypeReferenceSource> result;
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ {
+ TypeReferenceSource src;
+ src.name = QualifiedName::FromAPIObject(&refs[i].name);
+ src.offset = refs[i].offset;
+ src.type = refs[i].type;
+ result.push_back(src);
+ }
+
+ BNFreeTypeReferences(refs, count);
+ return result;
+}
+
+
vector<uint64_t> BinaryView::GetCallees(ReferenceSource callSite)
{
size_t count;