vtable_hook/hook/copy/
mod.rs

1pub mod raw;
2
3#[derive(Debug)]
4pub struct Hook<'a, T> {
5    pub item: &'a mut T,
6    raw: raw::RawHook,
7}
8
9impl<'a, T> Hook<'a, T> {
10    pub unsafe fn new(
11        item: &'a mut T,
12        vtable_offset: Option<usize>,
13        methods_count: Option<usize>,
14    ) -> Self {
15        let item_ptr = item as *mut _ as *mut usize;
16
17        /* TODO: More sanity checks. Example:
18         * Error when vtable_offset is out of T's struct memory */
19
20        let vtable_offset = vtable_offset.unwrap_or(0);
21        let struct_vtable_field_ptr = item_ptr.add(vtable_offset) as *mut crate::RawVTable;
22        let vtable = struct_vtable_field_ptr.read_unaligned();
23        let vtable_size = methods_count.unwrap_or_else(|| crate::VTable::count_methods_raw(vtable));
24        let original_vtable = crate::VTable::new_with_size(vtable, vtable_size);
25
26        let raw = raw::RawHook::new(struct_vtable_field_ptr, Some(original_vtable));
27        Self { item, raw }
28    }
29
30    /* Wrapped functions */
31    pub unsafe fn is_enabled(&self) -> bool {
32        self.raw.is_enabled()
33    }
34
35    pub unsafe fn enable(&mut self) -> bool {
36        self.raw.enable()
37    }
38
39    pub unsafe fn disable(&mut self) -> bool {
40        self.raw.disable()
41    }
42
43    pub unsafe fn replace_method(&mut self, index: usize, our_method: crate::Method) -> Option<()> {
44        self.raw.replace_method(index, our_method)
45    }
46
47    pub unsafe fn restore_method(&mut self, index: usize) -> Option<()> {
48        self.raw.restore_method(index)
49    }
50
51    pub unsafe fn restore_all(&mut self) {
52        self.raw.restore_all()
53    }
54}
55
56impl<'a, T> Drop for Hook<'a, T> {
57    fn drop(&mut self) {
58        unsafe {
59            self.raw.disable();
60        }
61    }
62}