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}