summaryrefslogtreecommitdiff
path: root/python/types.py
diff options
context:
space:
mode:
authorXusheng <xusheng@vector35.com>2023-08-03 10:49:32 +0800
committerXusheng <xusheng@vector35.com>2023-08-03 10:49:32 +0800
commit4431ddb07ac63b5cd8da5ff4050e335b5ab4d0ba (patch)
tree0bd3e6cd201bc27817cabc26f7f24fffe94e8aa0 /python/types.py
parentded699dfc4d5e149c8ad4daf467adac1f94e5822 (diff)
Add an API to get structure member including inherited ones. Fix auto structure creation overwrites inherited fields. Close https://github.com/Vector35/binaryninja-api/issues/4540
Diffstat (limited to 'python/types.py')
-rw-r--r--python/types.py33
1 files changed, 32 insertions, 1 deletions
diff --git a/python/types.py b/python/types.py
index 94b90527..97f131e1 100644
--- a/python/types.py
+++ b/python/types.py
@@ -2434,7 +2434,7 @@ class StructureType(Type):
try:
member = core.BNGetStructureMemberAtOffset(self.struct_handle, offset, None)
if member is None:
- raise ValueError(f"No member exists a offset {offset}")
+ raise ValueError(f"No member exists at offset {offset}")
return StructureMember(
Type.create(core.BNNewTypeReference(member.contents.type), confidence=member.contents.typeConfidence),
member.contents.name, member.contents.offset, MemberAccess(member.contents.access),
@@ -2541,6 +2541,37 @@ class StructureType(Type):
core.BNFreeInheritedStructureMemberList(members, count.value)
return result
+ def member_at_offset_including_inherited(self, view: 'binaryview.BinaryView', offset: int) -> InheritedStructureMember:
+ """Returns the member (including inherited member at the specified offset"""
+ member = None
+ try:
+ member = core.BNGetMemberIncludingInheritedAtOffset(self.struct_handle, view.handle, offset)
+ result = None
+ if member is None:
+ raise ValueError(f"No member exists at offset {offset}")
+
+ if member[0].base:
+ const_conf = BoolWithConfidence.get_core_struct(False, 0)
+ volatile_conf = BoolWithConfidence.get_core_struct(False, 0)
+ handle = core.BNCreateNamedTypeReference(member[0].base, 0, 1, const_conf, volatile_conf)
+ base_type = NamedTypeReferenceType(handle, self.platform)
+ else:
+ base_type = None
+
+ result = InheritedStructureMember(
+ base_type,
+ member[0].baseOffset,
+ StructureMember(
+ Type.create(core.BNNewTypeReference(member[0].member.type), confidence=member[0].member.typeConfidence),
+ member[0].member.name, member[0].member.offset, MemberAccess(member[0].member.access),
+ MemberScope(member[0].member.scope)
+ ),
+ member[0].memberIndex
+ )
+ finally:
+ core.BNFreeInheritedStructureMember(member)
+ return result
+
def with_replaced_structure(self, from_struct, to_struct) -> 'StructureType':
return StructureType(
core.BNStructureWithReplacedStructure(self.struct_handle, from_struct.handle, to_struct.handle)