summaryrefslogtreecommitdiff
path: root/rust/src/disassembly.rs
diff options
context:
space:
mode:
authorKyleMiles <krm504@nyu.edu>2021-01-21 18:35:20 +0000
committerKyleMiles <krm504@nyu.edu>2021-01-21 19:07:07 +0000
commit2fcacc55d5466a7d17bdc0b3ce988772aa6d0653 (patch)
tree9d0f2ba19117843575936f2b93e0b6a578a84dc8 /rust/src/disassembly.rs
parenta0da07c5c2860a5bd69921d38e438bbc1d43912f (diff)
cargo fmt and all my changes
Diffstat (limited to 'rust/src/disassembly.rs')
-rw-r--r--rust/src/disassembly.rs204
1 files changed, 204 insertions, 0 deletions
diff --git a/rust/src/disassembly.rs b/rust/src/disassembly.rs
new file mode 100644
index 00000000..8dfec753
--- /dev/null
+++ b/rust/src/disassembly.rs
@@ -0,0 +1,204 @@
+// Copyright 2021 Vector 35 Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+use binaryninjacore_sys::*;
+
+use crate::string::BnString;
+use crate::{BN_FULL_CONFIDENCE, BN_INVALID_EXPR};
+
+use std::convert::From;
+use std::mem;
+use std::ptr;
+
+pub type InstructionTextTokenType = BNInstructionTextTokenType;
+pub type InstructionTextTokenContext = BNInstructionTextTokenContext;
+
+pub struct InstructionTextToken(pub(crate) BNInstructionTextToken);
+
+impl InstructionTextToken {
+ pub fn new(type_: InstructionTextTokenType, text: &str, value: u64) -> Self {
+ let raw_name = BnString::new(text);
+
+ // TODO : Maybe impl Drop for this newtype and perhaps call from_raw for the BnString..I think it's a memory leak otherwise
+
+ InstructionTextToken(BNInstructionTextToken {
+ type_: type_,
+ text: raw_name.into_raw(),
+ value: value,
+ width: text.chars().count() as u64,
+ size: 0,
+ operand: 0xffffffff,
+ context: InstructionTextTokenContext::NoTokenContext,
+ confidence: BN_FULL_CONFIDENCE,
+ address: 0,
+ typeNames: ptr::null_mut(),
+ namesCount: 0,
+ })
+ }
+
+ pub fn set_value(&mut self, value: u64) {
+ self.0.value = value;
+ }
+
+ pub fn set_context(&mut self, context: InstructionTextTokenContext) {
+ self.0.context = context;
+ }
+}
+
+impl Default for InstructionTextToken {
+ fn default() -> Self {
+ InstructionTextToken(BNInstructionTextToken {
+ type_: InstructionTextTokenType::TextToken,
+ text: ptr::null_mut(),
+ value: 0,
+ width: 0,
+ size: 0,
+ operand: 0,
+ context: InstructionTextTokenContext::NoTokenContext,
+ confidence: BN_FULL_CONFIDENCE,
+ address: 0,
+ typeNames: ptr::null_mut(),
+ namesCount: 0,
+ })
+ }
+}
+
+pub struct DisassemblyTextLine(pub(crate) BNDisassemblyTextLine);
+
+impl DisassemblyTextLine {
+ // TODO : this should probably be removed, though it doesn't actually hurt anything
+ pub fn debug_print(&self) {
+ let tokens: Vec<InstructionTextToken> =
+ unsafe { Vec::from_raw_parts(self.0.tokens as *mut _, self.0.count, self.0.count) };
+
+ for token in &tokens {
+ let token_string = unsafe { BnString::from_raw(token.0.text) };
+ print!("{}", token_string);
+ token_string.into_raw();
+ }
+
+ mem::forget(tokens);
+ }
+}
+
+impl From<Vec<InstructionTextToken>> for DisassemblyTextLine {
+ fn from(mut tokens: Vec<InstructionTextToken>) -> Self {
+ tokens.shrink_to_fit();
+
+ assert!(tokens.len() == tokens.capacity());
+ // let (tokens_pointer, tokens_len, _) = unsafe { tokens.into_raw_parts() }; // Can't use for now...still a rust nighly feature
+ let tokens_pointer = tokens.as_mut_ptr();
+ let tokens_len = tokens.len();
+ mem::forget(tokens);
+
+ DisassemblyTextLine(BNDisassemblyTextLine {
+ addr: 0,
+ instrIndex: BN_INVALID_EXPR,
+ tokens: tokens_pointer as *mut _,
+ count: tokens_len,
+ highlight: BNHighlightColor {
+ style: BNHighlightColorStyle::StandardHighlightColor,
+ color: BNHighlightStandardColor::NoHighlightColor,
+ mixColor: BNHighlightStandardColor::NoHighlightColor,
+ mix: 0,
+ r: 0,
+ g: 0,
+ b: 0,
+ alpha: 0,
+ },
+ tags: ptr::null_mut(),
+ tagCount: 0,
+ typeInfo: BNDisassemblyTextLineTypeInfo {
+ hasTypeInfo: false,
+ parentType: ptr::null_mut(),
+ fieldIndex: usize::MAX,
+ },
+ })
+ }
+}
+
+impl From<&Vec<&str>> for DisassemblyTextLine {
+ fn from(string_tokens: &Vec<&str>) -> Self {
+ let mut tokens: Vec<BNInstructionTextToken> = Vec::with_capacity(string_tokens.len());
+ tokens.extend(string_tokens.iter().map(|token| {
+ InstructionTextToken::new(InstructionTextTokenType::TextToken, token, 0).0
+ }));
+
+ assert!(tokens.len() == tokens.capacity());
+ // let (tokens_pointer, tokens_len, _) = unsafe { tokens.into_raw_parts() }; // Can't use for now...still a rust nighly feature
+ let tokens_pointer = tokens.as_mut_ptr();
+ let tokens_len = tokens.len();
+ mem::forget(tokens);
+
+ DisassemblyTextLine(BNDisassemblyTextLine {
+ addr: 0,
+ instrIndex: BN_INVALID_EXPR,
+ tokens: tokens_pointer as *mut _,
+ count: tokens_len,
+ highlight: BNHighlightColor {
+ style: BNHighlightColorStyle::StandardHighlightColor,
+ color: BNHighlightStandardColor::NoHighlightColor,
+ mixColor: BNHighlightStandardColor::NoHighlightColor,
+ mix: 0,
+ r: 0,
+ g: 0,
+ b: 0,
+ alpha: 0,
+ },
+ tags: ptr::null_mut(),
+ tagCount: 0,
+ typeInfo: BNDisassemblyTextLineTypeInfo {
+ hasTypeInfo: false,
+ parentType: ptr::null_mut(),
+ fieldIndex: usize::MAX,
+ },
+ })
+ }
+}
+
+impl Default for DisassemblyTextLine {
+ fn default() -> Self {
+ DisassemblyTextLine(BNDisassemblyTextLine {
+ addr: 0,
+ instrIndex: BN_INVALID_EXPR,
+ tokens: ptr::null_mut(),
+ count: 0,
+ highlight: BNHighlightColor {
+ style: BNHighlightColorStyle::StandardHighlightColor,
+ color: BNHighlightStandardColor::NoHighlightColor,
+ mixColor: BNHighlightStandardColor::NoHighlightColor,
+ mix: 0,
+ r: 0,
+ g: 0,
+ b: 0,
+ alpha: 0,
+ },
+ tags: ptr::null_mut(),
+ tagCount: 0,
+ typeInfo: BNDisassemblyTextLineTypeInfo {
+ hasTypeInfo: false,
+ parentType: ptr::null_mut(),
+ fieldIndex: usize::MAX,
+ },
+ })
+ }
+}
+
+impl Drop for DisassemblyTextLine {
+ fn drop(&mut self) {
+ unsafe {
+ Vec::from_raw_parts(self.0.tokens, self.0.count, self.0.count);
+ }
+ }
+}