summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--architecture.cpp9
-rw-r--r--binaryninjaapi.h17
-rw-r--r--binaryninjacore.h16
-rw-r--r--binaryview.cpp6
-rw-r--r--platform.cpp28
-rw-r--r--python/architecture.py12
-rw-r--r--python/binaryview.py16
-rw-r--r--python/platform.py12
-rw-r--r--python/types.py18
-rw-r--r--type.cpp26
10 files changed, 114 insertions, 46 deletions
diff --git a/architecture.cpp b/architecture.cpp
index 0e25fa85..d72e7f42 100644
--- a/architecture.cpp
+++ b/architecture.cpp
@@ -747,7 +747,8 @@ void Architecture::SetBinaryViewTypeConstant(const string& type, const string& n
bool Architecture::ParseTypesFromSource(const string& source, const string& fileName,
map<QualifiedName, Ref<Type>>& types, map<QualifiedName, Ref<Type>>& variables,
- map<QualifiedName, Ref<Type>>& functions, string& errors, const vector<string>& includeDirs)
+ map<QualifiedName, Ref<Type>>& functions, string& errors, const vector<string>& includeDirs,
+ const string& autoTypeSource)
{
BNTypeParserResult result;
char* errorStr;
@@ -761,7 +762,7 @@ bool Architecture::ParseTypesFromSource(const string& source, const string& file
functions.clear();
bool ok = BNParseTypesFromSource(m_object, source.c_str(), fileName.c_str(), &result,
- &errorStr, includeDirList, includeDirs.size());
+ &errorStr, includeDirList, includeDirs.size(), autoTypeSource.c_str());
errors = errorStr;
BNFreeString(errorStr);
if (!ok)
@@ -789,7 +790,7 @@ bool Architecture::ParseTypesFromSource(const string& source, const string& file
bool Architecture::ParseTypesFromSourceFile(const string& fileName, map<QualifiedName, Ref<Type>>& types,
map<QualifiedName, Ref<Type>>& variables, map<QualifiedName, Ref<Type>>& functions,
- string& errors, const vector<string>& includeDirs)
+ string& errors, const vector<string>& includeDirs, const string& autoTypeSource)
{
BNTypeParserResult result;
char* errorStr;
@@ -803,7 +804,7 @@ bool Architecture::ParseTypesFromSourceFile(const string& fileName, map<Qualifie
functions.clear();
bool ok = BNParseTypesFromSourceFile(m_object, fileName.c_str(), &result, &errorStr,
- includeDirList, includeDirs.size());
+ includeDirList, includeDirs.size(), autoTypeSource.c_str());
errors = errorStr;
BNFreeString(errorStr);
if (!ok)
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 92eeba30..ed9cedc5 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -1039,6 +1039,8 @@ namespace BinaryNinja
void UndefineUserType(const QualifiedName& name);
void RenameType(const QualifiedName& oldName, const QualifiedName& newName);
+ void RegisterPlatformTypes(Platform* platform);
+
bool FindNextData(uint64_t start, const DataBuffer& data, uint64_t& result, BNFindFlag flags = NoFindFlags);
void Reanalyze();
@@ -1491,12 +1493,14 @@ namespace BinaryNinja
std::map<QualifiedName, Ref<Type>>& types,
std::map<QualifiedName, Ref<Type>>& variables,
std::map<QualifiedName, Ref<Type>>& functions, std::string& errors,
- const std::vector<std::string>& includeDirs = std::vector<std::string>());
+ const std::vector<std::string>& includeDirs = std::vector<std::string>(),
+ const std::string& autoTypeSource = "");
bool ParseTypesFromSourceFile(const std::string& fileName,
std::map<QualifiedName, Ref<Type>>& types,
std::map<QualifiedName, Ref<Type>>& variables,
std::map<QualifiedName, Ref<Type>>& functions, std::string& errors,
- const std::vector<std::string>& includeDirs = std::vector<std::string>());
+ const std::vector<std::string>& includeDirs = std::vector<std::string>(),
+ const std::string& autoTypeSource = "");
void RegisterCallingConvention(CallingConvention* cc);
std::vector<Ref<CallingConvention>> GetCallingConventions();
@@ -1627,8 +1631,8 @@ namespace BinaryNinja
const std::vector<NameAndType>& params, bool varArg = false);
static std::string GenerateAutoTypeId(const std::string& source, const QualifiedName& name);
- static std::string GenerateAutoPlatformTypeId(const QualifiedName& name);
static std::string GenerateAutoDemangledTypeId(const QualifiedName& name);
+ static std::string GetAutoDemangledTypeIdSource();
};
class NamedTypeReference: public CoreRefCountObject<BNNamedTypeReference, BNNewNamedTypeReference,
@@ -1647,8 +1651,6 @@ namespace BinaryNinja
static Ref<NamedTypeReference> GenerateAutoTypeReference(BNNamedTypeReferenceClass cls,
const std::string& source, const QualifiedName& name);
- static Ref<NamedTypeReference> GenerateAutoPlatformTypeReference(BNNamedTypeReferenceClass cls,
- const QualifiedName& name);
static Ref<NamedTypeReference> GenerateAutoDemangledTypeReference(BNNamedTypeReferenceClass cls,
const QualifiedName& name);
};
@@ -2339,6 +2341,11 @@ namespace BinaryNinja
Ref<Platform> GetRelatedPlatform(Architecture* arch);
void AddRelatedPlatform(Architecture* arch, Platform* platform);
Ref<Platform> GetAssociatedPlatformByAddress(uint64_t& addr);
+
+ std::string GenerateAutoPlatformTypeId(const QualifiedName& name);
+ Ref<NamedTypeReference> GenerateAutoPlatformTypeReference(BNNamedTypeReferenceClass cls,
+ const QualifiedName& name);
+ std::string GetAutoPlatformTypeIdSource();
};
class ScriptingOutputListener
diff --git a/binaryninjacore.h b/binaryninjacore.h
index b454da64..4b810002 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -1820,8 +1820,12 @@ extern "C"
BINARYNINJACOREAPI void BNUndefineUserAnalysisType(BNBinaryView* view, BNQualifiedName* name);
BINARYNINJACOREAPI void BNRenameAnalysisType(BNBinaryView* view, BNQualifiedName* oldName, BNQualifiedName* newName);
BINARYNINJACOREAPI char* BNGenerateAutoTypeId(const char* source, BNQualifiedName* name);
- BINARYNINJACOREAPI char* BNGenerateAutoPlatformTypeId(BNQualifiedName* name);
+ BINARYNINJACOREAPI char* BNGenerateAutoPlatformTypeId(BNPlatform* platform, BNQualifiedName* name);
BINARYNINJACOREAPI char* BNGenerateAutoDemangledTypeId(BNQualifiedName* name);
+ BINARYNINJACOREAPI char* BNGetAutoPlatformTypeIdSource(BNPlatform* platform);
+ BINARYNINJACOREAPI char* BNGetAutoDemangledTypeIdSource(void);
+
+ BINARYNINJACOREAPI void BNRegisterPlatformTypes(BNBinaryView* view, BNPlatform* platform);
BINARYNINJACOREAPI void BNReanalyzeAllFunctions(BNBinaryView* view);
BINARYNINJACOREAPI void BNReanalyzeFunction(BNFunction* func);
@@ -2063,13 +2067,13 @@ extern "C"
// Source code processing
BINARYNINJACOREAPI bool BNPreprocessSource(const char* source, const char* fileName, char** output, char** errors,
- const char** includeDirs, size_t includeDirCount);
+ const char** includeDirs, size_t includeDirCount);
BINARYNINJACOREAPI bool BNParseTypesFromSource(BNArchitecture* arch, const char* source, const char* fileName,
- BNTypeParserResult* result, char** errors,
- const char** includeDirs, size_t includeDirCount);
+ BNTypeParserResult* result, char** errors, const char** includeDirs, size_t includeDirCount,
+ const char* autoTypeSource);
BINARYNINJACOREAPI bool BNParseTypesFromSourceFile(BNArchitecture* arch, const char* fileName,
- BNTypeParserResult* result, char** errors,
- const char** includeDirs, size_t includeDirCount);
+ BNTypeParserResult* result, char** errors, const char** includeDirs, size_t includeDirCount,
+ const char* autoTypeSource);
BINARYNINJACOREAPI void BNFreeTypeParserResult(BNTypeParserResult* result);
// Updates
diff --git a/binaryview.cpp b/binaryview.cpp
index 1b1574e1..8edbc2bf 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -1577,6 +1577,12 @@ void BinaryView::RenameType(const QualifiedName& oldName, const QualifiedName& n
}
+void BinaryView::RegisterPlatformTypes(Platform* platform)
+{
+ BNRegisterPlatformTypes(m_object, platform->GetObject());
+}
+
+
bool BinaryView::FindNextData(uint64_t start, const DataBuffer& data, uint64_t& result, BNFindFlag flags)
{
return BNFindNextData(m_object, start, data.GetBufferObject(), &result, flags);
diff --git a/platform.cpp b/platform.cpp
index 7a6571cc..3bf4c0a4 100644
--- a/platform.cpp
+++ b/platform.cpp
@@ -253,3 +253,31 @@ Ref<Platform> Platform::GetAssociatedPlatformByAddress(uint64_t& addr)
return nullptr;
return new Platform(platform);
}
+
+
+string Platform::GenerateAutoPlatformTypeId(const QualifiedName& name)
+{
+ BNQualifiedName nameObj = name.GetAPIObject();
+ char* str = BNGenerateAutoPlatformTypeId(m_object, &nameObj);
+ string result = str;
+ QualifiedName::FreeAPIObject(&nameObj);
+ BNFreeString(str);
+ return result;
+}
+
+
+Ref<NamedTypeReference> Platform::GenerateAutoPlatformTypeReference(BNNamedTypeReferenceClass cls,
+ const QualifiedName& name)
+{
+ string id = GenerateAutoPlatformTypeId(name);
+ return new NamedTypeReference(cls, id, name);
+}
+
+
+string Platform::GetAutoPlatformTypeIdSource()
+{
+ char* str = BNGetAutoPlatformTypeIdSource(m_object);
+ string result = str;
+ BNFreeString(str);
+ return result;
+}
diff --git a/python/architecture.py b/python/architecture.py
index ea97f605..4cd0c597 100644
--- a/python/architecture.py
+++ b/python/architecture.py
@@ -1585,7 +1585,7 @@ class Architecture(object):
"""
core.BNSetBinaryViewTypeArchitectureConstant(self.handle, type_name, const_name, value)
- def parse_types_from_source(self, source, filename=None, include_dirs=[]):
+ def parse_types_from_source(self, source, filename=None, include_dirs=[], auto_type_source=None):
"""
``parse_types_from_source`` parses the source string and any needed headers searching for them in
the optional list of directories provided in ``include_dirs``.
@@ -1593,6 +1593,7 @@ class Architecture(object):
:param str source: source string to be parsed
:param str filename: optional source filename
:param list(str) include_dirs: optional list of string filename include directories
+ :param str auto_type_source: optional source of types if used for automatically generated types
:return: py:class:`TypeParserResult` (a SyntaxError is thrown on parse error)
:rtype: TypeParserResult
:Example:
@@ -1610,7 +1611,8 @@ class Architecture(object):
dir_buf[i] = str(include_dirs[i])
parse = core.BNTypeParserResult()
errors = ctypes.c_char_p()
- result = core.BNParseTypesFromSource(self.handle, source, filename, parse, errors, dir_buf, len(include_dirs))
+ result = core.BNParseTypesFromSource(self.handle, source, filename, parse, errors, dir_buf,
+ len(include_dirs), auto_type_source)
error_str = errors.value
core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
if not result:
@@ -1630,13 +1632,14 @@ class Architecture(object):
core.BNFreeTypeParserResult(parse)
return types.TypeParserResult(type_dict, variables, functions)
- def parse_types_from_source_file(self, filename, include_dirs=[]):
+ def parse_types_from_source_file(self, filename, include_dirs=[], auto_type_source=None):
"""
``parse_types_from_source_file`` parses the source file ``filename`` and any needed headers searching for them in
the optional list of directories provided in ``include_dirs``.
:param str filename: filename of file to be parsed
:param list(str) include_dirs: optional list of string filename include directories
+ :param str auto_type_source: optional source of types if used for automatically generated types
:return: py:class:`TypeParserResult` (a SyntaxError is thrown on parse error)
:rtype: TypeParserResult
:Example:
@@ -1654,7 +1657,8 @@ class Architecture(object):
dir_buf[i] = str(include_dirs[i])
parse = core.BNTypeParserResult()
errors = ctypes.c_char_p()
- result = core.BNParseTypesFromSourceFile(self.handle, filename, parse, errors, dir_buf, len(include_dirs))
+ result = core.BNParseTypesFromSourceFile(self.handle, filename, parse, errors, dir_buf,
+ len(include_dirs), auto_type_source)
error_str = errors.value
core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte)))
if not result:
diff --git a/python/binaryview.py b/python/binaryview.py
index 2cdacb4c..caa5d780 100644
--- a/python/binaryview.py
+++ b/python/binaryview.py
@@ -3077,6 +3077,22 @@ class BinaryView(object):
new_name = types.QualifiedName(new_name)._get_core_struct()
core.BNRenameAnalysisType(self.handle, old_name, new_name)
+ def register_platform_types(self, platform):
+ """
+ ``register_platform_types`` ensures that the platform-specific types for a :py:Class:`Platform` are available
+ for the current :py:Class:`BinaryView`. This is automatically performed when adding a new function or setting
+ the default platform.
+
+ :param Platform platform: Platform containing types to be registered
+ :rtype: None
+ :Example:
+
+ >>> platform = Platform["linux-x86"]
+ >>> bv.register_platform_types(platform)
+ >>>
+ """
+ core.BNRegisterPlatformTypes(self.handle, platform.handle)
+
def find_next_data(self, start, data, flags = 0):
"""
``find_next_data`` searchs for the bytes in data starting at the virtual address ``start`` either, case-sensitive,
diff --git a/python/platform.py b/python/platform.py
index 04dce587..5d90997d 100644
--- a/python/platform.py
+++ b/python/platform.py
@@ -25,6 +25,7 @@ import _binaryninjacore as core
import startup
import architecture
import callingconvention
+import types
class _PlatformMetaClass(type):
@@ -259,3 +260,14 @@ class Platform(object):
new_addr.value = addr
result = core.BNGetAssociatedPlatformByAddress(self.handle, new_addr)
return Platform(None, handle = result), new_addr.value
+
+ def generate_auto_platform_type_id(self, name):
+ name = types.QualifiedName(name)._get_core_struct()
+ return core.BNGenerateAutoPlatformTypeId(self.handle, name)
+
+ def generate_auto_platform_type_ref(self, type_class, name):
+ type_id = self.generate_auto_platform_type_id(name)
+ return types.NamedTypeReference(type_class, type_id, name)
+
+ def get_auto_platform_type_id_source(self):
+ return core.BNGetAutoPlatformTypeIdSource(self.handle)
diff --git a/python/types.py b/python/types.py
index 1cc02691..f66625f8 100644
--- a/python/types.py
+++ b/python/types.py
@@ -446,14 +446,13 @@ class Type(object):
return core.BNGenerateAutoTypeId(source, name)
@classmethod
- def generate_auto_platform_type_id(self, name):
+ def generate_auto_demangled_type_id(self, name):
name = QualifiedName(name)._get_core_struct()
- return core.BNGenerateAutoTypeId(name)
+ return core.BNGenerateAutoDemangledTypeId(name)
@classmethod
- def generate_auto_demangled_type_id(self, name):
- name = QualifiedName(name)._get_core_struct()
- return core.BNGenerateAutoTypeId(name)
+ def get_auto_demanged_type_id_source(self):
+ return core.BNGetAutoDemangledTypeIdSource()
def __setattr__(self, name, value):
try:
@@ -523,13 +522,8 @@ class NamedTypeReference(object):
return NamedTypeReference(type_class, type_id, name)
@classmethod
- def generate_auto_platform_type_ref(self, type_class, source, name):
- type_id = Type.generate_auto_platform_type_id(source, name)
- return NamedTypeReference(type_class, type_id, name)
-
- @classmethod
- def generate_auto_demangled_type_ref(self, type_class, source, name):
- type_id = Type.generate_auto_demangled_type_id(source, name)
+ def generate_auto_demangled_type_ref(self, type_class, name):
+ type_id = Type.generate_auto_demangled_type_id(name)
return NamedTypeReference(type_class, type_id, name)
diff --git a/type.cpp b/type.cpp
index dd1fb8d6..66138001 100644
--- a/type.cpp
+++ b/type.cpp
@@ -580,26 +580,30 @@ void Type::SetFunctionCanReturn(bool canReturn)
string Type::GenerateAutoTypeId(const string& source, const QualifiedName& name)
{
BNQualifiedName nameObj = name.GetAPIObject();
- string result = BNGenerateAutoTypeId(source.c_str(), &nameObj);
+ char* str = BNGenerateAutoTypeId(source.c_str(), &nameObj);
+ string result = str;
QualifiedName::FreeAPIObject(&nameObj);
+ BNFreeString(str);
return result;
}
-string Type::GenerateAutoPlatformTypeId(const QualifiedName& name)
+string Type::GenerateAutoDemangledTypeId(const QualifiedName& name)
{
BNQualifiedName nameObj = name.GetAPIObject();
- string result = BNGenerateAutoPlatformTypeId(&nameObj);
+ char* str = BNGenerateAutoDemangledTypeId(&nameObj);
+ string result = str;
QualifiedName::FreeAPIObject(&nameObj);
+ BNFreeString(str);
return result;
}
-string Type::GenerateAutoDemangledTypeId(const QualifiedName& name)
+string Type::GetAutoDemangledTypeIdSource()
{
- BNQualifiedName nameObj = name.GetAPIObject();
- string result = BNGenerateAutoDemangledTypeId(&nameObj);
- QualifiedName::FreeAPIObject(&nameObj);
+ char* str = BNGetAutoDemangledTypeIdSource();
+ string result = str;
+ BNFreeString(str);
return result;
}
@@ -679,14 +683,6 @@ Ref<NamedTypeReference> NamedTypeReference::GenerateAutoTypeReference(BNNamedTyp
}
-Ref<NamedTypeReference> NamedTypeReference::GenerateAutoPlatformTypeReference(BNNamedTypeReferenceClass cls,
- const QualifiedName& name)
-{
- string id = Type::GenerateAutoPlatformTypeId(name);
- return new NamedTypeReference(cls, id, name);
-}
-
-
Ref<NamedTypeReference> NamedTypeReference::GenerateAutoDemangledTypeReference(BNNamedTypeReferenceClass cls,
const QualifiedName& name)
{