From aa407ca14f6a99c5a953ff564461ec8dac1e0a84 Mon Sep 17 00:00:00 2001 From: Xusheng Date: Mon, 31 Aug 2020 17:53:02 +0800 Subject: allow redefining an existing type --- binaryninjaapi.h | 6 ++++-- binaryninjacore.h | 11 +++++++++-- binaryview.cpp | 32 ++++++++++++++++++++++++++++---- python/binaryview.py | 4 +++- ui/createtypedialog.h | 4 +++- ui/typeview.h | 2 +- 6 files changed, 48 insertions(+), 11 deletions(-) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 692cbebf..99d74b16 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1659,9 +1659,11 @@ __attribute__ ((format (printf, 1, 2))) uint64_t GetPreviousDataBeforeAddress(uint64_t addr); uint64_t GetPreviousDataVariableStartBeforeAddress(uint64_t addr); - bool ParseTypeString(const std::string& text, QualifiedNameAndType& result, std::string& errors); + bool ParseTypeString(const std::string& text, QualifiedNameAndType& result, std::string& errors, + const std::set& typesAllowRedefinition = {}); bool ParseTypeString(const std::string& text, std::map>& types, - std::map>& variables, std::map>& functions, std::string& errors); + std::map>& variables, std::map>& functions, std::string& errors, + const std::set& typesAllowRedefinition = {}); std::map> GetTypes(); std::vector GetTypeNames(const std::string& matching=""); diff --git a/binaryninjacore.h b/binaryninjacore.h index 5d22367e..773f70c0 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -1735,6 +1735,12 @@ extern "C" size_t typeCount, variableCount, functionCount; }; + struct BNQualifiedNameList + { + BNQualifiedName* names; + size_t count; + }; + enum BNUpdateResult { UpdateFailed = 0, @@ -3262,8 +3268,9 @@ __attribute__ ((format (printf, 1, 2))) BINARYNINJACOREAPI bool BNGetDataVariableAtAddress(BNBinaryView* view, uint64_t addr, BNDataVariable* var); BINARYNINJACOREAPI bool BNParseTypeString(BNBinaryView* view, const char* text, - BNQualifiedNameAndType* result, char** errors); - BINARYNINJACOREAPI bool BNParseTypesString(BNBinaryView* view, const char* text, BNTypeParserResult* result, char** errors); + BNQualifiedNameAndType* result, char** errors, BNQualifiedNameList* typesAllowRedefinition); + BINARYNINJACOREAPI bool BNParseTypesString(BNBinaryView* view, const char* text, BNTypeParserResult* result, + char** errors, BNQualifiedNameList typesAllowRedefinition); BINARYNINJACOREAPI void BNFreeQualifiedNameAndType(BNQualifiedNameAndType* obj); BINARYNINJACOREAPI void BNFreeQualifiedNameAndTypeArray(BNQualifiedNameAndType* obj, size_t count); diff --git a/binaryview.cpp b/binaryview.cpp index 102578b7..9374c9b8 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -2446,15 +2446,27 @@ uint64_t BinaryView::GetPreviousDataVariableStartBeforeAddress(uint64_t addr) } -bool BinaryView::ParseTypeString(const string& text, QualifiedNameAndType& result, string& errors) +bool BinaryView::ParseTypeString(const string& text, QualifiedNameAndType& result, string& errors, + const std::set& typesAllowRedefinition) { BNQualifiedNameAndType nt; char* errorStr; - if (!BNParseTypeString(m_object, text.c_str(), &nt, &errorStr)) + BNQualifiedNameList typesList; + typesList.count = typesAllowRedefinition.size(); + typesList.names = new BNQualifiedName[typesList.count]; + size_t i = 0; + for(auto& type : typesAllowRedefinition) + { + typesList.names[i] = type.GetAPIObject(); + i ++; + } + + if (!BNParseTypeString(m_object, text.c_str(), &nt, &errorStr, &typesList)) { errors = errorStr; BNFreeString(errorStr); + delete[] typesList.names; return false; } @@ -2462,12 +2474,14 @@ bool BinaryView::ParseTypeString(const string& text, QualifiedNameAndType& resul result.type = new Type(BNNewTypeReference(nt.type)); errors = ""; BNFreeQualifiedNameAndType(&nt); + delete[] typesList.names; return true; } bool BinaryView::ParseTypeString(const string& source, map>& types, - map>& variables, map>& functions, string& errors) + map>& variables, map>& functions, string& errors, + const std::set& typesAllowRedefinition) { BNTypeParserResult result; char* errorStr = nullptr; @@ -2476,7 +2490,17 @@ bool BinaryView::ParseTypeString(const string& source, map m_results; + std::set m_typesAllowRedefinition; public: - CreateTypeDialog(QWidget* parent, BinaryViewRef data, const QString& title, const QString& definition); + CreateTypeDialog(QWidget* parent, BinaryViewRef data, const QString& title, + const QString& definition, const std::set& typesAllowRedefinition = {}); std::map getResults() { return m_results; } private Q_SLOTS: diff --git a/ui/typeview.h b/ui/typeview.h index 1e3b1c25..bc2fcc10 100644 --- a/ui/typeview.h +++ b/ui/typeview.h @@ -140,7 +140,7 @@ class BINARYNINJAUIAPI TypeView: public QAbstractScrollArea, public View, public void goToAddress(bool selecting); void moveCursorToMouse(QMouseEvent* event, bool selecting); - void createNewTypes(const QString& definition = ""); + void createNewTypes(const QString& definition = "", const std::set& typesAllowRedefinition = {}); void bindActions(); void checkForValidSelection(); -- cgit v1.3.1