libscemu/emu/
winapi64.rs

1mod advapi32;
2mod comctl64;
3mod dnsapi;
4pub mod kernel32;
5mod ntdll;
6mod shell32;
7mod user32;
8mod winhttp;
9mod wininet;
10mod ws2_32;
11mod shlwapi;
12mod kernelbase;
13
14use crate::emu;
15
16pub fn gateway(addr: u64, name: String, emu: &mut emu::Emu) {
17    log::info!("winapi64::gateway called with addr: 0x{:x}, name: {}", addr, name);
18
19    let unimplemented_api = match name.as_str() {
20        "kernel32.text" => kernel32::gateway(addr, emu),
21        "kernel32.rdata" => kernel32::gateway(addr, emu),
22        "ntdll.text" => ntdll::gateway(addr, emu),
23        "user32.text" => user32::gateway(addr, emu),
24        "ws2_32.text" => ws2_32::gateway(addr, emu),
25        "wininet.text" => wininet::gateway(addr, emu),
26        "advapi32.text" => advapi32::gateway(addr, emu),
27        "winhttp.text" => winhttp::gateway(addr, emu),
28        "dnsapi.text" => dnsapi::gateway(addr, emu),
29        "comctl32.text" => comctl64::gateway(addr, emu),
30        "shell32.text" => shell32::gateway(addr, emu),
31        "shlwapi.text" => shlwapi::gateway(addr, emu),
32        "kernelbase.text" => kernelbase::gateway(addr, emu),
33        "not_loaded" => {
34            emu.pe64.as_ref().unwrap().import_addr_to_name(addr)
35        }
36        _ => panic!("/!\\ trying to execute on {} at 0x{:x}", name, addr),
37    };
38
39    if unimplemented_api.len() > 0 {
40        log::info!(
41            "{}({}, {}, {}, {}) (unimplemented)",
42            unimplemented_api, emu.regs.rcx, emu.regs.rdx, emu.regs.r8, emu.regs.r9
43        );
44
45        emu.regs.rax = 1;
46    }
47}