use crate::{constants, emu, winapi::winapi64::kernel32::set_last_error};
pub fn GetCurrentDirectoryA(emu: &mut emu::Emu) {
let buff_len = emu.regs().rcx as u32;
let buff_ptr = emu.regs().rdx;
log_red!(
emu,
"kernel32!GetCurrentDirectoryA nBufferLength: {} lpBuffer: 0x{:x}",
buff_len,
buff_ptr
);
let current_dir = emu.cfg.cwd_path.clone();
let dir_byte_count = current_dir.len();
if buff_len == 0 || buff_ptr == 0 {
set_last_error(constants::ERROR_INSUFFICIENT_BUFFER);
emu.regs_mut().rax = (dir_byte_count + 1) as u64; return;
}
if (buff_len as usize) < (dir_byte_count + 1) {
set_last_error(constants::ERROR_INSUFFICIENT_BUFFER);
emu.regs_mut().rax = (dir_byte_count + 1) as u64;
return;
}
emu.maps.write_string(buff_ptr, ¤t_dir);
log_red!(
emu,
"GetCurrentDirectoryA returning: '{}' (length: {})",
current_dir,
dir_byte_count
);
emu.regs_mut().rax = dir_byte_count as u64;
set_last_error(0);
}