diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/binaryview.py | 74 | ||||
| -rw-r--r-- | python/types.py | 5 |
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: |
