Skip to main content

ReplaceHandle

Struct ReplaceHandle 

Source
pub struct ReplaceHandle<F: Copy> { /* private fields */ }

Implementations§

Source§

impl<F: Copy> ReplaceHandle<F>

Source

pub fn original(&self) -> F

Examples found in repository?
examples/install_replace.rs (line 86)
49fn main() -> dobby_rs_framework::Result<()> {
50    common::init_example_logging();
51
52    // EN: 1) `install` -> typed handle.
53    // CN: 1) `install` -> 返回带类型的句柄。
54    let h1 = unsafe {
55        install(
56            common::target_mul as fn(i32) -> i32,
57            detour_mul as fn(i32) -> i32,
58        )?
59    };
60    println!("target_mul(3) after install = {}", common::target_mul(3));
61    unsafe { h1.unhook()? };
62
63    // EN: 2) `install_addr` -> raw pointer variant.
64    // CN: 2) `install_addr` -> 按地址安装(裸指针版本)。
65    let h1_addr = unsafe {
66        install_addr(
67            common::target_mul as *const () as *mut c_void,
68            detour_mul as *const () as *mut c_void,
69        )?
70    };
71    println!(
72        "target_mul(3) after install_addr = {}",
73        common::target_mul(3)
74    );
75    unsafe { h1_addr.unhook()? };
76
77    // EN: 3) `replace` -> temporary swap, with easy access to original.
78    // CN: 3) `replace` -> 临时替换,并且可以拿到 original。
79    let r = unsafe {
80        replace(
81            common::target_sub as fn(i32) -> i32,
82            replacement_sub as fn(i32) -> i32,
83        )?
84    };
85    println!("target_sub(10) after replace = {}", common::target_sub(10));
86    println!("original target_sub(10) = {}", (r.original())(10));
87    unsafe { r.unreplace()? };
88
89    // EN: 4) `install_with` -> before/after callbacks (invoked by detour).
90    // CN: 4) `install_with` -> before/after 回调(由 detour 调用)。
91    let h2 = unsafe {
92        install_with(
93            target_with_callbacks as fn(i32) -> i32,
94            detour_with_callbacks as fn(i32) -> i32,
95            Some(|| log::info!("before (install_with)")),
96            Some(|| log::info!("after (install_with)")),
97        )?
98    };
99    println!(
100        "target_with_callbacks(1) after install_with = {}",
101        target_with_callbacks(1)
102    );
103    unsafe { h2.unhook()? };
104
105    Ok(())
106}
Source

pub unsafe fn unreplace(self) -> Result<()>

Examples found in repository?
examples/install_replace.rs (line 87)
49fn main() -> dobby_rs_framework::Result<()> {
50    common::init_example_logging();
51
52    // EN: 1) `install` -> typed handle.
53    // CN: 1) `install` -> 返回带类型的句柄。
54    let h1 = unsafe {
55        install(
56            common::target_mul as fn(i32) -> i32,
57            detour_mul as fn(i32) -> i32,
58        )?
59    };
60    println!("target_mul(3) after install = {}", common::target_mul(3));
61    unsafe { h1.unhook()? };
62
63    // EN: 2) `install_addr` -> raw pointer variant.
64    // CN: 2) `install_addr` -> 按地址安装(裸指针版本)。
65    let h1_addr = unsafe {
66        install_addr(
67            common::target_mul as *const () as *mut c_void,
68            detour_mul as *const () as *mut c_void,
69        )?
70    };
71    println!(
72        "target_mul(3) after install_addr = {}",
73        common::target_mul(3)
74    );
75    unsafe { h1_addr.unhook()? };
76
77    // EN: 3) `replace` -> temporary swap, with easy access to original.
78    // CN: 3) `replace` -> 临时替换,并且可以拿到 original。
79    let r = unsafe {
80        replace(
81            common::target_sub as fn(i32) -> i32,
82            replacement_sub as fn(i32) -> i32,
83        )?
84    };
85    println!("target_sub(10) after replace = {}", common::target_sub(10));
86    println!("original target_sub(10) = {}", (r.original())(10));
87    unsafe { r.unreplace()? };
88
89    // EN: 4) `install_with` -> before/after callbacks (invoked by detour).
90    // CN: 4) `install_with` -> before/after 回调(由 detour 调用)。
91    let h2 = unsafe {
92        install_with(
93            target_with_callbacks as fn(i32) -> i32,
94            detour_with_callbacks as fn(i32) -> i32,
95            Some(|| log::info!("before (install_with)")),
96            Some(|| log::info!("after (install_with)")),
97        )?
98    };
99    println!(
100        "target_with_callbacks(1) after install_with = {}",
101        target_with_callbacks(1)
102    );
103    unsafe { h2.unhook()? };
104
105    Ok(())
106}

Auto Trait Implementations§

§

impl<F> Freeze for ReplaceHandle<F>
where F: Freeze,

§

impl<F> RefUnwindSafe for ReplaceHandle<F>
where F: RefUnwindSafe,

§

impl<F> Send for ReplaceHandle<F>
where F: Send,

§

impl<F> Sync for ReplaceHandle<F>
where F: Sync,

§

impl<F> Unpin for ReplaceHandle<F>
where F: Unpin,

§

impl<F> UnsafeUnpin for ReplaceHandle<F>
where F: UnsafeUnpin,

§

impl<F> UnwindSafe for ReplaceHandle<F>
where F: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.