From 7c9ada78241e08bf36bd04d989f742a6de721575 Mon Sep 17 00:00:00 2001 From: Xusheng Date: Wed, 5 May 2021 17:23:49 +0800 Subject: Add the ability to automatically create struct members --- type.cpp | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) (limited to 'type.cpp') diff --git a/type.cpp b/type.cpp index 08597f1a..bf7f83bd 100644 --- a/type.cpp +++ b/type.cpp @@ -19,6 +19,7 @@ // IN THE SOFTWARE. #include "binaryninjaapi.h" +#include using namespace BinaryNinja; using namespace std; @@ -1000,6 +1001,33 @@ bool Type::AddTypeMemberTokens(BinaryView* data, vector& t } +string Type::GetSizeSuffix(size_t size) +{ + char sizeStr[32]; + + switch (size) + { + case 0: + return ""; + case 1: + return ".b"; + case 2: + return ".w"; + case 4: + return ".d"; + case 8: + return ".q"; + case 10: + return ".t"; + case 16: + return ".o"; + default: + sprintf(sizeStr, ".%" PRIuPTR, size); + return sizeStr; + } +} + + TypeBuilder::TypeBuilder() { m_object = BNCreateVoidTypeBuilder(); @@ -1919,12 +1947,13 @@ StructureBuilder& StructureBuilder::AddMember(const Confidence>& type, } -StructureBuilder& StructureBuilder::AddMemberAtOffset(const Confidence>& type, const string& name, uint64_t offset) +StructureBuilder& StructureBuilder::AddMemberAtOffset(const Confidence>& type, + const string& name, uint64_t offset, bool overwriteExisting) { BNTypeWithConfidence tc; tc.type = type->GetObject(); tc.confidence = type.GetConfidence(); - BNAddStructureBuilderMemberAtOffset(m_object, &tc, name.c_str(), offset); + BNAddStructureBuilderMemberAtOffset(m_object, &tc, name.c_str(), offset, overwriteExisting); return *this; } @@ -1936,12 +1965,12 @@ StructureBuilder& StructureBuilder::RemoveMember(size_t idx) } -StructureBuilder& StructureBuilder::ReplaceMember(size_t idx, const Confidence>& type, const std::string& name) +StructureBuilder& StructureBuilder::ReplaceMember(size_t idx, const Confidence>& type, const std::string& name, bool overwriteExisting) { BNTypeWithConfidence tc; tc.type = type->GetObject(); tc.confidence = type.GetConfidence(); - BNReplaceStructureBuilderMember(m_object, idx, &tc, name.c_str()); + BNReplaceStructureBuilderMember(m_object, idx, &tc, name.c_str(), overwriteExisting); return *this; } -- cgit v1.3.1