summaryrefslogtreecommitdiff
path: root/binaryview.cpp
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2022-11-17 17:19:34 -0500
committerGlenn Smith <glenn@vector35.com>2022-11-30 18:35:17 -0500
commit4c242707996e94877d3e2762a2ef88835e98abbc (patch)
tree14e364a8c79e28a4f7584c8c776495ee20f762d0 /binaryview.cpp
parent9372cd0e81000ca4d5e412e8eecde16424d346bd (diff)
Type library C++ api & import recording
Diffstat (limited to 'binaryview.cpp')
-rw-r--r--binaryview.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/binaryview.cpp b/binaryview.cpp
index f1b5b3b5..1eb96e51 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -3639,6 +3639,99 @@ void BinaryView::RegisterPlatformTypes(Platform* platform)
}
+void BinaryView::AddTypeLibrary(TypeLibrary* lib)
+{
+ BNAddBinaryViewTypeLibrary(m_object, lib->GetObject());
+}
+
+
+Ref<TypeLibrary> BinaryView::GetTypeLibrary(const std::string& name)
+{
+ BNTypeLibrary* lib = BNGetBinaryViewTypeLibrary(m_object, name.c_str());
+ if (!lib)
+ return nullptr;
+ return new TypeLibrary(lib);
+}
+
+
+std::vector<Ref<TypeLibrary>> BinaryView::GetTypeLibraries()
+{
+ size_t count;
+ BNTypeLibrary** libs = BNGetBinaryViewTypeLibraries(m_object, &count);
+
+ vector<Ref<TypeLibrary>> result;
+ for (size_t i = 0; i < count; ++i)
+ {
+ result.push_back(new TypeLibrary(BNNewTypeLibraryReference(libs[i])));
+ }
+
+ BNFreeTypeLibraryList(libs, count);
+ return result;
+}
+
+
+Ref<Type> BinaryView::ImportTypeLibraryType(Ref<TypeLibrary>& lib, const QualifiedName& name)
+{
+ BNQualifiedName apiName = name.GetAPIObject();
+ BNTypeLibrary* apiLib = lib ? lib->GetObject() : nullptr;
+ BNType* result = BNBinaryViewImportTypeLibraryType(m_object, &apiLib, &apiName);
+ lib = apiLib ? new TypeLibrary(apiLib) : nullptr;
+ QualifiedName::FreeAPIObject(&apiName);
+ if (!result)
+ return nullptr;
+ return new Type(result);
+}
+
+
+Ref<Type> BinaryView::ImportTypeLibraryObject(Ref<TypeLibrary>& lib, const QualifiedName& name)
+{
+ BNQualifiedName apiName = name.GetAPIObject();
+ BNTypeLibrary* apiLib = lib ? lib->GetObject() : nullptr;
+ BNType* result = BNBinaryViewImportTypeLibraryObject(m_object, &apiLib, &apiName);
+ lib = apiLib ? new TypeLibrary(apiLib) : nullptr;
+ QualifiedName::FreeAPIObject(&apiName);
+ if (!result)
+ return nullptr;
+ return new Type(result);
+}
+
+
+void BinaryView::ExportTypeToTypeLibrary(TypeLibrary* lib, const QualifiedName& name, Type* type)
+{
+ BNQualifiedName apiName = name.GetAPIObject();
+ BNBinaryViewExportTypeToTypeLibrary(m_object, lib->GetObject(), &apiName, type->GetObject());
+ QualifiedName::FreeAPIObject(&apiName);
+}
+
+
+void BinaryView::ExportObjectToTypeLibrary(TypeLibrary* lib, const QualifiedName& name, Type* type)
+{
+ BNQualifiedName apiName = name.GetAPIObject();
+ BNBinaryViewExportObjectToTypeLibrary(m_object, lib->GetObject(), &apiName, type->GetObject());
+ QualifiedName::FreeAPIObject(&apiName);
+}
+
+
+void BinaryView::RecordImportedObjectLibrary(Platform* tgtPlatform, uint64_t tgtAddr, TypeLibrary* lib, const QualifiedName& name)
+{
+ BNQualifiedName apiName = name.GetAPIObject();
+ BNBinaryViewRecordImportedObjectLibrary(m_object, tgtPlatform->m_object, tgtAddr, lib->GetObject(), &apiName);
+ QualifiedName::FreeAPIObject(&apiName);
+}
+
+
+std::optional<std::pair<Ref<TypeLibrary>, QualifiedName>> BinaryView::LookupImportedObjectLibrary(Platform* tgtPlatform, uint64_t tgtAddr)
+{
+ BNTypeLibrary* resultLib;
+ BNQualifiedName resultName;
+ if (!BNBinaryViewLookupImportedObjectLibrary(m_object, tgtPlatform->m_object, tgtAddr, &resultLib, &resultName))
+ return std::nullopt;
+ QualifiedName name = QualifiedName::FromAPIObject(&resultName);
+ BNFreeQualifiedName(&resultName);
+ return std::make_pair(new TypeLibrary(resultLib), name);
+}
+
+
bool BinaryView::FindNextData(uint64_t start, const DataBuffer& data, uint64_t& result, BNFindFlag flags)
{
return BNFindNextData(m_object, start, data.GetBufferObject(), &result, flags);