diff options
| author | Fabian Freyer <fabian.freyer@physik.tu-berlin.de> | 2022-01-31 01:04:12 +0100 |
|---|---|---|
| committer | Kyle Martin <krm504@nyu.edu> | 2022-02-08 16:08:06 -0500 |
| commit | 07311129ef2e9407b281fd5048d1a238a4689a73 (patch) | |
| tree | 0ab296e8ee189d18753e11b99dd13e3a33b97708 /rust/src | |
| parent | 09d0ad499b18c51a362e3132bf0b462c0ea3430b (diff) | |
rust: add some interaction functions
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; |
