summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2021-08-19 11:59:16 -0400
committerPeter LaFosse <peter@vector35.com>2021-09-05 10:08:08 -0400
commit75f2463a46cc666e87120f3a30332fa80020b62e (patch)
treecc1799c1a2ea52fa4b36a112800c7f6c350fc8b9
parentc00446726297722a653eb9c77a4f28bf032d034a (diff)
Add ability for TypeBuilder objects to utilize StructureBuilder/EnumerationBuilder/NamedTypeReferenceBuilder objects
-rw-r--r--binaryninjaapi.h28
-rw-r--r--binaryninjacore.h14
-rw-r--r--type.cpp92
3 files changed, 134 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 7c595b69..62fdb965 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -2873,6 +2873,9 @@ __attribute__ ((format (printf, 1, 2)))
static std::string GetSizeSuffix(size_t size);
};
+ class EnumerationBuilder;
+ class StructureBuilder;
+ class NamedTypeReferenceBuilder;
class TypeBuilder
{
BNTypeBuilder* m_object;
@@ -2939,11 +2942,14 @@ __attribute__ ((format (printf, 1, 2)))
static TypeBuilder FloatType(size_t width, const std::string& typeName = "");
static TypeBuilder WideCharType(size_t width, const std::string& typeName = "");
static TypeBuilder StructureType(Structure* strct);
+ static TypeBuilder StructureType(StructureBuilder* strct);
static TypeBuilder NamedType(NamedTypeReference* ref, size_t width = 0, size_t align = 1);
+ static TypeBuilder NamedType(NamedTypeReferenceBuilder* ref, size_t width = 0, size_t align = 1);
static TypeBuilder NamedType(const QualifiedName& name, Type* type);
static TypeBuilder NamedType(const std::string& id, const QualifiedName& name, Type* type);
static TypeBuilder NamedType(BinaryView* view, const QualifiedName& name);
static TypeBuilder EnumerationType(Architecture* arch, Enumeration* enm, size_t width = 0, bool issigned = false);
+ static TypeBuilder EnumerationType(Architecture* arch, EnumerationBuilder* enm, size_t width = 0, bool issigned = false);
static TypeBuilder PointerType(Architecture* arch, const Confidence<Ref<Type>>& type,
const Confidence<bool>& cnst = Confidence<bool>(false, 0),
const Confidence<bool>& vltl = Confidence<bool>(false, 0), BNReferenceType refType = PointerReferenceType);
@@ -2998,6 +3004,26 @@ __attribute__ ((format (printf, 1, 2)))
const QualifiedName& name);
};
+ class NamedTypeReferenceBuilder
+ {
+ BNNamedTypeReferenceBuilder* m_object;
+ public:
+ NamedTypeReferenceBuilder(BNNamedTypeReferenceBuilder* nt);
+ NamedTypeReferenceBuilder(BNNamedTypeReferenceClass cls = UnknownNamedTypeClass, const std::string& id = "",
+ const QualifiedName& name = QualifiedName());
+ ~NamedTypeReferenceBuilder();
+ BNNamedTypeReferenceBuilder* GetObject() { return m_object; };
+ BNNamedTypeReferenceClass GetTypeClass() const;
+ std::string GetTypeId() const;
+ QualifiedName GetName() const;
+
+ void SetTypeClass(BNNamedTypeReferenceClass type);
+ void SetTypeId(const std::string& id);
+ void SetName(const QualifiedName& name);
+
+ Ref<NamedTypeReference> Finalize();
+ };
+
struct StructureMember
{
Ref<Type> type;
@@ -3040,6 +3066,7 @@ __attribute__ ((format (printf, 1, 2)))
StructureBuilder& operator=(const StructureBuilder& s);
StructureBuilder& operator=(StructureBuilder&& s);
StructureBuilder& operator=(Structure* s);
+ BNStructureBuilder* GetObject() { return m_object; };
Ref<Structure> Finalize() const;
@@ -3089,6 +3116,7 @@ __attribute__ ((format (printf, 1, 2)))
EnumerationBuilder(EnumerationBuilder&& e);
EnumerationBuilder(Enumeration* e);
~EnumerationBuilder();
+ BNEnumerationBuilder* GetObject() { return m_object; }
EnumerationBuilder& operator=(const EnumerationBuilder& e);
EnumerationBuilder& operator=(EnumerationBuilder&& e);
EnumerationBuilder& operator=(Enumeration* e);
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 0a915710..6f879a73 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -187,6 +187,7 @@ extern "C"
struct BNTagReference;
struct BNUser;
struct BNNamedTypeReference;
+ struct BNNamedTypeReferenceBuilder;
struct BNEnumeration;
struct BNEnumerationBuilder;
struct BNCallingConvention;
@@ -4690,7 +4691,9 @@ __attribute__ ((format (printf, 1, 2)))
BINARYNINJACOREAPI BNTypeBuilder* BNCreateFloatTypeBuilder(size_t width, const char* altName);
BINARYNINJACOREAPI BNTypeBuilder* BNCreateWideCharTypeBuilder(size_t width, const char* altName);
BINARYNINJACOREAPI BNTypeBuilder* BNCreateStructureTypeBuilder(BNStructure* s);
+ BINARYNINJACOREAPI BNTypeBuilder* BNCreateStructureTypeBuilderWithBuilder(BNStructureBuilder* s);
BINARYNINJACOREAPI BNTypeBuilder* BNCreateEnumerationTypeBuilder(BNArchitecture* arch, BNEnumeration* e, size_t width, bool isSigned);
+ BINARYNINJACOREAPI BNTypeBuilder* BNCreateEnumerationTypeBuilderWithBuilder(BNArchitecture* arch, BNEnumerationBuilder* e, size_t width, bool isSigned);
BINARYNINJACOREAPI BNTypeBuilder* BNCreatePointerTypeBuilder(BNArchitecture* arch, const BNTypeWithConfidence* const type,
BNBoolWithConfidence* cnst, BNBoolWithConfidence* vltl, BNReferenceType refType);
BINARYNINJACOREAPI BNTypeBuilder* BNCreatePointerTypeBuilderOfWidth(size_t width, const BNTypeWithConfidence* const type,
@@ -4791,6 +4794,7 @@ __attribute__ ((format (printf, 1, 2)))
BINARYNINJACOREAPI BNType* BNCreateNamedTypeReferenceFromTypeAndId(const char* id, BNQualifiedName* name, BNType* type);
BINARYNINJACOREAPI BNType* BNCreateNamedTypeReferenceFromType(BNBinaryView* view, BNQualifiedName* name);
BINARYNINJACOREAPI BNTypeBuilder* BNCreateNamedTypeReferenceBuilder(BNNamedTypeReference* nt, size_t width, size_t align);
+ BINARYNINJACOREAPI BNTypeBuilder* BNCreateNamedTypeReferenceBuilderWithBuilder(BNNamedTypeReferenceBuilder* nt, size_t width, size_t align);
BINARYNINJACOREAPI BNTypeBuilder* BNCreateNamedTypeReferenceBuilderFromTypeAndId(const char* id, BNQualifiedName* name, BNType* type);
BINARYNINJACOREAPI BNTypeBuilder* BNCreateNamedTypeReferenceBuilderFromType(BNBinaryView* view, BNQualifiedName* name);
BINARYNINJACOREAPI BNNamedTypeReference* BNCreateNamedType(BNNamedTypeReferenceClass cls, const char* id, BNQualifiedName* name);
@@ -4801,6 +4805,16 @@ __attribute__ ((format (printf, 1, 2)))
BINARYNINJACOREAPI void BNFreeNamedTypeReference(BNNamedTypeReference* nt);
BINARYNINJACOREAPI BNNamedTypeReference* BNNewNamedTypeReference(BNNamedTypeReference* nt);
+ BINARYNINJACOREAPI BNNamedTypeReferenceBuilder* BNCreateNamedTypeBuilder(BNNamedTypeReferenceClass cls, const char* id, BNQualifiedName* name);
+ BINARYNINJACOREAPI void BNFreeNamedTypeReferenceBuilder(BNNamedTypeReferenceBuilder* s);
+ BINARYNINJACOREAPI void BNSetNamedTypeReferenceBuilderTypeClass(BNNamedTypeReferenceBuilder* s, BNNamedTypeReferenceClass type);
+ BINARYNINJACOREAPI void BNSetNamedTypeReferenceBuilderTypeId(BNNamedTypeReferenceBuilder* s, const char* id);
+ BINARYNINJACOREAPI void BNSetNamedTypeReferenceBuilderName(BNNamedTypeReferenceBuilder* s, BNQualifiedName* name);
+ BINARYNINJACOREAPI BNNamedTypeReference* BNFinalizeNamedTypeReferenceBuilder(BNNamedTypeReferenceBuilder* s);
+ BINARYNINJACOREAPI BNNamedTypeReferenceClass BNGetTypeReferenceBuilderClass(BNNamedTypeReferenceBuilder* nt);
+ BINARYNINJACOREAPI char* BNGetTypeReferenceBuilderId(BNNamedTypeReferenceBuilder* nt);
+ BINARYNINJACOREAPI BNQualifiedName BNGetTypeReferenceBuilderName(BNNamedTypeReferenceBuilder* nt);
+
BINARYNINJACOREAPI BNStructureBuilder* BNCreateStructureBuilder(void);
BINARYNINJACOREAPI BNStructureBuilder* BNCreateStructureBuilderWithOptions(BNStructureType type, bool packed);
BINARYNINJACOREAPI BNStructureBuilder* BNCreateStructureBuilderFromStructure(BNStructure* s);
diff --git a/type.cpp b/type.cpp
index bf7f83bd..f26dc1ea 100644
--- a/type.cpp
+++ b/type.cpp
@@ -1386,12 +1386,24 @@ TypeBuilder TypeBuilder::StructureType(Structure* strct)
}
+TypeBuilder TypeBuilder::StructureType(StructureBuilder* strct)
+{
+ return TypeBuilder(BNCreateStructureTypeBuilderWithBuilder(strct->GetObject()));
+}
+
+
TypeBuilder TypeBuilder::NamedType(NamedTypeReference* ref, size_t width, size_t align)
{
return TypeBuilder(BNCreateNamedTypeReferenceBuilder(ref->GetObject(), width, align));
}
+TypeBuilder TypeBuilder::NamedType(NamedTypeReferenceBuilder* ref, size_t width, size_t align)
+{
+ return TypeBuilder(BNCreateNamedTypeReferenceBuilderWithBuilder(ref->GetObject(), width, align));
+}
+
+
TypeBuilder TypeBuilder::NamedType(const QualifiedName& name, Type* type)
{
return NamedType("", name, type);
@@ -1423,6 +1435,12 @@ TypeBuilder TypeBuilder::EnumerationType(Architecture* arch, Enumeration* enm, s
}
+TypeBuilder TypeBuilder::EnumerationType(Architecture* arch, EnumerationBuilder* enm, size_t width, bool isSigned)
+{
+ return TypeBuilder(BNCreateEnumerationTypeBuilderWithBuilder(arch->GetObject(), enm->GetObject(), width, isSigned));
+}
+
+
TypeBuilder TypeBuilder::PointerType(Architecture* arch, const Confidence<Ref<Type>>& type,
const Confidence<bool>& cnst, const Confidence<bool>& vltl, BNReferenceType refType)
{
@@ -1615,6 +1633,80 @@ Ref<NamedTypeReference> NamedTypeReference::GenerateAutoDebugTypeReference(BNNam
}
+NamedTypeReferenceBuilder::NamedTypeReferenceBuilder(BNNamedTypeReferenceBuilder* nt)
+{
+ m_object = nt;
+}
+
+
+NamedTypeReferenceBuilder::NamedTypeReferenceBuilder(BNNamedTypeReferenceClass cls, const std::string& id,
+ const QualifiedName& name)
+{
+
+ BNQualifiedName n = name.GetAPIObject();
+ m_object = BNCreateNamedTypeBuilder(cls, id.c_str(), &n);
+ QualifiedName::FreeAPIObject(&n);
+}
+
+NamedTypeReferenceBuilder::~NamedTypeReferenceBuilder()
+{
+ BNFreeNamedTypeReferenceBuilder(m_object);
+}
+
+
+BNNamedTypeReferenceClass NamedTypeReferenceBuilder::GetTypeClass() const
+{
+ return BNGetTypeReferenceBuilderClass(m_object);
+}
+
+
+std::string NamedTypeReferenceBuilder::GetTypeId() const
+{
+ char* str = BNGetTypeReferenceBuilderId(m_object);
+ string result = str;
+ BNFreeString(str);
+ return result;
+}
+
+
+QualifiedName NamedTypeReferenceBuilder::GetName() const
+{
+ BNQualifiedName name = BNGetTypeReferenceBuilderName(m_object);
+ QualifiedName result = QualifiedName::FromAPIObject(&name);
+ BNFreeQualifiedName(&name);
+ return result;
+}
+
+
+void NamedTypeReferenceBuilder::SetTypeClass(BNNamedTypeReferenceClass type)
+{
+ BNSetNamedTypeReferenceBuilderTypeClass(m_object, type);
+}
+
+
+void NamedTypeReferenceBuilder::SetTypeId(const string& id)
+{
+ BNSetNamedTypeReferenceBuilderTypeId(m_object, id.c_str());
+}
+
+
+void NamedTypeReferenceBuilder::SetName(const QualifiedName& name)
+{
+ BNQualifiedName n = name.GetAPIObject();
+ BNSetNamedTypeReferenceBuilderName(m_object, &n);
+ QualifiedName::FreeAPIObject(&n);
+}
+
+
+Ref<NamedTypeReference> NamedTypeReferenceBuilder::Finalize()
+{
+ BNNamedTypeReference* ref = BNFinalizeNamedTypeReferenceBuilder(m_object);
+ if (ref)
+ return new NamedTypeReference(ref);
+ return nullptr;
+}
+
+
Structure::Structure(BNStructure* s)
{
m_object = s;