diff options
| author | Peter LaFosse <peter@vector35.com> | 2021-08-19 11:59:16 -0400 |
|---|---|---|
| committer | Peter LaFosse <peter@vector35.com> | 2021-09-05 10:08:08 -0400 |
| commit | 75f2463a46cc666e87120f3a30332fa80020b62e (patch) | |
| tree | cc1799c1a2ea52fa4b36a112800c7f6c350fc8b9 | |
| parent | c00446726297722a653eb9c77a4f28bf032d034a (diff) | |
Add ability for TypeBuilder objects to utilize StructureBuilder/EnumerationBuilder/NamedTypeReferenceBuilder objects
| -rw-r--r-- | binaryninjaapi.h | 28 | ||||
| -rw-r--r-- | binaryninjacore.h | 14 | ||||
| -rw-r--r-- | type.cpp | 92 |
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); @@ -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; |
