From 64447f5c063cf0876f563d53950ea0d613136afa Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Wed, 11 Aug 2021 08:31:51 -0400 Subject: Add TypeBuilder SetAlternateName/SetParameters/SetSigned --- binaryninjaapi.h | 3 +++ binaryninjacore.h | 4 ++++ type.cpp | 62 +++++++++++++++++++++++++++++++++++++------------------ 3 files changed, 49 insertions(+), 20 deletions(-) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index d6b8c7ac..0dafe793 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -2913,7 +2913,9 @@ __attribute__ ((format (printf, 1, 2))) TypeBuilder& SetScope(const Confidence& scope); TypeBuilder& SetConst(const Confidence& cnst); TypeBuilder& SetVolatile(const Confidence& vltl); + TypeBuilder& SetSigned(const Confidence& vltl); TypeBuilder& SetTypeName(const QualifiedName& name); + TypeBuilder& SetAlternateName(const std::string& name); Confidence GetStackAdjustment() const; QualifiedName GetStructureName() const; @@ -2921,6 +2923,7 @@ __attribute__ ((format (printf, 1, 2))) uint64_t GetOffset() const; TypeBuilder& SetFunctionCanReturn(const Confidence& canReturn); + TypeBuilder& SetParameters(const std::vector& params); std::string GetString(Platform* platform = nullptr) const; std::string GetTypeAndName(const QualifiedName& name) const; diff --git a/binaryninjacore.h b/binaryninjacore.h index e32314e0..0b11c6f6 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -4746,6 +4746,7 @@ __attribute__ ((format (printf, 1, 2))) BINARYNINJACOREAPI BNQualifiedName BNTypeBuilderGetTypeName(BNTypeBuilder* nt); BINARYNINJACOREAPI void BNTypeBuilderSetTypeName(BNTypeBuilder* type, BNQualifiedName* name); + BINARYNINJACOREAPI void BNTypeBuilderSetAlternateName(BNTypeBuilder* type, const char* name); BINARYNINJACOREAPI BNTypeClass BNGetTypeBuilderClass(BNTypeBuilder* type); BINARYNINJACOREAPI uint64_t BNGetTypeBuilderWidth(BNTypeBuilder* type); BINARYNINJACOREAPI size_t BNGetTypeBuilderAlignment(BNTypeBuilder* type); @@ -4764,11 +4765,14 @@ __attribute__ ((format (printf, 1, 2))) BINARYNINJACOREAPI uint64_t BNGetTypeBuilderElementCount(BNTypeBuilder* type); BINARYNINJACOREAPI uint64_t BNGetTypeBuilderOffset(BNTypeBuilder* type); BINARYNINJACOREAPI void BNSetFunctionTypeBuilderCanReturn(BNTypeBuilder* type, BNBoolWithConfidence* canReturn); + BINARYNINJACOREAPI void BNSetFunctionTypeBuilderParameters(BNTypeBuilder* type, BNFunctionParameter* params, size_t paramCount); BINARYNINJACOREAPI void BNTypeBuilderSetConst(BNTypeBuilder* type, BNBoolWithConfidence* cnst); BINARYNINJACOREAPI void BNTypeBuilderSetVolatile(BNTypeBuilder* type, BNBoolWithConfidence* vltl); + BINARYNINJACOREAPI void BNTypeBuilderSetSigned(BNTypeBuilder* type, BNBoolWithConfidence* sign); BINARYNINJACOREAPI BNOffsetWithConfidence BNGetTypeBuilderStackAdjustment(BNTypeBuilder* type); BINARYNINJACOREAPI BNQualifiedName BNTypeBuilderGetStructureName(BNTypeBuilder* type); BINARYNINJACOREAPI BNReferenceType BNTypeBuilderGetReferenceType(BNTypeBuilder* type); + BINARYNINJACOREAPI char* BNGetTypeBuilderAlternateName(BNTypeBuilder* type); BINARYNINJACOREAPI char* BNGetTypeBuilderString(BNTypeBuilder* type, BNPlatform* platform); BINARYNINJACOREAPI char* BNGetTypeBuilderStringBeforeName(BNTypeBuilder* type, BNPlatform* platform); diff --git a/type.cpp b/type.cpp index 3d7339e4..4429bb60 100644 --- a/type.cpp +++ b/type.cpp @@ -892,12 +892,6 @@ string Type::GetAutoDebugTypeIdSource() } -bool Type::IsReferenceOfType(BNNamedTypeReferenceClass refType) -{ - return (GetClass() == NamedTypeReferenceClass) && (GetNamedTypeReference()->GetTypeClass() == refType); -} - - QualifiedName Type::GetTypeName() const { BNQualifiedName name = BNTypeGetTypeName(m_object); @@ -1140,6 +1134,16 @@ TypeBuilder& TypeBuilder::SetVolatile(const Confidence& vltl) } +TypeBuilder& TypeBuilder::SetSigned(const Confidence& s) +{ + BNBoolWithConfidence bc; + bc.value = s.GetValue(); + bc.confidence = s.GetConfidence(); + BNTypeBuilderSetSigned(m_object, &bc); + return *this; +} + + Confidence> TypeBuilder::GetChildType() const { BNTypeWithConfidence type = BNGetTypeBuilderChildType(m_object); @@ -1452,6 +1456,23 @@ TypeBuilder TypeBuilder::ArrayType(const Confidence>& type, uint64_t e } +static BNFunctionParameter* GetParamArray(const std::vector& params, size_t& count) +{ + BNFunctionParameter* paramArray = new BNFunctionParameter[params.size()]; + for (size_t i = 0; i < params.size(); i++) + { + paramArray[i].name = (char*)params[i].name.c_str(); + paramArray[i].type = params[i].type->GetObject(); + paramArray[i].typeConfidence = params[i].type.GetConfidence(); + paramArray[i].defaultLocation = params[i].defaultLocation; + paramArray[i].location.type = params[i].location.type; + paramArray[i].location.index = params[i].location.index; + paramArray[i].location.storage = params[i].location.storage; + } + count = params.size(); + return paramArray; +} + TypeBuilder TypeBuilder::FunctionType(const Confidence>& returnValue, const Confidence>& callingConvention, const std::vector& params, const Confidence& varArg, @@ -1465,17 +1486,8 @@ TypeBuilder TypeBuilder::FunctionType(const Confidence>& returnValue, callingConventionConf.convention = callingConvention ? callingConvention->GetObject() : nullptr; callingConventionConf.confidence = callingConvention.GetConfidence(); - BNFunctionParameter* paramArray = new BNFunctionParameter[params.size()]; - for (size_t i = 0; i < params.size(); i++) - { - paramArray[i].name = (char*)params[i].name.c_str(); - paramArray[i].type = params[i].type->GetObject(); - paramArray[i].typeConfidence = params[i].type.GetConfidence(); - paramArray[i].defaultLocation = params[i].defaultLocation; - paramArray[i].location.type = params[i].location.type; - paramArray[i].location.index = params[i].location.index; - paramArray[i].location.storage = params[i].location.storage; - } + size_t paramCount = 0; + BNFunctionParameter* paramArray = GetParamArray(params, paramCount); BNBoolWithConfidence varArgConf; varArgConf.value = varArg.GetValue(); @@ -1486,7 +1498,7 @@ TypeBuilder TypeBuilder::FunctionType(const Confidence>& returnValue, stackAdjustConf.confidence = stackAdjust.GetConfidence(); TypeBuilder type(BNCreateFunctionTypeBuilder(&returnValueConf, &callingConventionConf, - paramArray, params.size(), &varArgConf, &stackAdjustConf)); + paramArray, paramCount, &varArgConf, &stackAdjustConf)); delete[] paramArray; return type; } @@ -1502,9 +1514,12 @@ TypeBuilder& TypeBuilder::SetFunctionCanReturn(const Confidence& canReturn } -bool TypeBuilder::IsReferenceOfType(BNNamedTypeReferenceClass refType) +TypeBuilder& TypeBuilder::SetParameters(const std::vector& params) { - return (GetClass() == NamedTypeReferenceClass) && (GetNamedTypeReference()->GetTypeClass() == refType); + size_t paramCount = 0; + BNFunctionParameter* paramArray = GetParamArray(params, paramCount); + BNSetFunctionTypeBuilderParameters(m_object, paramArray, paramCount); + return *this; } @@ -1526,6 +1541,13 @@ TypeBuilder& TypeBuilder::SetTypeName(const QualifiedName& names) } +TypeBuilder& TypeBuilder::SetAlternateName(const string& name) +{ + BNTypeBuilderSetAlternateName(m_object, name.c_str()); + return *this; +} + + QualifiedName TypeBuilder::GetStructureName() const { BNQualifiedName name = BNTypeBuilderGetStructureName(m_object); -- cgit v1.3.1