summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/binaryview.py74
-rw-r--r--python/types.py5
2 files changed, 78 insertions, 1 deletions
diff --git a/python/binaryview.py b/python/binaryview.py
index d7d2a2a8..de434074 100644
--- a/python/binaryview.py
+++ b/python/binaryview.py
@@ -4979,6 +4979,80 @@ class BinaryView:
finally:
core.BNFreeTypeFieldReferenceTypes(refs, count.value)
+ def get_outgoing_direct_type_references(self, name: '_types.QualifiedNameType') -> List['_types.QualifiedName']:
+ qname = _types.QualifiedName(name)
+ _qname = qname._to_core_struct()
+ count = ctypes.c_ulonglong(0)
+ _result = core.BNGetOutgoingDirectTypeReferences(self.handle, _qname, count)
+ assert _result is not None, "core.BNGetOutgoingDirectTypeReferences returned None"
+ try:
+ result = []
+ for i in range(0, count.value):
+ result_name = _types.QualifiedName._from_core_struct(_result[i])
+ result.append(result_name)
+ return result
+ finally:
+ core.BNFreeTypeNameList(_result, count.value)
+
+ def get_outgoing_recursive_type_references(self, names: Union['_types.QualifiedNameType', List['_types.QualifiedNameType']]) -> List['_types.QualifiedName']:
+ qnames = []
+ if isinstance(names, list):
+ for name in names:
+ qnames.append(_types.QualifiedName(name))
+ else:
+ qnames.append(_types.QualifiedName(names))
+ _qnames = (core.BNQualifiedName * len(qnames))()
+ for i, qname in enumerate(qnames):
+ _qnames[i] = qname._to_core_struct()
+ count = ctypes.c_ulonglong(0)
+ _result = core.BNGetOutgoingRecursiveTypeReferences(self.handle, _qnames, len(qnames), count)
+ assert _result is not None, "core.BNGetOutgoingRecursiveTypeReferences returned None"
+ try:
+ result = []
+ for i in range(0, count.value):
+ result_name = _types.QualifiedName._from_core_struct(_result[i])
+ result.append(result_name)
+ return result
+ finally:
+ core.BNFreeTypeNameList(_result, count.value)
+
+ def get_incoming_direct_type_references(self, name: '_types.QualifiedNameType') -> List['_types.QualifiedName']:
+ qname = _types.QualifiedName(name)
+ _qname = qname._to_core_struct()
+ count = ctypes.c_ulonglong(0)
+ _result = core.BNGetIncomingDirectTypeReferences(self.handle, _qname, count)
+ assert _result is not None, "core.BNGetIncomingDirectTypeReferences returned None"
+ try:
+ result = []
+ for i in range(0, count.value):
+ result_name = _types.QualifiedName._from_core_struct(_result[i])
+ result.append(result_name)
+ return result
+ finally:
+ core.BNFreeTypeNameList(_result, count.value)
+
+ def get_incoming_recursive_type_references(self, names: Union['_types.QualifiedNameType', List['_types.QualifiedNameType']]) -> List['_types.QualifiedName']:
+ qnames = []
+ if isinstance(names, list):
+ for name in names:
+ qnames.append(_types.QualifiedName(name))
+ else:
+ qnames.append(_types.QualifiedName(names))
+ _qnames = (core.BNQualifiedName * len(qnames))()
+ for i, qname in enumerate(qnames):
+ _qnames[i] = qname._to_core_struct()
+ count = ctypes.c_ulonglong(0)
+ _result = core.BNGetIncomingRecursiveTypeReferences(self.handle, _qnames, len(qnames), count)
+ assert _result is not None, "core.BNGetIncomingRecursiveTypeReferences returned None"
+ try:
+ result = []
+ for i in range(0, count.value):
+ result_name = _types.QualifiedName._from_core_struct(_result[i])
+ result.append(result_name)
+ return result
+ finally:
+ core.BNFreeTypeNameList(_result, count.value)
+
def create_structure_from_offset_access(self, name: '_types.QualifiedName') -> '_types.StructureType':
newMemberAdded = ctypes.c_bool(False)
_name = _types.QualifiedName(name)._to_core_struct()
diff --git a/python/types.py b/python/types.py
index 9fbe7a93..68858ac8 100644
--- a/python/types.py
+++ b/python/types.py
@@ -237,6 +237,7 @@ class TypeDefinitionLine:
line_type: TypeDefinitionLineType
tokens: List['_function.InstructionTextToken']
type: 'Type'
+ parent_type: 'Type'
root_type: 'Type'
root_type_name: str
base_type: Optional['NamedTypeReferenceType']
@@ -254,6 +255,7 @@ class TypeDefinitionLine:
def _from_core_struct(struct: core.BNTypeDefinitionLine, platform: Optional[_platform.Platform] = None):
tokens = _function.InstructionTextToken._from_core_struct(struct.tokens, struct.count)
type_ = Type.create(handle=core.BNNewTypeReference(struct.type), platform=platform)
+ parent_type = Type.create(handle=core.BNNewTypeReference(struct.parentType), platform=platform)
root_type = Type.create(handle=core.BNNewTypeReference(struct.rootType), platform=platform)
root_type_name = core.pyNativeStr(struct.rootTypeName)
if struct.baseType:
@@ -263,7 +265,7 @@ class TypeDefinitionLine:
base_type = NamedTypeReferenceType(handle, platform)
else:
base_type = None
- return TypeDefinitionLine(struct.lineType, tokens, type_, root_type, root_type_name, base_type,
+ return TypeDefinitionLine(struct.lineType, tokens, type_, parent_type, root_type, root_type_name, base_type,
struct.baseOffset, struct.offset, struct.fieldIndex)
def _to_core_struct(self):
@@ -272,6 +274,7 @@ class TypeDefinitionLine:
struct.tokens = _function.InstructionTextToken._get_core_struct(self.tokens)
struct.count = len(self.tokens)
struct.type = core.BNNewTypeReference(self.type.handle)
+ struct.parentType = core.BNNewTypeReference(self.parent_type.handle)
struct.rootType = core.BNNewTypeReference(self.root_type.handle)
struct.rootTypeName = self.root_type_name
if self.base_type is None: