summaryrefslogtreecommitdiff
path: root/rust/src
diff options
context:
space:
mode:
authorFabian Freyer <fabian.freyer@physik.tu-berlin.de>2022-01-31 01:04:12 +0100
committerKyle Martin <krm504@nyu.edu>2022-02-08 16:08:06 -0500
commit07311129ef2e9407b281fd5048d1a238a4689a73 (patch)
tree0ab296e8ee189d18753e11b99dd13e3a33b97708 /rust/src
parent09d0ad499b18c51a362e3132bf0b462c0ea3430b (diff)
rust: add some interaction functions
Diffstat (limited to 'rust/src')
-rw-r--r--rust/src/interaction.rs106
-rw-r--r--rust/src/lib.rs1
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;