use crate::{windows::constants, emu, winapi::winapi64::kernel32::set_last_error};
pub fn GetModuleFileNameW(emu: &mut emu::Emu) {
let module_handle = emu.regs().rcx;
let lp_filename = emu.regs().rdx;
let n_size = emu.regs().r8 as u32;
log_red!(
emu,
"kernel32!GetModuleFileNameW hModule: 0x{:x} lpFilename: 0x{:x} nSize: {}",
module_handle,
lp_filename,
n_size
);
if n_size == 0 {
log_red!(emu, "GetModuleFileNameW: Zero size buffer");
emu.regs_mut().rax = 0;
return;
}
if lp_filename == 0 || !emu.maps.is_mapped(lp_filename) {
log_red!(emu, "GetModuleFileNameW: Invalid buffer pointer");
emu.regs_mut().rax = 0;
return;
}
let module_name = if module_handle == 0 {
emu.cfg.module_name.clone()
} else {
emu.cfg.module_name.clone()
};
let name_chars = module_name.chars().count();
let required_chars = name_chars + 1;
if (n_size as usize) < required_chars {
let max_chars = (n_size as usize) - 1; let truncated: String = module_name.chars().take(max_chars).collect();
emu.maps.write_wide_string(lp_filename, &truncated);
log_red!(
emu,
"GetModuleFileNameW: Buffer too small, truncated to '{}'",
truncated
);
set_last_error(constants::ERROR_INSUFFICIENT_BUFFER);
emu.regs_mut().rax = n_size as u64; } else {
emu.maps.write_wide_string(lp_filename, &module_name);
log_red!(
emu,
"GetModuleFileNameW: Returning '{}' (length: {})",
module_name,
name_chars
);
emu.regs_mut().rax = name_chars as u64; }
}