From f4356935159fd38d8d4d8f13d8453df850502c5e Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Tue, 9 Nov 2021 13:19:34 -0500 Subject: Add support for passing list of types to StructureBuilder\StructureType .create() --- python/types.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'python') diff --git a/python/types.py b/python/types.py index 5eba9b8d..a54bbc60 100644 --- a/python/types.py +++ b/python/types.py @@ -42,7 +42,7 @@ BoolWithConfidenceType = Union[bool, 'BoolWithConfidence'] SizeWithConfidenceType = Union[int, 'SizeWithConfidence'] OffsetWithConfidenceType = Union[int, 'OffsetWithConfidence'] ParamsType = Union[List['Type'], List['FunctionParameter'], List[Tuple['Type', str]]] -MembersType = Union[List['StructureMember'], List[Tuple['Type', str]]] +MembersType = Union[List['StructureMember'], List['Type'], List[Tuple['Type', str]]] EnumMembersType = Union[List[Tuple[str,int]], List[str], List['EnumerationMember']] SomeType = Union['TypeBuilder', 'Type'] TypeContainer = Union['binaryview.BinaryView', 'typelibrary.TypeLibrary'] @@ -1003,6 +1003,10 @@ class StructureBuilder(TypeBuilder): elif isinstance(member, StructureMember): core.BNAddStructureBuilderMemberAtOffset(structure_builder_handle, member.type._to_core_struct(), member.name, member.offset, False, member.access, member.scope) + elif isinstance(member, (TypeBuilder, Type)): + core.BNAddStructureBuilderMember(structure_builder_handle, member._to_core_struct(), "", MemberAccess.NoAccess, MemberScope.NoScope) + else: + assert False, f"Structure member type {type(member)} not supported" type_builder_handle = core.BNCreateStructureTypeBuilderWithBuilder(structure_builder_handle) assert type_builder_handle is not None, "core.BNCreateStructureTypeBuilderWithBuilder returned None" return cls(type_builder_handle, structure_builder_handle, platform, confidence) @@ -1866,7 +1870,10 @@ class StructureType(Type): elif isinstance(member, StructureMember): core.BNAddStructureBuilderMemberAtOffset(builder, member.type._to_core_struct(), member.name, member.offset, False, member.access, member.scope) - + elif isinstance(member, (TypeBuilder, Type)): + core.BNAddStructureBuilderMember(builder, member._to_core_struct(), "", MemberAccess.NoAccess, MemberScope.NoScope) + else: + assert False, f"Structure member type {type(member)} not supported" core_struct = core.BNFinalizeStructureBuilder(builder) assert core_struct is not None, "core.BNFinalizeStructureBuilder returned None" core_type = core.BNCreateStructureType(core_struct) -- cgit v1.3.1