summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2025-06-25 15:12:23 -0400
committerBrian Potchik <brian@vector35.com>2025-06-25 15:12:23 -0400
commitecf2b3dd3e14d8ed0a3485104eaaa34a372228ba (patch)
tree25138e2b24efd3584b42128e38192f01e6fa24b5 /python
parentcdb6e62b649ea49b16350e57569df891ef7dfa34 (diff)
Initial support for guided disassembly.
Diffstat (limited to 'python')
-rw-r--r--python/function.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/python/function.py b/python/function.py
index 2750e40a..45863f21 100644
--- a/python/function.py
+++ b/python/function.py
@@ -2295,6 +2295,51 @@ class Function:
branch_list[i].address = branches[i][1]
core.BNSetUserIndirectBranches(self.handle, source_arch.handle, source, branch_list, len(branches))
+ def set_guided_source_blocks(
+ self, addresses: List[Tuple['architecture.Architecture', int]]
+ ) -> None:
+ address_list = (core.BNArchitectureAndAddress * len(addresses))()
+ for i in range(len(addresses)):
+ address_list[i].arch = addresses[i][0].handle
+ address_list[i].address = addresses[i][1]
+ core.BNSetGuidedSourceBlocks(self.handle, address_list, len(addresses))
+
+ def add_guided_source_blocks(
+ self, addresses: List[Tuple['architecture.Architecture', int]]
+ ) -> None:
+ address_list = (core.BNArchitectureAndAddress * len(addresses))()
+ for i in range(len(addresses)):
+ address_list[i].arch = addresses[i][0].handle
+ address_list[i].address = addresses[i][1]
+ core.BNAddGuidedSourceBlocks(self.handle, address_list, len(addresses))
+
+ def remove_guided_source_blocks(
+ self, addresses: List[Tuple['architecture.Architecture', int]]
+ ) -> None:
+ address_list = (core.BNArchitectureAndAddress * len(addresses))()
+ for i in range(len(addresses)):
+ address_list[i].arch = addresses[i][0].handle
+ address_list[i].address = addresses[i][1]
+ core.BNRemoveGuidedSourceBlocks(self.handle, address_list, len(addresses))
+
+ def get_guided_source_blocks(
+ self
+ ) -> List[Tuple['architecture.Architecture', int]]:
+ count = ctypes.c_ulonglong()
+ addresses = core.BNGetGuidedSourceBlocks(self.handle, count)
+ try:
+ assert addresses is not None, "core.BNGetGuidedSourceBlocks returned None"
+ result = []
+ for i in range(count.value):
+ result.append((
+ architecture.CoreArchitecture._from_cache(addresses[i].arch),
+ addresses[i].address
+ ))
+ return result
+ finally:
+ if addresses is not None:
+ core.BNFreeArchitectureAndAddressList(addresses)
+
def get_indirect_branches_at(
self, addr: int, arch: Optional['architecture.Architecture'] = None
) -> List['variable.IndirectBranchInfo']: