diff options
Diffstat (limited to 'binaryview.cpp')
| -rw-r--r-- | binaryview.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/binaryview.cpp b/binaryview.cpp index 598f666c..6585f5c4 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -2685,6 +2685,46 @@ vector<TypeReferenceSource> BinaryView::GetTypeReferencesForTypeField(const Qual } +AllTypeFieldReferences BinaryView::GetAllReferencesForTypeField(const QualifiedName& type, uint64_t offset) +{ + BNQualifiedName nameObj = type.GetAPIObject(); + BNAllTypeFieldReferences refs = BNGetAllReferencesForTypeField(m_object, &nameObj, offset); + QualifiedName::FreeAPIObject(&nameObj); + + AllTypeFieldReferences result; + + result.codeRefs.reserve(refs.codeRefCount); + for (size_t i = 0; i < refs.codeRefCount; i++) + { + TypeFieldReference src; + src.func = new Function(BNNewFunctionReference(refs.codeRefs[i].func)); + src.arch = new CoreArchitecture(refs.codeRefs[i].arch); + src.addr = refs.codeRefs[i].addr; + src.size = refs.codeRefs[i].size; + BNTypeWithConfidence& tc = refs.codeRefs[i].incomingType; + Ref<Type> type = tc.type ? new Type(BNNewTypeReference(tc.type)) : nullptr; + src.incomingType = Confidence<Ref<Type>>(type, tc.confidence); + result.codeRefs.push_back(src); + } + + result.dataRefsTo = vector<uint64_t>(refs.dataRefsTo, &refs.dataRefsTo[refs.dataRefToCount]); + result.dataRefsFrom = vector<uint64_t>(refs.dataRefsFrom, &refs.dataRefsFrom[refs.dataRefFromCount]); + + result.typeRefs.reserve(refs.typeRefCount); + for (size_t i = 0; i < refs.typeRefCount; i++) + { + TypeReferenceSource src; + src.name = QualifiedName::FromAPIObject(&refs.typeRefs[i].name); + src.offset = refs.typeRefs[i].offset; + src.type = refs.typeRefs[i].type; + result.typeRefs.push_back(src); + } + + BNFreeAllTypeFieldReferences(&refs); + return result; +} + + vector<TypeReferenceSource> BinaryView::GetCodeReferencesForTypeFrom(ReferenceSource src) { size_t count; |
