summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2022-04-14 17:25:29 -0400
committerGlenn Smith <glenn@vector35.com>2022-06-21 14:51:14 -0400
commit63e72efd13b31c1d2061b978e2a5f4688e7ba4fd (patch)
treec74a04f126b76051792ab2be294d34e909d003b3
parent34e5803d69fea165da55da518ffaddfb7344ed00 (diff)
Add Analysis::GetTypeByRef, which searches for types by id/name
Due to bugs, sometimes named types will not have a correct id, leading to bugs
-rw-r--r--binaryninjaapi.h2
-rw-r--r--binaryninjacore.h1
-rw-r--r--binaryview.cpp9
3 files changed, 12 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index a50fcc62..bfa94d6f 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -1737,6 +1737,7 @@ namespace BinaryNinja {
struct PossibleValueSet;
class Metadata;
class Structure;
+ class NamedTypeReference;
struct TypeParserResult;
class QueryMetadataException : public std::exception
@@ -2121,6 +2122,7 @@ namespace BinaryNinja {
std::map<QualifiedName, Ref<Type>> GetTypes();
std::vector<QualifiedName> GetTypeNames(const std::string& matching = "");
Ref<Type> GetTypeByName(const QualifiedName& name);
+ Ref<Type> GetTypeByRef(Ref<NamedTypeReference> name);
Ref<Type> GetTypeById(const std::string& id);
std::string GetTypeId(const QualifiedName& name);
QualifiedName GetTypeNameById(const std::string& id);
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 58fb6bf2..587e5920 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -4189,6 +4189,7 @@ extern "C"
BINARYNINJACOREAPI BNQualifiedName* BNGetAnalysisTypeNames(BNBinaryView* view, size_t* count, const char* matching);
BINARYNINJACOREAPI void BNFreeTypeNameList(BNQualifiedName* names, size_t count);
BINARYNINJACOREAPI BNType* BNGetAnalysisTypeByName(BNBinaryView* view, BNQualifiedName* name);
+ BINARYNINJACOREAPI BNType* BNGetAnalysisTypeByRef(BNBinaryView* view, BNNamedTypeReference* ref);
BINARYNINJACOREAPI BNType* BNGetAnalysisTypeById(BNBinaryView* view, const char* id);
BINARYNINJACOREAPI char* BNGetAnalysisTypeId(BNBinaryView* view, BNQualifiedName* name);
BINARYNINJACOREAPI BNQualifiedName BNGetAnalysisTypeNameById(BNBinaryView* view, const char* id);
diff --git a/binaryview.cpp b/binaryview.cpp
index 70d866ce..24058619 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -3187,6 +3187,15 @@ Ref<Type> BinaryView::GetTypeByName(const QualifiedName& name)
}
+Ref<Type> BinaryView::GetTypeByRef(Ref<NamedTypeReference> ref)
+{
+ BNType* type = BNGetAnalysisTypeByRef(m_object, ref->m_object);
+ if (!type)
+ return nullptr;
+ return new Type(BNNewTypeReference(type));
+}
+
+
Ref<Type> BinaryView::GetTypeById(const string& id)
{
BNType* type = BNGetAnalysisTypeById(m_object, id.c_str());