use crate::emu;
pub fn CompareStringW(emu: &mut emu::Emu) {
let locale = emu.regs().rcx;
let dw_cmp_flags = emu.regs().rdx;
let lp_string1 = emu.regs().r8;
let cch_count1 = emu.regs().r9 as i32;
let lp_string2_addr = emu.regs().rsp + 0x20;
let cch_count2_addr = emu.regs().rsp + 0x28;
let lp_string2 = emu.maps.read_qword(lp_string2_addr).unwrap_or(0);
let cch_count2 = emu.maps.read_dword(cch_count2_addr).unwrap_or(0) as i32;
log_red!(
emu,
"kernel32!CompareStringW locale: 0x{:x} flags: 0x{:x} str1: 0x{:x} len1: {} str2: 0x{:x} len2: {}",
locale,
dw_cmp_flags,
lp_string1,
cch_count1,
lp_string2,
cch_count2
);
let s1 = if lp_string1 == 0 {
String::new()
} else if cch_count1 == -1 {
emu.maps.read_wide_string(lp_string1)
} else if cch_count1 == 0 {
String::new()
} else {
emu.maps.read_wide_string_n(lp_string1, cch_count1 as usize)
};
let s2 = if lp_string2 == 0 {
String::new()
} else if cch_count2 == -1 {
emu.maps.read_wide_string(lp_string2)
} else if cch_count2 == 0 {
String::new()
} else {
emu.maps.read_wide_string_n(lp_string2, cch_count2 as usize)
};
let result = if (dw_cmp_flags & 0x00000001) != 0 {
let s1_lower = s1.to_lowercase();
let s2_lower = s2.to_lowercase();
match s1_lower.cmp(&s2_lower) {
std::cmp::Ordering::Less => 1, std::cmp::Ordering::Equal => 2, std::cmp::Ordering::Greater => 3, }
} else {
match s1.cmp(&s2) {
std::cmp::Ordering::Less => 1, std::cmp::Ordering::Equal => 2, std::cmp::Ordering::Greater => 3, }
};
log::trace!("\t\t'{}' == '{}' ={}", s1, s2, result);
emu.regs_mut().rax = result as u64;
}