use dyncvoke_core::syscall;
use std::ffi::c_void;
use std::ptr::null_mut;
#[test]
fn smoke_alloc_protect_free_round_trip() {
let mut addr: *mut c_void = null_mut();
let mut size: usize = 0x1000;
let alloc_status = syscall!(
"NtAllocateVirtualMemory",
-1isize as *mut c_void,
&mut addr as *mut *mut c_void,
0usize,
&mut size as *mut usize,
0x3000u32, 0x04u32 )
.expect("resolve NtAllocateVirtualMemory") as i32;
assert_eq!(
alloc_status, 0,
"NtAllocateVirtualMemory NTSTATUS=0x{:08X}",
alloc_status as u32
);
assert!(!addr.is_null());
assert!(size >= 0x1000, "kernel rounded size down to {}", size);
unsafe {
*(addr as *mut u8) = 0x42;
assert_eq!(*(addr as *mut u8), 0x42);
}
let mut old_prot: u32 = 0;
let prot_status = syscall!(
"NtProtectVirtualMemory",
-1isize as *mut c_void,
&mut addr as *mut *mut c_void,
&mut size as *mut usize,
0x20u32, &mut old_prot as *mut u32
)
.expect("resolve NtProtectVirtualMemory") as i32;
assert_eq!(
prot_status, 0,
"NtProtectVirtualMemory NTSTATUS=0x{:08X}",
prot_status as u32
);
assert_eq!(
old_prot, 0x04,
"old protection should have been PAGE_READWRITE, got 0x{:X}",
old_prot
);
let mut zero_size: usize = 0;
let free_status = syscall!(
"NtFreeVirtualMemory",
-1isize as *mut c_void,
&mut addr as *mut *mut c_void,
&mut zero_size as *mut usize,
0x8000u32 )
.expect("resolve NtFreeVirtualMemory") as i32;
assert_eq!(
free_status, 0,
"NtFreeVirtualMemory NTSTATUS=0x{:08X}",
free_status as u32
);
}
#[test]
fn smoke_do_syscall_macro_with_cached_resolution() {
use dyncvoke_core::{do_syscall, resolve_syscall};
let (alloc_ssn, alloc_addr) = resolve_syscall("NtAllocateVirtualMemory").unwrap();
let (free_ssn, free_addr) = resolve_syscall("NtFreeVirtualMemory").unwrap();
let mut addr: *mut c_void = null_mut();
let mut size: usize = 0x1000;
let status = do_syscall!(
alloc_ssn, alloc_addr,
-1isize as *mut c_void,
&mut addr as *mut *mut c_void,
0usize,
&mut size as *mut usize,
0x3000u32,
0x04u32
) as i32;
assert_eq!(status, 0);
assert!(!addr.is_null());
let mut z: usize = 0;
let status = do_syscall!(
free_ssn, free_addr,
-1isize as *mut c_void,
&mut addr as *mut *mut c_void,
&mut z as *mut usize,
0x8000u32
) as i32;
assert_eq!(status, 0);
}