idalib/
plugin.rs

1use std::marker::PhantomData;
2
3use bitflags::bitflags;
4
5use crate::ffi::loader::*;
6use crate::idb::IDB;
7
8pub use crate::ffi::processor::ids as id;
9
10bitflags! {
11    #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
12    pub struct PluginFlags: u64 {
13        const MOD = flags::PLUGIN_MOD as u64;
14        const DRAW = flags::PLUGIN_DRAW as u64;
15        const SEG = flags::PLUGIN_SEG as u64;
16        const UNL = flags::PLUGIN_UNL as u64;
17        const HIDE = flags::PLUGIN_HIDE as u64;
18        const DBG = flags::PLUGIN_DBG as u64;
19        const PROC = flags::PLUGIN_PROC as u64;
20        const FIX = flags::PLUGIN_FIX as u64;
21        const MULTI = flags::PLUGIN_MULTI as u64;
22        const SCRIPTED = flags::PLUGIN_SCRIPTED as u64;
23    }
24}
25
26pub struct Plugin<'a> {
27    ptr: *const plugin_t,
28    _marker: PhantomData<&'a IDB>,
29}
30
31impl<'a> Plugin<'a> {
32    pub(crate) fn from_ptr(ptr: *const plugin_t) -> Self {
33        Self {
34            ptr,
35            _marker: PhantomData,
36        }
37    }
38
39    pub fn run(&self, arg: usize) -> bool {
40        unsafe { run_plugin(&*self.ptr, arg) }
41    }
42
43    pub fn version(&self) -> u64 {
44        unsafe { idalib_plugin_version(self.ptr) }
45    }
46
47    pub fn flags(&self) -> PluginFlags {
48        let bits = unsafe { idalib_plugin_flags(self.ptr) };
49        PluginFlags::from_bits_retain(bits)
50    }
51}