From e34e52c2f797c9b97b592abb311e3a5bc2194b4a Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Fri, 5 Apr 2019 21:55:47 -0400 Subject: Add API for geting a list of type names without the associated objects --- binaryninjaapi.h | 1 + binaryninjacore.h | 2 ++ binaryview.cpp | 17 +++++++++++++++++ python/binaryview.py | 11 +++++++++++ 4 files changed, 31 insertions(+) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 65cba272..9fe63e43 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1432,6 +1432,7 @@ namespace BinaryNinja bool ParseTypeString(const std::string& text, std::map>& result, std::string& errors); std::map> GetTypes(); + std::vector GetTypeNames(const std::string& matching=""); Ref GetTypeByName(const QualifiedName& name); Ref GetTypeById(const std::string& id); std::string GetTypeId(const QualifiedName& name); diff --git a/binaryninjacore.h b/binaryninjacore.h index eadc4b2e..8422cdfc 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -2815,6 +2815,8 @@ extern "C" BINARYNINJACOREAPI BNQualifiedNameAndType* BNGetAnalysisTypeList(BNBinaryView* view, size_t* count); BINARYNINJACOREAPI void BNFreeTypeList(BNQualifiedNameAndType* types, size_t count); + BINARYNINJACOREAPI BNQualifiedName* BNGetAnalysisTypeNames(BNBinaryView* view, size_t* count, const char* matching); + BINARYNINJACOREAPI void BNFreeTypeNameList(BNQualifiedName* names, size_t count); BINARYNINJACOREAPI BNType* BNGetAnalysisTypeByName(BNBinaryView* view, BNQualifiedName* name); BINARYNINJACOREAPI BNType* BNGetAnalysisTypeById(BNBinaryView* view, const char* id); BINARYNINJACOREAPI char* BNGetAnalysisTypeId(BNBinaryView* view, BNQualifiedName* name); diff --git a/binaryview.cpp b/binaryview.cpp index 3bf61f34..1c345dfb 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -1928,6 +1928,23 @@ map> BinaryView::GetTypes() } +vector BinaryView::GetTypeNames(const string& matching) +{ + size_t count; + BNQualifiedName* names = BNGetAnalysisTypeNames(m_object, &count, matching.c_str()); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + result.push_back(QualifiedName::FromAPIObject(&names[i])); + } + + BNFreeTypeNameList(names, count); + return result; +} + + Ref BinaryView::GetTypeByName(const QualifiedName& name) { BNQualifiedName nameObj = name.GetAPIObject(); diff --git a/python/binaryview.py b/python/binaryview.py index 373823c8..c92a9120 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -1196,6 +1196,17 @@ class BinaryView(object): core.BNFreeTypeList(type_list, count.value) return result + @property + def type_names(self): + """List of defined type names (read-only)""" + count = ctypes.c_ulonglong(0) + name_list = core.BNGetAnalysisTypeNames(self.handle, count, "") + result = [] + for i in range(0, count.value): + result.append(types.QualifiedName._from_core_struct(name_list[i])) + core.BNFreeTypeNameList(name_list, count.value) + return result + @property def segments(self): """List of segments (read-only)""" -- cgit v1.3.1