diff options
Diffstat (limited to 'rust/src')
| -rw-r--r-- | rust/src/interaction.rs | 106 | ||||
| -rw-r--r-- | rust/src/lib.rs | 1 |
2 files changed, 107 insertions, 0 deletions
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<String> { + 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<i64> { + 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<u64> { + 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<PathBuf> { + 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<PathBuf> { + 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<PathBuf> { + 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; |
