dobby_hook_core/
options.rs1use core::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
2
3static NEAR_TRAMPOLINE: AtomicBool = AtomicBool::new(false);
4static ALLOC_NEAR_CODE_CB: AtomicUsize = AtomicUsize::new(0);
5
6pub type AllocNearCodeCallback = unsafe fn(size: u32, pos: usize, range: usize) -> usize;
7
8#[cfg(target_arch = "x86_64")]
11pub(crate) fn near_trampoline_enabled() -> bool {
12 NEAR_TRAMPOLINE.load(Ordering::Relaxed)
13}
14
15#[cfg(target_arch = "x86_64")]
16pub(crate) fn alloc_near_code_callback() -> Option<AllocNearCodeCallback> {
17 let p = ALLOC_NEAR_CODE_CB.load(Ordering::Relaxed);
18 if p == 0 {
19 None
20 } else {
21 Some(unsafe { core::mem::transmute::<usize, AllocNearCodeCallback>(p) })
22 }
23}
24
25pub fn set_near_trampoline(enable: bool) {
26 NEAR_TRAMPOLINE.store(enable, Ordering::Relaxed);
27}
28
29pub fn register_alloc_near_code_callback(handler: Option<AllocNearCodeCallback>) {
30 ALLOC_NEAR_CODE_CB.store(handler.map_or(0, |f| f as usize), Ordering::Relaxed);
31}
32
33pub fn set_options(
34 enable_near_trampoline: bool,
35 alloc_near_code_callback: Option<AllocNearCodeCallback>,
36) {
37 set_near_trampoline(enable_near_trampoline);
38 register_alloc_near_code_callback(alloc_near_code_callback);
39}