use crate::maps::mem64::Permission;
use crate::tests::helpers;
use crate::winapi::winapi64;
use crate::*;
#[test]
fn test_write_file() {
helpers::setup();
let mut emu = emu64();
emu.regs_mut().rsp = 0x8000;
emu.maps
.create_map("stack", 0x0, 0x10000, Permission::READ_WRITE);
let buff_addr = 0x100000;
emu.maps
.create_map("buffer", buff_addr, 0x1000, Permission::READ_WRITE);
emu.maps.write_string(buff_addr, "Hello WinAPI");
emu.regs_mut().rcx = 0x1234;
emu.regs_mut().rdx = buff_addr;
emu.regs_mut().r8 = 12;
let written_ptr = 0x200000;
emu.maps
.create_map("written", written_ptr, 0x1000, Permission::READ_WRITE);
emu.regs_mut().r9 = written_ptr;
emu.maps.write_qword(emu.regs().rsp + 0x20, 0);
winapi64::kernel32::WriteFile(&mut emu);
assert_eq!(emu.regs().rax, 1, "WriteFile failed (returned 0)");
let bytes = emu.maps.read_dword(written_ptr).unwrap();
assert_eq!(bytes, 12);
}
#[test]
fn test_get_module_handle_64() {
helpers::setup();
let mut emu = emu64();
let name_addr = 0x20000;
emu.maps
.create_map("data", name_addr, 0x1000, Permission::READ_WRITE);
emu.maps.write_string(name_addr, "kernel32.dll");
emu.maps.create_map(
"kernel32.pe",
0x7FF10000000,
0x10000,
Permission::READ_EXECUTE,
);
emu.regs_mut().rcx = name_addr;
winapi64::kernel32::GetModuleHandleA(&mut emu);
let h_mod = emu.regs().rax;
assert_eq!(
h_mod, 0x7FF10000000,
"GetModuleHandleA('kernel32.dll') returned incorrect base"
);
}
#[test]
fn test_close_handle_64() {
helpers::setup();
let mut emu = emu64();
let handle = crate::winapi::helper::handler_create("dummy_file");
emu.regs_mut().rcx = handle;
winapi64::kernel32::CloseHandle(&mut emu);
assert_eq!(emu.regs().rax, 1);
}
#[test]
fn test_virtual_alloc() {
helpers::setup();
let mut emu = emu64();
emu.regs_mut().rcx = 0; emu.regs_mut().rdx = 0x1000; emu.regs_mut().r8 = 0x1000 | 0x2000; emu.regs_mut().r9 = 0x40;
winapi64::kernel32::VirtualAlloc(&mut emu);
let base = emu.regs().rax;
assert!(base != 0, "VirtualAlloc failed");
emu.maps.write_dword(base, 0xDEADBEEF);
let val = emu.maps.read_dword(base).unwrap();
assert_eq!(val, 0xDEADBEEF);
}