summaryrefslogtreecommitdiff
path: root/python/types.py
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2023-04-10 15:10:01 -0400
committerPeter LaFosse <peter@vector35.com>2023-04-18 08:43:13 -0400
commit72f2b74a7ab8e3494b2eae7470ce147db436e221 (patch)
treede9345f38adf26d0df9034765804f8b21a360ac0 /python/types.py
parent35adefaa9d1ecf5e8c09a787dbd6bda1d1a49325 (diff)
Fix deserialization of EnumerationMember values
Diffstat (limited to 'python/types.py')
-rw-r--r--python/types.py25
1 files changed, 23 insertions, 2 deletions
diff --git a/python/types.py b/python/types.py
index ee47c841..0b68bd54 100644
--- a/python/types.py
+++ b/python/types.py
@@ -60,6 +60,24 @@ MemberOffset = int
TB = TypeVar('TB', bound='TypeBuilder')
+def convert_integer(value: ctypes.c_uint64, signed: bool, width: int) -> int:
+ if width not in [1, 2, 4, 8]:
+ raise ValueError("Width must be 1, 2, 4, or 8 bytes")
+ func = {
+ True: {
+ 1: ctypes.c_int8,
+ 2: ctypes.c_int16,
+ 4: ctypes.c_int32,
+ 8: ctypes.c_int64
+ },
+ False: {
+ 1: ctypes.c_uint8,
+ 2: ctypes.c_uint16,
+ 4: ctypes.c_uint32,
+ 8: ctypes.c_uint64
+ }
+ }
+ return func[bool(signed)][width](value).value
class QualifiedName:
def __init__(self, name: Optional[QualifiedNameType] = None):
@@ -1510,10 +1528,12 @@ class EnumerationBuilder(TypeBuilder):
members = core.BNGetEnumerationBuilderMembers(self.enum_builder_handle, count)
assert members is not None, "core.BNGetEnumerationBuilderMembers returned None"
result = []
+
try:
for i in range(count.value):
+ value = convert_integer(members[i].value, self.signed, self.width)
result.append(
- EnumerationMember(members[i].name, members[i].value if not members[i].isDefault else None)
+ EnumerationMember(members[i].name, value if not members[i].isDefault else None)
)
return result
finally:
@@ -2563,7 +2583,8 @@ class EnumerationType(IntegerType):
try:
result = []
for i in range(0, count.value):
- result.append(EnumerationMember(members[i].name, members[i].value if not members[i].isDefault else None))
+ value = convert_integer(members[i].value, self.signed, self.width)
+ result.append(EnumerationMember(members[i].name, value if not members[i].isDefault else None))
return result
finally:
core.BNFreeEnumerationMemberList(members, count.value)