use callghost::syscall;
const MEM_COMMIT: u32 = 0x1000;
const MEM_RESERVE: u32 = 0x2000;
const MEM_RELEASE: u32 = 0x8000;
const PAGE_READWRITE: u32 = 0x04;
fn alloc_and_free(label: &str, base: &mut *mut core::ffi::c_void, size: &mut usize, status: i32) {
println!(" [{label}] NtAllocateVirtualMemory: 0x{:08X} base={:p} size={}", status as u32, *base, *size);
assert_eq!(status, 0, "{label} alloc failed");
assert!(!base.is_null());
unsafe { *((*base) as *mut u32) = 0xDEADBEEF; }
let mut fs: usize = 0;
let s = syscall!(NtFreeVirtualMemory, -1isize, base, &mut fs, MEM_RELEASE);
println!(" [{label}] NtFreeVirtualMemory: 0x{:08X}", s as u32);
assert_eq!(s, 0, "{label} free failed");
}
fn main() {
println!("CallGhost - Direct Syscall Framework");
println!("====================================\n");
let (mut base, mut size): (*mut core::ffi::c_void, usize) = (core::ptr::null_mut(), 4096);
let s = syscall!(direct, NtAllocateVirtualMemory, -1isize, &mut base, 0usize, &mut size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
alloc_and_free("direct", &mut base, &mut size, s);
base = core::ptr::null_mut(); size = 4096;
let s = syscall!(indirect, NtAllocateVirtualMemory, -1isize, &mut base, 0usize, &mut size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
alloc_and_free("indirect", &mut base, &mut size, s);
base = core::ptr::null_mut(); size = 4096;
let s = syscall!(perunsfart, NtAllocateVirtualMemory, -1isize, &mut base, 0usize, &mut size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
alloc_and_free("perunsfart", &mut base, &mut size, s);
println!("\nAll methods working.");
}