vtable_hook/hook/copy/
mod.rs1pub 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 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 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}