libudis86_sys/
lib.rs

1#![allow(non_camel_case_types)]
2#![allow(improper_ctypes)]
3extern crate libc;
4
5pub use api::*;
6pub use itab::*;
7pub use types::*;
8
9mod api;
10mod itab;
11mod types;
12
13#[cfg(test)]
14mod tests {
15    use std::ffi::CStr;
16    use std::mem;
17    use super::*;
18
19    #[test]
20    fn it_works() {
21        let data = [
22            // mov eax, [edx + esi*4]
23            0x8B, 0x04, 0xB2,
24            // nop
25            0x90,
26        ];
27
28        unsafe {
29            let mut object = mem::zeroed();
30            ud_init(&mut object);
31            ud_set_input_buffer(&mut object, data.as_ptr(), data.len());
32            ud_set_mode(&mut object, 32);
33            ud_set_syntax(&mut object, Some(ud_translate_intel));
34
35            assert_eq!(ud_disassemble(&mut object), 3);
36
37            let operand = ud_insn_opr(&object, 0).as_ref().unwrap();
38            assert_eq!(operand.otype, ud_type::UD_OP_REG);
39            assert_eq!(operand.base, ud_type::UD_R_EAX);
40
41            let operand = ud_insn_opr(&object, 1).as_ref().unwrap();
42            assert_eq!(operand.otype, ud_type::UD_OP_MEM);
43            assert_eq!(operand.base, ud_type::UD_R_EDX);
44            assert_eq!(operand.index, ud_type::UD_R_ESI);
45            assert_eq!(operand.scale, 4);
46
47            assert_eq!(ud_disassemble(&mut object), 1);
48            let instruction = ud_insn_asm(&mut object);
49            assert_eq!(CStr::from_ptr(instruction).to_string_lossy(), "nop");
50        }
51    }
52}