use crate::emu;
use crate::serialization;
mod appcompat;
mod console;
mod filesystem;
mod library_loader;
mod memory;
mod misc;
mod process_thread;
mod registry_profile;
mod strings_nls;
mod sync;
mod system;
mod legacy_compat;
mod loader;
mod resolver;
mod state;
pub use console::*;
pub use filesystem::*;
pub use library_loader::*;
pub use memory::*;
pub use misc::*;
pub use process_thread::*;
pub use registry_profile::*;
pub use strings_nls::*;
pub use sync::*;
pub use system::*;
pub use loader::*;
pub use resolver::*;
pub use state::*;
pub fn gateway(addr: u64, emu: &mut emu::Emu) -> String {
let api = guess_api_name(emu, addr);
let api = api.split("!").last().unwrap_or(&api);
match api {
"ActivateActCtx" => ActivateActCtx(emu),
"AddVectoredExceptionHandler" => AddVectoredExceptionHandler(emu),
"AreFileApiIsAnsi" => AreFileApiIsAnsi(emu),
"BeginUpdateResourceA" => BeginUpdateResourceA(emu),
"CloseHandle" => CloseHandle(emu),
"CompareStringW" => CompareStringW(emu),
"ConnectNamedPipe" => ConnectNamedPipe(emu),
"DeleteFileA" => DeleteFileA(emu),
"CopyFileA" => CopyFileA(emu),
"CopyFileW" => CopyFileW(emu),
"CreateActCtxA" => CreateActCtxA(emu),
"CreateEventA" => CreateEventA(emu),
"CreateFileA" => CreateFileA(emu),
"CreateFileW" => CreateFileW(emu),
"CreateFileMappingA" => CreateFileMappingA(emu),
"CreateFileMappingW" => CreateFileMappingW(emu),
"CreateMutexA" => CreateMutexA(emu),
"CreateMutexW" => CreateMutexW(emu),
"CreateNamedPipeA" => CreateNamedPipeA(emu),
"CreateNamedPipeW" => CreateNamedPipeW(emu),
"CreateProcessA" => CreateProcessA(emu),
"CreateProcessW" => CreateProcessW(emu),
"CreateRemoteThread" => CreateRemoteThread(emu),
"CreateThread" => CreateThread(emu),
"CreateToolhelp32Snapshot" => CreateToolhelp32Snapshot(emu),
"DecodePointer" => DecodePointer(emu),
"DisconnectNamedPipe" => DisconnectNamedPipe(emu),
"EncodePointer" => EncodePointer(emu),
"EnterCriticalSection" => EnterCriticalSection(emu),
"ExitProcess" => ExitProcess(emu),
"ExpandEnvironmentStringsA" => ExpandEnvironmentStringsA(emu),
"ExpandEnvironmentStringsW" => ExpandEnvironmentStringsW(emu),
"FileTimeToSystemTime" => FileTimeToSystemTime(emu),
"FindActCtxSectionStringW" => FindActCtxSectionStringW(emu),
"FindClose" => FindClose(emu),
"FindFirstFileA" => FindFirstFileA(emu),
"FindFirstFileExW" => FindFirstFileExW(emu),
"FindFirstFileW" => FindFirstFileW(emu),
"FindNextFileA" => FindNextFileA(emu),
"FindNextFileW" => FindNextFileW(emu),
"FindResourceA" => FindResourceA(emu),
"FindResourceW" => FindResourceW(emu),
"FlsAlloc" => FlsAlloc(emu),
"FlsGetValue" => FlsGetValue(emu),
"FlsSetValue" => FlsSetValue(emu),
"FreeResource" => FreeResource(emu),
"GetACP" => GetACP(emu),
"GetCommandLineA" => GetCommandLineA(emu),
"GetCommandLineW" => GetCommandLineW(emu),
"GetComputerNameA" => GetComputerNameA(emu),
"GetComputerNameW" => GetComputerNameW(emu),
"GetDiskFreeSpaceA" => GetDiskFreeSpaceA(emu),
"GetConsoleCP" => GetConsoleCP(emu),
"GetConsoleMode" => GetConsoleMode(emu),
"GetConsoleOutputCP" => GetConsoleOutputCP(emu),
"GetCPInfo" => GetCPInfo(emu),
"GetCurrentDirectoryA" => GetCurrentDirectoryA(emu),
"GetCurrentDirectoryW" => GetCurrentDirectoryW(emu),
"GetCurrentProcess" => GetCurrentProcess(emu),
"GetCurrentProcessId" => GetCurrentProcessId(emu),
"GetCurrentThread" => GetCurrentThread(emu),
"GetCurrentThreadId" => GetCurrentThreadId(emu),
"GetEnvironmentStringsW" => GetEnvironmentStringsW(emu),
"GetEnvironmentVariableW" => GetEnvironmentVariableW(emu),
"GetFileAttributesA" => GetFileAttributesA(emu),
"GetFileAttributesW" => GetFileAttributesW(emu),
"GetFileSize" => GetFileSize(emu),
"GetFileSizeEx" => GetFileSizeEx(emu),
"GetFileType" => GetFileType(emu),
"GetFullPathNameA" => GetFullPathNameA(emu),
"GetFullPathNameW" => GetFullPathNameW(emu),
"GetLastError" => GetLastError(emu),
"GetLocaleInfoA" => GetLocaleInfoA(emu),
"GetLocaleInfoW" => GetLocaleInfoW(emu),
"GetLocalTime" => GetLocalTime(emu),
"GetLogicalDrives" => GetLogicalDrives(emu),
"GetModuleFileNameA" => GetModuleFileNameA(emu),
"GetModuleFileNameW" => GetModuleFileNameW(emu),
"GetModuleHandleA" => GetModuleHandleA(emu),
"GetModuleHandleW" => GetModuleHandleW(emu),
"GetNativeSystemInfo" => GetNativeSystemInfo(emu),
"GetProcAddress" => GetProcAddress(emu),
"GetProcessAffinityMask" => GetProcessAffinityMask(emu),
"GetProcessHeap" => GetProcessHeap(emu),
"GetStartupInfoA" => GetStartupInfoA(emu),
"GetStartupInfoW" => GetStartupInfoW(emu),
"GetStdHandle" => GetStdHandle(emu),
"GetThreadId" => GetThreadId(emu),
"GetSystemDirectoryA" => GetSystemDirectoryA(emu),
"GetSystemDirectoryW" => GetSystemDirectoryW(emu),
"GetSystemFirmwareTable" => GetSystemFirmwareTable(emu),
"GetSystemInfo" => GetSystemInfo(emu),
"GetSystemTime" => GetSystemTime(emu),
"GetSystemTimeAsFileTime" => GetSystemTimeAsFileTime(emu),
"GetTempPathW" => GetTempPathW(emu),
"GetThreadContext" => GetThreadContext(emu),
"GetThreadLocale" => GetThreadLocale(emu),
"GetTickCount" => GetTickCount(emu),
"GetTimeZoneInformation" => GetTimeZoneInformation(emu),
"GetUserDefaultLangId" => GetUserDefaultLangId(emu),
"GetUserDefaultLCID" => GetUserDefaultLCID(emu),
"GetVersion" => GetVersion(emu),
"GetVersionExA" => GetVersionExA(emu),
"GetVersionExW" => GetVersionExW(emu),
"GetWindowsDirectoryA" => GetWindowsDirectoryA(emu),
"GetWindowsDirectoryW" => GetWindowsDirectoryW(emu),
"GlobalAddAtomA" => GlobalAddAtomA(emu),
"HeapAlloc" => HeapAlloc(emu),
"HeapCreate" => HeapCreate(emu),
"HeapFree" => HeapFree(emu),
"HeapReAlloc" => HeapReAlloc(emu),
"InitializeCriticalSection" => InitializeCriticalSection(emu),
"InitializeCriticalSectionAndSpinCount" => InitializeCriticalSectionAndSpinCount(emu),
"InitializeCriticalSectionEx" => InitializeCriticalSectionEx(emu),
"InitOnceBeginInitialize" => InitOnceBeginInitialize(emu),
"IsBadReadPtr" => IsBadReadPtr(emu),
"IsDebuggerPresent" => IsDebuggerPresent(emu),
"IsProcessorFeaturePresent" => IsProcessorFeaturePresent(emu),
"LeaveCriticalSection" => LeaveCriticalSection(emu),
"LoadLibraryA" => LoadLibraryA(emu),
"LoadLibraryExA" => LoadLibraryExA(emu),
"LoadLibraryExW" => LoadLibraryExW(emu),
"LoadLibraryW" => LoadLibraryW(emu),
"LoadResource" => LoadResource(emu),
"LocalAlloc" => LocalAlloc(emu),
"LocalFree" => LocalFree(emu),
"LockResource" => LockResource(emu),
"lstrcatA" => lstrcatA(emu),
"lstrcatW" => lstrcatW(emu),
"LStrCmpI" => LStrCmpI(emu),
"lstrcmpiW" => LStrCmpIW(emu),
"LStrCmpIW" => LStrCmpIW(emu),
"lstrcpy" => lstrcpy(emu),
"lstrcpyn" => lstrcpyn(emu),
"lstrcpyW" => lstrcpyW(emu),
"lstrlenA" => lstrlenA(emu),
"lstrlenW" => lstrlenW(emu),
"MapViewOfFile" => MapViewOfFile(emu),
"MoveFileA" => MoveFileA(emu),
"MoveFileW" => MoveFileW(emu),
"MultiByteToWideChar" => MultiByteToWideChar(emu),
"OpenProcess" => OpenProcess(emu),
"OpenProcessToken" => OpenProcessToken(emu),
"OpenThread" => OpenThread(emu),
"Process32First" => Process32First(emu),
"Process32Next" => Process32Next(emu),
"QueryPerformanceCounter" => QueryPerformanceCounter(emu),
"ReadFile" => ReadFile(emu),
"ReadProcessMemory" => ReadProcessMemory(emu),
"RegCloseKey" => RegCloseKey(emu),
"RegCreateKeyExA" => RegCreateKeyExA(emu),
"RegCreateKeyExW" => RegCreateKeyExW(emu),
"RegOpenKeyA" => RegOpenKeyA(emu),
"RegSetValueExA" => RegSetValueExA(emu),
"RegSetValueExW" => RegSetValueExW(emu),
"ResetEvent" => ResetEvent(emu),
"ResumeThread" => ResumeThread(emu),
"SetCurrentDirectoryA" => SetCurrentDirectoryA(emu),
"SetErrorMode" => SetErrorMode(emu),
"SetFilePointer" => SetFilePointer(emu),
"SetLastError" => SetLastError(emu),
"SetThreadLocale" => SetThreadLocale(emu),
"SetThreadStackGuarantee" => SetThreadStackGuarantee(emu),
"SetUnhandledExceptionFilter" => SetUnhandledExceptionFilter(emu),
"SizeofResource" => SizeofResource(emu),
"Sleep" => Sleep(emu),
"SystemTimeToFileTime" => SystemTimeToFileTime(emu),
"SystemTimeToTzSpecificLocalTime" => SystemTimeToTzSpecificLocalTime(emu),
"TerminateProcess" => TerminateProcess(emu),
"Thread32First" => Thread32First(emu),
"Thread32Next" => Thread32Next(emu),
"TlsAlloc" => TlsAlloc(emu),
"TlsFree" => TlsFree(emu),
"TlsGetValue" => TlsGetValue(emu),
"TlsSetValue" => TlsSetValue(emu),
"UnhandledExceptionFilter" => UnhandledExceptionFilter(emu),
"VirtualAlloc" => VirtualAlloc(emu),
"VirtualAllocEx" => VirtualAllocEx(emu),
"VirtualAllocExNuma" => VirtualAllocExNuma(emu),
"VirtualFree" => VirtualFree(emu),
"VirtualLock" => VirtualLock(emu),
"VirtualProtect" => VirtualProtect(emu),
"VirtualProtectEx" => VirtualProtectEx(emu),
"WaitForSingleObject" => WaitForSingleObject(emu),
"WideCharToMultiByte" => WideCharToMultiByte(emu),
"WinExec" => WinExec(emu),
"WriteConsoleW" => WriteConsoleW(emu),
"WriteFile" => WriteFile(emu),
"WriteProcessMemory" => WriteProcessMemory(emu),
"DeviceIoControl" => api_DeviceIoControl(emu),
_ => {
if emu.cfg.skip_unimplemented == false {
if emu.cfg.dump_on_exit && emu.cfg.dump_filename.is_some() {
serialization::Serialization::dump(
&emu,
emu.cfg.dump_filename.as_ref().unwrap(),
);
}
unimplemented!("atemmpt to call unimplemented API 0x{:x} {}", addr, api);
}
log::warn!(
"calling unimplemented API 0x{:x} {} at 0x{:x}",
addr,
api,
emu.regs().rip
);
return api.to_ascii_lowercase();
}
}
String::new()
}