From 07311129ef2e9407b281fd5048d1a238a4689a73 Mon Sep 17 00:00:00 2001 From: Fabian Freyer Date: Mon, 31 Jan 2022 01:04:12 +0100 Subject: rust: add some interaction functions --- rust/src/interaction.rs | 106 ++++++++++++++++++++++++++++++++++++++++++++++++ rust/src/lib.rs | 1 + 2 files changed, 107 insertions(+) create mode 100644 rust/src/interaction.rs (limited to 'rust/src') diff --git a/rust/src/interaction.rs b/rust/src/interaction.rs new file mode 100644 index 00000000..170398f5 --- /dev/null +++ b/rust/src/interaction.rs @@ -0,0 +1,106 @@ +use binaryninjacore_sys::*; + +use std::ffi::CString; +use std::path::PathBuf; + +use crate::string::BnString; + +pub fn get_text_line_input(prompt: &str, title: &str) -> Option { + let prompt = CString::new(prompt).unwrap(); + let title = CString::new(title).unwrap(); + let mut value: *mut libc::c_char = std::ptr::null_mut(); + + let result = unsafe { BNGetTextLineInput(&mut value, prompt.into_raw(), title.into_raw()) }; + if !result { + return None; + } + + Some(unsafe { BnString::from_raw(value).to_string() }) +} + +pub fn get_integer_input(prompt: &str, title: &str) -> Option { + let prompt = CString::new(prompt).unwrap(); + let title = CString::new(title).unwrap(); + let mut value: i64 = 0; + + let result = unsafe { BNGetIntegerInput(&mut value, prompt.into_raw(), title.into_raw()) }; + + if !result { + return None; + } + + Some(value) +} + +pub fn get_address_input(prompt: &str, title: &str) -> Option { + let prompt = CString::new(prompt).unwrap(); + let title = CString::new(title).unwrap(); + let mut value: u64 = 0; + + let result = unsafe { + BNGetAddressInput( + &mut value, + prompt.into_raw(), + title.into_raw(), + std::ptr::null_mut(), + 0, + ) + }; + + if !result { + return None; + } + + Some(value) +} + +pub fn get_open_filename_input(prompt: &str, title: &str) -> Option { + let prompt = CString::new(prompt).unwrap(); + let title = CString::new(title).unwrap(); + let mut value: *mut libc::c_char = std::ptr::null_mut(); + + let result = unsafe { BNGetOpenFileNameInput(&mut value, prompt.into_raw(), title.into_raw()) }; + if !result { + return None; + } + + let string = unsafe { BnString::from_raw(value) }; + Some(PathBuf::from(string.as_str())) +} + +pub fn get_save_filename_input(prompt: &str, title: &str, default_name: &str) -> Option { + let prompt = CString::new(prompt).unwrap(); + let title = CString::new(title).unwrap(); + let default_name = CString::new(default_name).unwrap(); + let mut value: *mut libc::c_char = std::ptr::null_mut(); + + let result = unsafe { + BNGetSaveFileNameInput( + &mut value, + prompt.into_raw(), + title.into_raw(), + default_name.into_raw(), + ) + }; + if !result { + return None; + } + + let string = unsafe { BnString::from_raw(value) }; + Some(PathBuf::from(string.as_str())) +} + +pub fn get_directory_name_input(prompt: &str, default_name: &str) -> Option { + let prompt = CString::new(prompt).unwrap(); + let default_name = CString::new(default_name).unwrap(); + let mut value: *mut libc::c_char = std::ptr::null_mut(); + + let result = + unsafe { BNGetDirectoryNameInput(&mut value, prompt.into_raw(), default_name.into_raw()) }; + if !result { + return None; + } + + let string = unsafe { BnString::from_raw(value) }; + Some(PathBuf::from(string.as_str())) +} diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 84e21ffd..9965859b 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -52,6 +52,7 @@ pub mod filemetadata; pub mod flowgraph; pub mod function; pub mod headless; +pub mod interaction; pub mod llil; pub mod platform; pub mod rc; -- cgit v1.3.1