From 844e1aa5b4f89de2ffc1990824b094c553068642 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Wed, 11 Jan 2017 21:18:08 -0500 Subject: Create qualified name object --- binaryninjaapi.h | 95 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 65 insertions(+), 30 deletions(-) (limited to 'binaryninjaapi.h') diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 15c86a58..478cc090 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -277,6 +277,7 @@ namespace BinaryNinja class MainThreadAction; class MainThreadActionHandler; class InteractionHandler; + class QualifiedName; struct FormInputField; /*! Logs to the error console with the given BNLogLevel. @@ -368,7 +369,7 @@ namespace BinaryNinja bool DemangleMS(Architecture* arch, const std::string& mangledName, Type** outType, - std::vector& outVarName); + QualifiedName& outVarName); void RegisterMainThread(MainThreadActionHandler* handler); Ref ExecuteOnMainThread(const std::function& action); @@ -408,6 +409,47 @@ namespace BinaryNinja BNMessageBoxButtonResult ShowMessageBox(const std::string& title, const std::string& text, BNMessageBoxButtonSet buttons = OKButtonSet, BNMessageBoxIcon icon = InformationIcon); + class QualifiedName + { + std::vector m_name; + + public: + QualifiedName(); + QualifiedName(const std::string& name); + QualifiedName(const std::vector& name); + QualifiedName(const QualifiedName& name); + + QualifiedName& operator=(const std::string& name); + QualifiedName& operator=(const std::vector& name); + QualifiedName& operator=(const QualifiedName& name); + + bool operator==(const QualifiedName& other) const; + bool operator!=(const QualifiedName& other) const; + bool operator<(const QualifiedName& other) const; + + QualifiedName operator+(const QualifiedName& other) const; + + std::string& operator[](size_t i); + const std::string& operator[](size_t i) const; + std::vector::iterator begin(); + std::vector::iterator end(); + std::vector::const_iterator begin() const; + std::vector::const_iterator end() const; + std::string& front(); + const std::string& front() const; + std::string& back(); + const std::string& back() const; + void insert(std::vector::iterator loc, const std::string& name); + void insert(std::vector::iterator loc, std::vector::iterator b, + std::vector::iterator e); + void erase(std::vector::iterator i); + void clear(); + void push_back(const std::string& name); + size_t size() const; + + std::string GetString() const; + }; + class DataBuffer { BNDataBuffer* m_buffer; @@ -610,8 +652,8 @@ namespace BinaryNinja virtual void OnDataVariableUpdated(BinaryView* view, const DataVariable& var) { (void)view; (void)var; } virtual void OnStringFound(BinaryView* data, BNStringType type, uint64_t offset, size_t len) { (void)data; (void)type; (void)offset; (void)len; } virtual void OnStringRemoved(BinaryView* data, BNStringType type, uint64_t offset, size_t len) { (void)data; (void)type; (void)offset; (void)len; } - virtual void OnTypeDefined(BinaryView* data, const std::vector& name, Type* type) { (void)data; (void)name; (void)type; } - virtual void OnTypeUndefined(BinaryView* data, const std::vector& name, Type* type) { (void)data; (void)name; (void)type; } + virtual void OnTypeDefined(BinaryView* data, const QualifiedName& name, Type* type) { (void)data; (void)name; (void)type; } + virtual void OnTypeUndefined(BinaryView* data, const QualifiedName& name, Type* type) { (void)data; (void)name; (void)type; } }; class FileAccessor @@ -979,19 +1021,13 @@ namespace BinaryNinja bool ParseTypeString(const std::string& text, QualifiedNameAndType& result, std::string& errors); - std::map, Ref> GetTypes(); - Ref GetTypeByName(const std::string& name); - Ref GetTypeByName(const std::vector& name); - bool IsTypeAutoDefined(const std::string& name); - bool IsTypeAutoDefined(const std::vector& name); - void DefineType(const std::string& name, Ref type); - void DefineType(const std::vector& name, Ref type); - void DefineUserType(const std::string& name, Ref type); - void DefineUserType(const std::vector& name, Ref type); - void UndefineType(const std::string& name); - void UndefineType(const std::vector& name); - void UndefineUserType(const std::string& name); - void UndefineUserType(const std::vector& name); + std::map> GetTypes(); + Ref GetTypeByName(const QualifiedName& name); + bool IsTypeAutoDefined(const QualifiedName& name); + void DefineType(const QualifiedName& name, Ref type); + void DefineUserType(const QualifiedName& name, Ref type); + void UndefineType(const QualifiedName& name); + void UndefineUserType(const QualifiedName& name); bool FindNextData(uint64_t start, const DataBuffer& data, uint64_t& result, BNFindFlag flags = NoFindFlags); @@ -1441,14 +1477,14 @@ namespace BinaryNinja void SetBinaryViewTypeConstant(const std::string& type, const std::string& name, uint64_t value); bool ParseTypesFromSource(const std::string& source, const std::string& fileName, - std::map, Ref>& types, - std::map, Ref>& variables, - std::map, Ref>& functions, std::string& errors, + std::map>& types, + std::map>& variables, + std::map>& functions, std::string& errors, const std::vector& includeDirs = std::vector()); bool ParseTypesFromSourceFile(const std::string& fileName, - std::map, Ref>& types, - std::map, Ref>& variables, - std::map, Ref>& functions, std::string& errors, + std::map>& types, + std::map>& variables, + std::map>& functions, std::string& errors, const std::vector& includeDirs = std::vector()); void RegisterCallingConvention(CallingConvention* cc); @@ -1523,7 +1559,7 @@ namespace BinaryNinja struct QualifiedNameAndType { - std::vector name; + QualifiedName name; Ref type; }; @@ -1553,7 +1589,7 @@ namespace BinaryNinja void SetFunctionCanReturn(bool canReturn); std::string GetString() const; - std::string GetTypeAndName(const std::vector& name) const; + std::string GetTypeAndName(const QualifiedName& name) const; std::string GetStringBeforeName() const; std::string GetStringAfterName() const; @@ -1569,15 +1605,13 @@ namespace BinaryNinja static Ref FloatType(size_t width, const std::string& typeName = ""); static Ref StructureType(Structure* strct); static Ref NamedType(NamedTypeReference* ref, size_t width = 0, size_t align = 1); - static Ref NamedType(const std::vector& name, Type* type); + static Ref NamedType(const QualifiedName& name, Type* type); static Ref EnumerationType(Architecture* arch, Enumeration* enm, size_t width = 0, bool issigned = false); static Ref PointerType(Architecture* arch, Type* type, bool cnst = false, bool vltl = false, BNReferenceType refType = PointerReferenceType); static Ref ArrayType(Type* type, uint64_t elem); static Ref FunctionType(Type* returnValue, CallingConvention* callingConvention, const std::vector& params, bool varArg = false); - - static std::string GetQualifiedName(const std::vector& names); }; class NamedTypeReference: public CoreRefCountObject& name = {}); + NamedTypeReference(BNNamedTypeReferenceClass cls = UnknownNamedTypeClass, + const QualifiedName& name = QualifiedName()); BNNamedTypeReferenceClass GetTypeClass() const; void SetTypeClass(BNNamedTypeReferenceClass cls); - std::vector GetName() const; - void SetName(const std::vector& name); + QualifiedName GetName() const; + void SetName(const QualifiedName& name); }; struct StructureMember -- cgit v1.3.1