From 08f1c49f0cb7f74d0f50dcf60289e974ae9d5c3a Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Mon, 28 Oct 2024 21:18:10 -0400 Subject: Rust: Add `BinaryViewExt::get_code_refs_from` api --- rust/src/binaryview.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'rust/src/binaryview.rs') diff --git a/rust/src/binaryview.rs b/rust/src/binaryview.rs index 9825f2de..226e70de 100644 --- a/rust/src/binaryview.rs +++ b/rust/src/binaryview.rs @@ -1307,6 +1307,25 @@ pub trait BinaryViewExt: BinaryViewBase { } } + /// Retrieves a list of addresses pointed to by a given address. + fn get_code_refs_from(&self, addr: u64, func: Option<&Function>) -> Vec { + unsafe { + let mut count = 0; + // TODO: We could have done a [CodeReference] however it seems to be poorly written. + // TODO: It uses manually drop on a ref that only gets dropped in the array, insane behavior. + // TODO: For now just construct it manually. + let mut src = BNReferenceSource { + func: func.map(|f| f.handle).unwrap_or(std::ptr::null_mut()), + arch: func.map(|f| f.arch().0).unwrap_or(std::ptr::null_mut()), + addr, + }; + let addresses = BNGetCodeReferencesFrom(self.as_ref().handle, &mut src, &mut count); + let res = std::slice::from_raw_parts(addresses, count).to_vec(); + BNFreeAddressList(addresses); + res + } + } + /// Retrieves a list of [CodeReference]s pointing into a given [Range]. fn get_code_refs_in_range(&self, range: Range) -> Array { unsafe { -- cgit v1.3.1