From 55a62a27c93166057f84f85fc730d3ebeea5a09d Mon Sep 17 00:00:00 2001 From: Luke Street Date: Thu, 30 Oct 2025 02:23:09 -0600 Subject: [PATCH] Initial guest-to-host trampoline generation --- .dockerignore | 6 + .gitignore | 11 + CMakeLists.txt | 102 ++++- Dockerfile | 9 +- Dockerfile.ubuntu | 15 +- dll/advapi32.cpp | 108 +---- dll/advapi32/processthreadsapi.h | 2 +- dll/advapi32/securitybaseapi.h | 2 +- dll/advapi32/winbase.h | 2 +- dll/advapi32/wincrypt.h | 2 +- dll/advapi32/winreg.h | 2 +- dll/bcrypt.cpp | 19 +- dll/bcrypt.h | 12 + dll/crt.cpp | 8 +- dll/kernel32.cpp | 610 +---------------------------- dll/kernel32/debugapi.cpp | 2 +- dll/kernel32/debugapi.h | 4 +- dll/kernel32/errhandlingapi.cpp | 24 +- dll/kernel32/errhandlingapi.h | 19 +- dll/kernel32/fibersapi.cpp | 8 +- dll/kernel32/fibersapi.h | 10 +- dll/kernel32/fileapi.cpp | 78 ++-- dll/kernel32/fileapi.h | 80 ++-- dll/kernel32/handleapi.cpp | 4 +- dll/kernel32/handleapi.h | 6 +- dll/kernel32/heapapi.cpp | 21 +- dll/kernel32/heapapi.h | 18 +- dll/kernel32/interlockedapi.cpp | 10 +- dll/kernel32/interlockedapi.h | 12 +- dll/kernel32/internal.h | 3 +- dll/kernel32/ioapiset.cpp | 2 +- dll/kernel32/ioapiset.h | 4 +- dll/kernel32/libloaderapi.cpp | 35 +- dll/kernel32/libloaderapi.h | 36 +- dll/kernel32/memoryapi.cpp | 25 +- dll/kernel32/memoryapi.h | 26 +- dll/kernel32/minwinbase.h | 6 +- dll/kernel32/namedpipeapi.cpp | 6 +- dll/kernel32/namedpipeapi.h | 8 +- dll/kernel32/processenv.cpp | 24 +- dll/kernel32/processenv.h | 26 +- dll/kernel32/processthreadsapi.cpp | 60 +-- dll/kernel32/processthreadsapi.h | 84 ++-- dll/kernel32/profileapi.cpp | 4 +- dll/kernel32/profileapi.h | 6 +- dll/kernel32/stringapiset.cpp | 8 +- dll/kernel32/stringapiset.h | 10 +- dll/kernel32/synchapi.cpp | 52 +-- dll/kernel32/synchapi.h | 67 ++-- dll/kernel32/sysinfoapi.cpp | 14 +- dll/kernel32/sysinfoapi.h | 16 +- dll/kernel32/timezoneapi.cpp | 14 +- dll/kernel32/timezoneapi.h | 16 +- dll/kernel32/winbase.cpp | 106 ++--- dll/kernel32/winbase.h | 110 +++--- dll/kernel32/wincon.cpp | 22 +- dll/kernel32/wincon.h | 24 +- dll/kernel32/winnls.cpp | 32 +- dll/kernel32/winnls.h | 34 +- dll/kernel32/winnt.cpp | 2 +- dll/kernel32/winnt.h | 4 +- dll/kernel32/wow64apiset.cpp | 6 +- dll/kernel32/wow64apiset.h | 8 +- dll/mscoree.cpp | 2 + dll/msvcrt.cpp | 4 +- dll/ntdll.cpp | 1 + dll/ole32.cpp | 2 + dll/user32.cpp | 2 + dll/vcruntime.cpp | 2 + src/common.h | 390 +----------------- src/context.cpp | 14 +- src/context.h | 2 +- src/errors.cpp | 3 +- src/errors.h | 4 +- src/main.cpp | 32 +- src/modules.cpp | 16 +- src/modules.h | 2 +- src/processes.cpp | 5 +- src/resources.h | 2 +- src/strutil.cpp | 3 +- src/tls.cpp | 62 +-- src/tls.h | 14 +- src/types.h | 405 +++++++++++++++++++ tools/gen_trampolines.py | 248 ++++++++++++ tools/script_venv.py | 236 +++++++++++ 85 files changed, 1750 insertions(+), 1807 deletions(-) create mode 100644 dll/bcrypt.h create mode 100644 src/types.h create mode 100644 tools/gen_trampolines.py create mode 100644 tools/script_venv.py diff --git a/.dockerignore b/.dockerignore index ded8c7a..02b030e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,11 @@ +.idea/ .cache/ .git/ .vscode/ build/ tmp/ +tools/.venv/ +tools/__pycache__/ +tools/*.pyc +tools/*.pyo +tools/*.pyd diff --git a/.gitignore b/.gitignore index 9030c66..5376a77 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,19 @@ build/ *.o .vscode/ + # CLion .idea/ cmake-build-*/ + # clangd .cache/ + +# Python +__pycache__/ +.venv/ +env/ +venv/ +*.pyc +*.pyo +*.pyd diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a1a916..b818d28 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ set(CMAKE_CXX_FLAGS_INIT "-m32 -fno-exceptions -fno-rtti") set(CMAKE_EXE_LINKER_FLAGS_INIT "-m32") set(CMAKE_SHARED_LINKER_FLAGS_INIT "-m32") -project(wibo LANGUAGES C CXX) +project(wibo LANGUAGES ASM C CXX) set(WIBO_VERSION "" CACHE STRING "Version string for the wibo binary; if empty, attempts to use git describe") @@ -33,6 +33,11 @@ if(NOT DEFINED WIBO_VERSION_STRING OR "${WIBO_VERSION_STRING}" STREQUAL "") set(WIBO_VERSION_STRING "unknown") endif() +# Clang on Linux needs help finding the 32-bit headers +if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_SYSTEM_NAME STREQUAL "Linux") + include_directories(/usr/i686-linux-gnu/include) +endif() + set(WIBO_GENERATED_HEADER_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated) file(MAKE_DIRECTORY ${WIBO_GENERATED_HEADER_DIR}) configure_file( @@ -179,10 +184,13 @@ add_executable(wibo ) target_compile_definitions(wibo PRIVATE _GNU_SOURCE _FILE_OFFSET_BITS=64 _TIME_BITS=64) target_compile_features(wibo PRIVATE cxx_std_20) -target_compile_options(wibo PRIVATE -Wall -Wextra -fno-pie -maccumulate-outgoing-args) +target_compile_options(wibo PRIVATE -Wall -Wextra) +if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + target_compile_options(wibo PRIVATE -fno-pie -maccumulate-outgoing-args) + target_link_options(wibo PRIVATE -no-pie -maccumulate-outgoing-args) +endif() target_include_directories(wibo PRIVATE dll src ${WIBO_GENERATED_HEADER_DIR}) -target_link_libraries(wibo PRIVATE mimalloc-obj) -target_link_options(wibo PRIVATE -no-pie) +target_link_libraries(wibo PRIVATE mimalloc-obj atomic) if (WIBO_ENABLE_LIBURING) target_compile_definitions(wibo PRIVATE WIBO_ENABLE_LIBURING=1) target_link_libraries(wibo PRIVATE liburing) @@ -192,6 +200,92 @@ else() endif() install(TARGETS wibo DESTINATION bin) +find_package(Python3 COMPONENTS Interpreter REQUIRED) + +# Track down libclang for trampoline generation. +# find_package(Clang) ends up requiring too many dependencies, +# so a quick-and-dirty manual search is done here instead. +set(CLANG_ROOT "/usr" CACHE PATH "Path to Clang installation") +set(_LLVM_MIN_VER 17) +set(_LLVM_MAX_VER 25) +set(_CLANG_LIB_SUFFIXES "") +foreach(ver RANGE ${_LLVM_MAX_VER} ${_LLVM_MIN_VER} -1) + list(APPEND _CLANG_LIB_SUFFIXES "llvm-${ver}/lib") +endforeach() +list(APPEND _CLANG_LIB_SUFFIXES llvm/lib lib lib64) +find_library(LIBCLANG_LIBRARY + NAMES libclang clang + HINTS ${CLANG_ROOT} + PATH_SUFFIXES ${_CLANG_LIB_SUFFIXES} +) +if(NOT LIBCLANG_LIBRARY) + message(FATAL_ERROR "libclang library not found!") +endif() +message(STATUS "Using libclang library: ${LIBCLANG_LIBRARY}") + +function(wibo_codegen_module) + set(options) + set(oneValueArgs NAME) + set(multiValueArgs HEADERS) + cmake_parse_arguments(PARSE_ARGV 0 module "${options}" "${oneValueArgs}" "${multiValueArgs}") + + set(out_asm ${WIBO_GENERATED_HEADER_DIR}/${module_NAME}_trampolines.S) + set(out_hdr ${WIBO_GENERATED_HEADER_DIR}/${module_NAME}_trampolines.h) + add_custom_command( + OUTPUT ${out_asm} ${out_hdr} + COMMAND ${CMAKE_COMMAND} -E env + ${CMAKE_COMMAND} -E echo "Generating ${module_NAME} trampolines" + COMMAND ${CMAKE_COMMAND} -E env + LIBCLANG_PATH=${LIBCLANG_LIBRARY} + ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/gen_trampolines.py + --dll ${module_NAME} + --headers ${module_HEADERS} + --namespace ${module_NAME} + --arch x86 + --out-asm ${out_asm} + --out-hdr ${out_hdr} + -I ${CMAKE_CURRENT_SOURCE_DIR} + -I ${CMAKE_CURRENT_SOURCE_DIR}/dll + -I ${CMAKE_CURRENT_SOURCE_DIR}/src + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/gen_trampolines.py ${module_HEADERS}) + target_sources(wibo PRIVATE ${out_asm}) + set_source_files_properties(${out_asm} PROPERTIES COMPILE_FLAGS "-m32") +endfunction() + +wibo_codegen_module(NAME advapi32 HEADERS + dll/advapi32/processthreadsapi.h + dll/advapi32/securitybaseapi.h + dll/advapi32/winbase.h + dll/advapi32/wincrypt.h + dll/advapi32/winreg.h +) +wibo_codegen_module(NAME bcrypt HEADERS dll/bcrypt.h) +wibo_codegen_module(NAME kernel32 HEADERS + dll/kernel32/debugapi.h + dll/kernel32/errhandlingapi.h + dll/kernel32/fibersapi.h + dll/kernel32/fileapi.h + dll/kernel32/handleapi.h + dll/kernel32/heapapi.h + dll/kernel32/interlockedapi.h + dll/kernel32/ioapiset.h + dll/kernel32/libloaderapi.h + dll/kernel32/memoryapi.h + dll/kernel32/namedpipeapi.h + dll/kernel32/processenv.h + dll/kernel32/processthreadsapi.h + dll/kernel32/profileapi.h + dll/kernel32/stringapiset.h + dll/kernel32/synchapi.h + dll/kernel32/sysinfoapi.h + dll/kernel32/timezoneapi.h + dll/kernel32/winbase.h + dll/kernel32/wincon.h + dll/kernel32/winnls.h + dll/kernel32/winnt.h + dll/kernel32/wow64apiset.h +) + if (WIBO_ENABLE_FIXTURE_TESTS) include(CTest) diff --git a/Dockerfile b/Dockerfile index 4499c71..5165cd2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,15 +5,18 @@ FROM --platform=linux/i386 alpine:latest AS build RUN apk add --no-cache \ bash \ binutils \ + clang \ + clang-dev \ cmake \ coreutils \ - g++ \ git \ linux-headers \ + llvm-dev \ make \ mingw-w64-binutils \ mingw-w64-gcc \ - ninja + ninja \ + python3 # Copy source files WORKDIR /wibo @@ -31,6 +34,8 @@ ARG WIBO_VERSION # Build static binary RUN cmake -S /wibo -B /wibo/build -G Ninja \ -DCMAKE_BUILD_TYPE:STRING="$BUILD_TYPE" \ + -DCMAKE_C_COMPILER:STRING=clang \ + -DCMAKE_CXX_COMPILER:STRING=clang++ \ -DCMAKE_C_FLAGS:STRING="-static" \ -DCMAKE_CXX_FLAGS:STRING="-static" \ -DMI_LIBC_MUSL:BOOL=ON \ diff --git a/Dockerfile.ubuntu b/Dockerfile.ubuntu index 9f75a38..486c4b0 100644 --- a/Dockerfile.ubuntu +++ b/Dockerfile.ubuntu @@ -8,14 +8,23 @@ RUN apt-get update \ binutils \ binutils-mingw-w64-i686 \ ca-certificates \ + clang \ cmake \ file \ - g++-multilib \ gcc-mingw-w64-i686 \ gdb \ git \ + lib32gcc-13-dev \ + lib32stdc++-13-dev \ + libc6-dev-i386 \ + libclang-dev \ + linux-libc-dev-i386-cross \ + llvm \ make \ ninja-build \ + python3 \ + python3-pip \ + python3-venv \ unzip \ wget \ && rm -rf /var/lib/apt/lists/* @@ -34,11 +43,13 @@ ARG ENABLE_LTO=AUTO ARG WIBO_VERSION RUN cmake -S /wibo -B /wibo/build -G Ninja \ + -DCMAKE_AR:PATH=/usr/bin/llvm-ar \ + -DCMAKE_RANLIB:PATH=/usr/bin/llvm-ranlib \ -DCMAKE_BUILD_TYPE:STRING="$BUILD_TYPE" \ -DWIBO_ENABLE_LIBURING:BOOL=ON \ -DWIBO_ENABLE_LTO:STRING="$ENABLE_LTO" \ -DWIBO_VERSION:STRING="$WIBO_VERSION" \ - && cmake --build /wibo/build --verbose \ + && LIBCLANG_PATH=/usr/lib/llvm-18/lib cmake --build /wibo/build --verbose \ && ( [ "$BUILD_TYPE" != "Release" ] || strip -g /wibo/build/wibo ) # Export binary (usage: docker build -f Dockerfile.ubuntu --target export --output dist .) diff --git a/dll/advapi32.cpp b/dll/advapi32.cpp index b2b559b..ce68888 100644 --- a/dll/advapi32.cpp +++ b/dll/advapi32.cpp @@ -1,116 +1,12 @@ #include "modules.h" -#include "advapi32/processthreadsapi.h" -#include "advapi32/securitybaseapi.h" -#include "advapi32/winbase.h" -#include "advapi32/wincrypt.h" -#include "advapi32/winreg.h" - -#include - -namespace { - -void *resolveByName(const char *name) { - // processthreadsapi.h - if (strcmp(name, "OpenProcessToken") == 0) - return (void *)advapi32::OpenProcessToken; - - // securitybaseapi.h - if (strcmp(name, "InitializeAcl") == 0) - return (void *)advapi32::InitializeAcl; - if (strcmp(name, "AddAccessAllowedAce") == 0) - return (void *)advapi32::AddAccessAllowedAce; - if (strcmp(name, "FindFirstFreeAce") == 0) - return (void *)advapi32::FindFirstFreeAce; - if (strcmp(name, "GetSidIdentifierAuthority") == 0) - return (void *)advapi32::GetSidIdentifierAuthority; - if (strcmp(name, "GetSidSubAuthorityCount") == 0) - return (void *)advapi32::GetSidSubAuthorityCount; - if (strcmp(name, "GetSidSubAuthority") == 0) - return (void *)advapi32::GetSidSubAuthority; - if (strcmp(name, "ImpersonateLoggedOnUser") == 0) - return (void *)advapi32::ImpersonateLoggedOnUser; - if (strcmp(name, "DuplicateTokenEx") == 0) - return (void *)advapi32::DuplicateTokenEx; - if (strcmp(name, "CopySid") == 0) - return (void *)advapi32::CopySid; - if (strcmp(name, "InitializeSid") == 0) - return (void *)advapi32::InitializeSid; - if (strcmp(name, "EqualSid") == 0) - return (void *)advapi32::EqualSid; - if (strcmp(name, "GetSecurityDescriptorDacl") == 0) - return (void *)advapi32::GetSecurityDescriptorDacl; - if (strcmp(name, "SetKernelObjectSecurity") == 0) - return (void *)advapi32::SetKernelObjectSecurity; - if (strcmp(name, "InitializeSecurityDescriptor") == 0) - return (void *)advapi32::InitializeSecurityDescriptor; - if (strcmp(name, "SetSecurityDescriptorDacl") == 0) - return (void *)advapi32::SetSecurityDescriptorDacl; - if (strcmp(name, "GetTokenInformation") == 0) - return (void *)advapi32::GetTokenInformation; - if (strcmp(name, "AdjustTokenPrivileges") == 0) - return (void *)advapi32::AdjustTokenPrivileges; - if (strcmp(name, "SetTokenInformation") == 0) - return (void *)advapi32::SetTokenInformation; - - // winbase.h - if (strcmp(name, "LookupAccountSidW") == 0) - return (void *)advapi32::LookupAccountSidW; - if (strcmp(name, "LookupPrivilegeValueA") == 0) - return (void *)advapi32::LookupPrivilegeValueA; - if (strcmp(name, "LookupPrivilegeValueW") == 0) - return (void *)advapi32::LookupPrivilegeValueW; - if (strcmp(name, "GetUserNameA") == 0) - return (void *)advapi32::GetUserNameA; - if (strcmp(name, "GetUserNameW") == 0) - return (void *)advapi32::GetUserNameW; - - // wincrypt.h - if (strcmp(name, "CryptReleaseContext") == 0) - return (void *)advapi32::CryptReleaseContext; - if (strcmp(name, "CryptAcquireContextW") == 0) - return (void *)advapi32::CryptAcquireContextW; - if (strcmp(name, "CryptGenRandom") == 0) - return (void *)advapi32::CryptGenRandom; - if (strcmp(name, "CryptCreateHash") == 0) - return (void *)advapi32::CryptCreateHash; - if (strcmp(name, "CryptHashData") == 0) - return (void *)advapi32::CryptHashData; - if (strcmp(name, "CryptGetHashParam") == 0) - return (void *)advapi32::CryptGetHashParam; - if (strcmp(name, "CryptDestroyHash") == 0) - return (void *)advapi32::CryptDestroyHash; - - // winreg.h - if (strcmp(name, "RegCreateKeyExA") == 0) - return (void *)advapi32::RegCreateKeyExA; - if (strcmp(name, "RegCreateKeyExW") == 0) - return (void *)advapi32::RegCreateKeyExW; - if (strcmp(name, "RegOpenKeyExA") == 0) - return (void *)advapi32::RegOpenKeyExA; - if (strcmp(name, "RegOpenKeyExW") == 0) - return (void *)advapi32::RegOpenKeyExW; - if (strcmp(name, "RegQueryValueExA") == 0) - return (void *)advapi32::RegQueryValueExA; - if (strcmp(name, "RegQueryValueExW") == 0) - return (void *)advapi32::RegQueryValueExW; - if (strcmp(name, "RegEnumKeyExA") == 0) - return (void *)advapi32::RegEnumKeyExA; - if (strcmp(name, "RegEnumKeyExW") == 0) - return (void *)advapi32::RegEnumKeyExW; - if (strcmp(name, "RegCloseKey") == 0) - return (void *)advapi32::RegCloseKey; - - return nullptr; -} - -} // namespace +#include "advapi32_trampolines.h" extern const wibo::ModuleStub lib_advapi32 = { (const char *[]){ "advapi32", nullptr, }, - resolveByName, + advapi32_trampoline_by_name, nullptr, }; diff --git a/dll/advapi32/processthreadsapi.h b/dll/advapi32/processthreadsapi.h index 52cf4c1..6644b84 100644 --- a/dll/advapi32/processthreadsapi.h +++ b/dll/advapi32/processthreadsapi.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" namespace advapi32 { diff --git a/dll/advapi32/securitybaseapi.h b/dll/advapi32/securitybaseapi.h index 0563ce6..9446bbe 100644 --- a/dll/advapi32/securitybaseapi.h +++ b/dll/advapi32/securitybaseapi.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" struct ACL { BYTE AclRevision; diff --git a/dll/advapi32/winbase.h b/dll/advapi32/winbase.h index c38a27a..de20e5f 100644 --- a/dll/advapi32/winbase.h +++ b/dll/advapi32/winbase.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" enum SID_NAME_USE : DWORD { SidTypeUser = 1, diff --git a/dll/advapi32/wincrypt.h b/dll/advapi32/wincrypt.h index 29a3821..b6b619f 100644 --- a/dll/advapi32/wincrypt.h +++ b/dll/advapi32/wincrypt.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" using ALG_ID = DWORD; using HCRYPTPROV = ULONG_PTR; diff --git a/dll/advapi32/winreg.h b/dll/advapi32/winreg.h index e5c855d..bec8b23 100644 --- a/dll/advapi32/winreg.h +++ b/dll/advapi32/winreg.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" struct FILETIME; diff --git a/dll/bcrypt.cpp b/dll/bcrypt.cpp index d46edf3..a77836b 100644 --- a/dll/bcrypt.cpp +++ b/dll/bcrypt.cpp @@ -1,15 +1,16 @@ +#include "bcrypt.h" + #include "common.h" #include "context.h" #include "errors.h" #include "modules.h" +#include #include #include namespace { -typedef PVOID BCRYPT_ALG_HANDLE; - constexpr ULONG BCRYPT_RNG_USE_ENTROPY_IN_BUFFER = 0x00000001; constexpr ULONG BCRYPT_USE_SYSTEM_PREFERRED_RNG = 0x00000002; @@ -33,7 +34,7 @@ bool fillWithSystemRandom(PUCHAR buffer, size_t length) { namespace bcrypt { -NTSTATUS WIN_FUNC BCryptGenRandom(BCRYPT_ALG_HANDLE hAlgorithm, PUCHAR pbBuffer, ULONG cbBuffer, ULONG dwFlags) { +NTSTATUS WINAPI BCryptGenRandom(BCRYPT_ALG_HANDLE hAlgorithm, PUCHAR pbBuffer, ULONG cbBuffer, ULONG dwFlags) { HOST_CONTEXT_GUARD(); DEBUG_LOG("BCryptGenRandom(%p, %p, %lu, %lu)\n", hAlgorithm, pbBuffer, cbBuffer, dwFlags); if (pbBuffer == nullptr && cbBuffer != 0) @@ -66,7 +67,7 @@ NTSTATUS WIN_FUNC BCryptGenRandom(BCRYPT_ALG_HANDLE hAlgorithm, PUCHAR pbBuffer, return STATUS_SUCCESS; } -BOOL WIN_FUNC ProcessPrng(PBYTE pbData, SIZE_T cbData) { +BOOL WINAPI ProcessPrng(PBYTE pbData, SIZE_T cbData) { HOST_CONTEXT_GUARD(); DEBUG_LOG("ProcessPrng(%p, %lu)\n", pbData, cbData); if (pbData == nullptr && cbData != 0) @@ -76,13 +77,7 @@ BOOL WIN_FUNC ProcessPrng(PBYTE pbData, SIZE_T cbData) { } // namespace bcrypt -static void *resolveByName(const char *name) { - if (strcmp(name, "BCryptGenRandom") == 0) - return (void *)bcrypt::BCryptGenRandom; - if (strcmp(name, "ProcessPrng") == 0) - return (void *)bcrypt::ProcessPrng; - return nullptr; -} +#include "bcrypt_trampolines.h" extern const wibo::ModuleStub lib_bcrypt = { (const char *[]){ @@ -90,6 +85,6 @@ extern const wibo::ModuleStub lib_bcrypt = { "bcryptprimitives", nullptr, }, - resolveByName, + bcrypt_trampoline_by_name, nullptr, }; diff --git a/dll/bcrypt.h b/dll/bcrypt.h new file mode 100644 index 0000000..f12cbb8 --- /dev/null +++ b/dll/bcrypt.h @@ -0,0 +1,12 @@ +#pragma once + +#include "types.h" + +using BCRYPT_ALG_HANDLE = PVOID; + +namespace bcrypt { + +NTSTATUS WINAPI BCryptGenRandom(BCRYPT_ALG_HANDLE hAlgorithm, PUCHAR pbBuffer, ULONG cbBuffer, ULONG dwFlags); +BOOL WINAPI ProcessPrng(PBYTE pbData, SIZE_T cbData); + +} // namespace bcrypt diff --git a/dll/crt.cpp b/dll/crt.cpp index 6191928..739d702 100644 --- a/dll/crt.cpp +++ b/dll/crt.cpp @@ -45,7 +45,7 @@ _invalid_parameter_handler invalidParameterHandler = nullptr; void WIN_ENTRY _initterm(const _PVFV *ppfn, const _PVFV *end) { HOST_CONTEXT_GUARD(); DEBUG_LOG("_initterm(%p, %p)\n", ppfn, end); - TIB *tib = wibo::getThreadTibForHost(); + auto *tib = wibo::getThreadTibForHost(); do { if (_PVFV pfn = *++ppfn) { DEBUG_LOG("-> calling %p\n", pfn); @@ -60,7 +60,7 @@ void WIN_ENTRY _initterm(const _PVFV *ppfn, const _PVFV *end) { int WIN_ENTRY _initterm_e(const _PIFV *ppfn, const _PIFV *end) { HOST_CONTEXT_GUARD(); DEBUG_LOG("_initterm_e(%p, %p)\n", ppfn, end); - TIB *tib = wibo::getThreadTibForHost(); + auto *tib = wibo::getThreadTibForHost(); do { if (_PIFV pfn = *++ppfn) { DEBUG_LOG("-> calling %p\n", pfn); @@ -284,7 +284,7 @@ int WIN_ENTRY _execute_onexit_table(void *table) { void WIN_ENTRY exit(int status) { HOST_CONTEXT_GUARD(); DEBUG_LOG("exit(%i)\n", status); - TIB *tib = wibo::getThreadTibForHost(); + auto *tib = wibo::getThreadTibForHost(); for (auto it = atexitFuncs.rbegin(); it != atexitFuncs.rend(); ++it) { DEBUG_LOG("Calling atexit function %p\n", *it); { @@ -298,7 +298,7 @@ void WIN_ENTRY exit(int status) { void WIN_ENTRY _cexit() { HOST_CONTEXT_GUARD(); DEBUG_LOG("_cexit()\n"); - TIB *tib = wibo::getThreadTibForHost(); + auto *tib = wibo::getThreadTibForHost(); for (auto it = atexitFuncs.rbegin(); it != atexitFuncs.rend(); ++it) { DEBUG_LOG("Calling atexit function %p\n", *it); { diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index b2e31b6..f00a125 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -1,618 +1,12 @@ #include "modules.h" -#include "kernel32/debugapi.h" -#include "kernel32/errhandlingapi.h" -#include "kernel32/fibersapi.h" -#include "kernel32/fileapi.h" -#include "kernel32/handleapi.h" -#include "kernel32/heapapi.h" -#include "kernel32/interlockedapi.h" -#include "kernel32/ioapiset.h" -#include "kernel32/libloaderapi.h" -#include "kernel32/memoryapi.h" -#include "kernel32/namedpipeapi.h" -#include "kernel32/processenv.h" -#include "kernel32/processthreadsapi.h" -#include "kernel32/profileapi.h" -#include "kernel32/stringapiset.h" -#include "kernel32/synchapi.h" -#include "kernel32/sysinfoapi.h" -#include "kernel32/timezoneapi.h" -#include "kernel32/winbase.h" -#include "kernel32/wincon.h" -#include "kernel32/winnls.h" -#include "kernel32/winnt.h" -#include "kernel32/wow64apiset.h" - -namespace { - -void *resolveByName(const char *name) { - // errhandlingapi.h - if (strcmp(name, "GetLastError") == 0) - return (void *)kernel32::GetLastError; - if (strcmp(name, "SetLastError") == 0) - return (void *)kernel32::SetLastError; - if (strcmp(name, "IsBadReadPtr") == 0) - return (void *)kernel32::IsBadReadPtr; - if (strcmp(name, "IsBadWritePtr") == 0) - return (void *)kernel32::IsBadWritePtr; - if (strcmp(name, "RaiseException") == 0) - return (void *)kernel32::RaiseException; - if (strcmp(name, "AddVectoredExceptionHandler") == 0) - return (void *)kernel32::AddVectoredExceptionHandler; - if (strcmp(name, "SetUnhandledExceptionFilter") == 0) - return (void *)kernel32::SetUnhandledExceptionFilter; - if (strcmp(name, "UnhandledExceptionFilter") == 0) - return (void *)kernel32::UnhandledExceptionFilter; - if (strcmp(name, "SetErrorMode") == 0) - return (void *)kernel32::SetErrorMode; - - // processthreadsapi.h - if (strcmp(name, "IsProcessorFeaturePresent") == 0) - return (void *)kernel32::IsProcessorFeaturePresent; - if (strcmp(name, "GetCurrentProcess") == 0) - return (void *)kernel32::GetCurrentProcess; - if (strcmp(name, "GetCurrentProcessId") == 0) - return (void *)kernel32::GetCurrentProcessId; - if (strcmp(name, "GetCurrentThreadId") == 0) - return (void *)kernel32::GetCurrentThreadId; - if (strcmp(name, "ExitProcess") == 0) - return (void *)kernel32::ExitProcess; - if (strcmp(name, "TerminateProcess") == 0) - return (void *)kernel32::TerminateProcess; - if (strcmp(name, "GetExitCodeProcess") == 0) - return (void *)kernel32::GetExitCodeProcess; - if (strcmp(name, "CreateProcessW") == 0) - return (void *)kernel32::CreateProcessW; - if (strcmp(name, "CreateProcessA") == 0) - return (void *)kernel32::CreateProcessA; - if (strcmp(name, "CreateThread") == 0) - return (void *)kernel32::CreateThread; - if (strcmp(name, "ExitThread") == 0) - return (void *)kernel32::ExitThread; - if (strcmp(name, "GetExitCodeThread") == 0) - return (void *)kernel32::GetExitCodeThread; - if (strcmp(name, "TlsAlloc") == 0) - return (void *)kernel32::TlsAlloc; - if (strcmp(name, "TlsFree") == 0) - return (void *)kernel32::TlsFree; - if (strcmp(name, "TlsGetValue") == 0) - return (void *)kernel32::TlsGetValue; - if (strcmp(name, "TlsSetValue") == 0) - return (void *)kernel32::TlsSetValue; - if (strcmp(name, "GetStartupInfoA") == 0) - return (void *)kernel32::GetStartupInfoA; - if (strcmp(name, "GetStartupInfoW") == 0) - return (void *)kernel32::GetStartupInfoW; - if (strcmp(name, "SetThreadStackGuarantee") == 0) - return (void *)kernel32::SetThreadStackGuarantee; - if (strcmp(name, "GetCurrentThread") == 0) - return (void *)kernel32::GetCurrentThread; - if (strcmp(name, "GetThreadTimes") == 0) - return (void *)kernel32::GetThreadTimes; - if (strcmp(name, "SetThreadDescription") == 0) - return (void *)kernel32::SetThreadDescription; - if (strcmp(name, "SetThreadAffinityMask") == 0) - return (void *)kernel32::SetThreadAffinityMask; - if (strcmp(name, "ResumeThread") == 0) - return (void *)kernel32::ResumeThread; - if (strcmp(name, "SetThreadPriority") == 0) - return (void *)kernel32::SetThreadPriority; - if (strcmp(name, "GetThreadPriority") == 0) - return (void *)kernel32::GetThreadPriority; - if (strcmp(name, "GetPriorityClass") == 0) - return (void *)kernel32::GetPriorityClass; - if (strcmp(name, "GetProcessAffinityMask") == 0) - return (void *)kernel32::GetProcessAffinityMask; - if (strcmp(name, "SetProcessAffinityMask") == 0) - return (void *)kernel32::SetProcessAffinityMask; - - // winnls.h - if (strcmp(name, "GetSystemDefaultLangID") == 0) - return (void *)kernel32::GetSystemDefaultLangID; - if (strcmp(name, "GetUserDefaultUILanguage") == 0) - return (void *)kernel32::GetUserDefaultUILanguage; - if (strcmp(name, "GetACP") == 0) - return (void *)kernel32::GetACP; - if (strcmp(name, "GetCPInfo") == 0) - return (void *)kernel32::GetCPInfo; - if (strcmp(name, "CompareStringA") == 0) - return (void *)kernel32::CompareStringA; - if (strcmp(name, "CompareStringW") == 0) - return (void *)kernel32::CompareStringW; - if (strcmp(name, "IsValidLocale") == 0) - return (void *)kernel32::IsValidLocale; - if (strcmp(name, "IsValidCodePage") == 0) - return (void *)kernel32::IsValidCodePage; - if (strcmp(name, "LCMapStringW") == 0) - return (void *)kernel32::LCMapStringW; - if (strcmp(name, "LCMapStringA") == 0) - return (void *)kernel32::LCMapStringA; - if (strcmp(name, "GetLocaleInfoA") == 0) - return (void *)kernel32::GetLocaleInfoA; - if (strcmp(name, "GetLocaleInfoW") == 0) - return (void *)kernel32::GetLocaleInfoW; - if (strcmp(name, "EnumSystemLocalesA") == 0) - return (void *)kernel32::EnumSystemLocalesA; - if (strcmp(name, "GetUserDefaultLCID") == 0) - return (void *)kernel32::GetUserDefaultLCID; - if (strcmp(name, "IsDBCSLeadByte") == 0) - return (void *)kernel32::IsDBCSLeadByte; - if (strcmp(name, "IsDBCSLeadByteEx") == 0) - return (void *)kernel32::IsDBCSLeadByteEx; - - // synchapi.h - if (strcmp(name, "InitializeCriticalSection") == 0) - return (void *)kernel32::InitializeCriticalSection; - if (strcmp(name, "InitializeCriticalSectionEx") == 0) - return (void *)kernel32::InitializeCriticalSectionEx; - if (strcmp(name, "InitializeCriticalSectionAndSpinCount") == 0) - return (void *)kernel32::InitializeCriticalSectionAndSpinCount; - if (strcmp(name, "DeleteCriticalSection") == 0) - return (void *)kernel32::DeleteCriticalSection; - if (strcmp(name, "EnterCriticalSection") == 0) - return (void *)kernel32::EnterCriticalSection; - if (strcmp(name, "LeaveCriticalSection") == 0) - return (void *)kernel32::LeaveCriticalSection; - if (strcmp(name, "InitOnceBeginInitialize") == 0) - return (void *)kernel32::InitOnceBeginInitialize; - if (strcmp(name, "InitOnceComplete") == 0) - return (void *)kernel32::InitOnceComplete; - if (strcmp(name, "AcquireSRWLockShared") == 0) - return (void *)kernel32::AcquireSRWLockShared; - if (strcmp(name, "ReleaseSRWLockShared") == 0) - return (void *)kernel32::ReleaseSRWLockShared; - if (strcmp(name, "AcquireSRWLockExclusive") == 0) - return (void *)kernel32::AcquireSRWLockExclusive; - if (strcmp(name, "ReleaseSRWLockExclusive") == 0) - return (void *)kernel32::ReleaseSRWLockExclusive; - if (strcmp(name, "TryAcquireSRWLockExclusive") == 0) - return (void *)kernel32::TryAcquireSRWLockExclusive; - if (strcmp(name, "WaitForSingleObject") == 0) - return (void *)kernel32::WaitForSingleObject; - if (strcmp(name, "WaitForMultipleObjects") == 0) - return (void *)kernel32::WaitForMultipleObjects; - if (strcmp(name, "CreateMutexA") == 0) - return (void *)kernel32::CreateMutexA; - if (strcmp(name, "CreateMutexW") == 0) - return (void *)kernel32::CreateMutexW; - if (strcmp(name, "CreateEventA") == 0) - return (void *)kernel32::CreateEventA; - if (strcmp(name, "CreateEventW") == 0) - return (void *)kernel32::CreateEventW; - if (strcmp(name, "CreateSemaphoreA") == 0) - return (void *)kernel32::CreateSemaphoreA; - if (strcmp(name, "CreateSemaphoreW") == 0) - return (void *)kernel32::CreateSemaphoreW; - if (strcmp(name, "SetEvent") == 0) - return (void *)kernel32::SetEvent; - if (strcmp(name, "ResetEvent") == 0) - return (void *)kernel32::ResetEvent; - if (strcmp(name, "ReleaseMutex") == 0) - return (void *)kernel32::ReleaseMutex; - if (strcmp(name, "ReleaseSemaphore") == 0) - return (void *)kernel32::ReleaseSemaphore; - if (strcmp(name, "Sleep") == 0) - return (void *)kernel32::Sleep; - - // namedpipeapi.h - if (strcmp(name, "CreatePipe") == 0) - return (void *)kernel32::CreatePipe; - if (strcmp(name, "CreateNamedPipeA") == 0) - return (void *)kernel32::CreateNamedPipeA; - if (strcmp(name, "ConnectNamedPipe") == 0) - return (void *)kernel32::ConnectNamedPipe; - - // winbase.h - if (strcmp(name, "FindAtomA") == 0) - return (void *)kernel32::FindAtomA; - if (strcmp(name, "FindAtomW") == 0) - return (void *)kernel32::FindAtomW; - if (strcmp(name, "AddAtomA") == 0) - return (void *)kernel32::AddAtomA; - if (strcmp(name, "AddAtomW") == 0) - return (void *)kernel32::AddAtomW; - if (strcmp(name, "GetAtomNameA") == 0) - return (void *)kernel32::GetAtomNameA; - if (strcmp(name, "GetAtomNameW") == 0) - return (void *)kernel32::GetAtomNameW; - if (strcmp(name, "GlobalAlloc") == 0) - return (void *)kernel32::GlobalAlloc; - if (strcmp(name, "GlobalReAlloc") == 0) - return (void *)kernel32::GlobalReAlloc; - if (strcmp(name, "GlobalFree") == 0) - return (void *)kernel32::GlobalFree; - if (strcmp(name, "GlobalFlags") == 0) - return (void *)kernel32::GlobalFlags; - if (strcmp(name, "LocalAlloc") == 0) - return (void *)kernel32::LocalAlloc; - if (strcmp(name, "LocalReAlloc") == 0) - return (void *)kernel32::LocalReAlloc; - if (strcmp(name, "LocalFree") == 0) - return (void *)kernel32::LocalFree; - if (strcmp(name, "LocalHandle") == 0) - return (void *)kernel32::LocalHandle; - if (strcmp(name, "LocalLock") == 0) - return (void *)kernel32::LocalLock; - if (strcmp(name, "LocalUnlock") == 0) - return (void *)kernel32::LocalUnlock; - if (strcmp(name, "LocalSize") == 0) - return (void *)kernel32::LocalSize; - if (strcmp(name, "LocalFlags") == 0) - return (void *)kernel32::LocalFlags; - if (strcmp(name, "GetSystemDirectoryA") == 0) - return (void *)kernel32::GetSystemDirectoryA; - if (strcmp(name, "GetSystemDirectoryW") == 0) - return (void *)kernel32::GetSystemDirectoryW; - if (strcmp(name, "GetSystemWow64DirectoryA") == 0) - return (void *)kernel32::GetSystemWow64DirectoryA; - if (strcmp(name, "GetSystemWow64DirectoryW") == 0) - return (void *)kernel32::GetSystemWow64DirectoryW; - if (strcmp(name, "GetCurrentDirectoryA") == 0) - return (void *)kernel32::GetCurrentDirectoryA; - if (strcmp(name, "GetCurrentDirectoryW") == 0) - return (void *)kernel32::GetCurrentDirectoryW; - if (strcmp(name, "GetSystemWindowsDirectoryA") == 0) - return (void *)kernel32::GetSystemWindowsDirectoryA; - if (strcmp(name, "GetSystemWindowsDirectoryW") == 0) - return (void *)kernel32::GetSystemWindowsDirectoryW; - if (strcmp(name, "SetCurrentDirectoryA") == 0) - return (void *)kernel32::SetCurrentDirectoryA; - if (strcmp(name, "SetCurrentDirectoryW") == 0) - return (void *)kernel32::SetCurrentDirectoryW; - if (strcmp(name, "SetHandleCount") == 0) - return (void *)kernel32::SetHandleCount; - if (strcmp(name, "FormatMessageA") == 0) - return (void *)kernel32::FormatMessageA; - if (strcmp(name, "GetComputerNameA") == 0) - return (void *)kernel32::GetComputerNameA; - if (strcmp(name, "GetComputerNameW") == 0) - return (void *)kernel32::GetComputerNameW; - if (strcmp(name, "EncodePointer") == 0) - return (void *)kernel32::EncodePointer; - if (strcmp(name, "DecodePointer") == 0) - return (void *)kernel32::DecodePointer; - if (strcmp(name, "SetDllDirectoryA") == 0) - return (void *)kernel32::SetDllDirectoryA; - if (strcmp(name, "FindActCtxSectionStringA") == 0) - return (void *)kernel32::FindActCtxSectionStringA; - if (strcmp(name, "FindActCtxSectionStringW") == 0) - return (void *)kernel32::FindActCtxSectionStringW; - if (strcmp(name, "GetLongPathNameA") == 0) - return (void *)kernel32::GetLongPathNameA; - if (strcmp(name, "GetLongPathNameW") == 0) - return (void *)kernel32::GetLongPathNameW; - if (strcmp(name, "GetDiskFreeSpaceA") == 0) - return (void *)kernel32::GetDiskFreeSpaceA; - if (strcmp(name, "GetDiskFreeSpaceW") == 0) - return (void *)kernel32::GetDiskFreeSpaceW; - if (strcmp(name, "GetDiskFreeSpaceExA") == 0) - return (void *)kernel32::GetDiskFreeSpaceExA; - if (strcmp(name, "GetDiskFreeSpaceExW") == 0) - return (void *)kernel32::GetDiskFreeSpaceExW; - - // processenv.h - if (strcmp(name, "GetCommandLineA") == 0) - return (void *)kernel32::GetCommandLineA; - if (strcmp(name, "GetCommandLineW") == 0) - return (void *)kernel32::GetCommandLineW; - if (strcmp(name, "GetEnvironmentStrings") == 0) - return (void *)kernel32::GetEnvironmentStrings; - if (strcmp(name, "FreeEnvironmentStringsA") == 0) - return (void *)kernel32::FreeEnvironmentStringsA; - if (strcmp(name, "GetEnvironmentStringsW") == 0) - return (void *)kernel32::GetEnvironmentStringsW; - if (strcmp(name, "FreeEnvironmentStringsW") == 0) - return (void *)kernel32::FreeEnvironmentStringsW; - if (strcmp(name, "GetEnvironmentVariableA") == 0) - return (void *)kernel32::GetEnvironmentVariableA; - if (strcmp(name, "SetEnvironmentVariableA") == 0) - return (void *)kernel32::SetEnvironmentVariableA; - if (strcmp(name, "SetEnvironmentVariableW") == 0) - return (void *)kernel32::SetEnvironmentVariableW; - if (strcmp(name, "GetEnvironmentVariableW") == 0) - return (void *)kernel32::GetEnvironmentVariableW; - if (strcmp(name, "GetStdHandle") == 0) - return (void *)kernel32::GetStdHandle; - if (strcmp(name, "SetStdHandle") == 0) - return (void *)kernel32::SetStdHandle; - - // handleapi.h - if (strcmp(name, "DuplicateHandle") == 0) - return (void *)kernel32::DuplicateHandle; - if (strcmp(name, "CloseHandle") == 0) - return (void *)kernel32::CloseHandle; - - // wincon.h - if (strcmp(name, "GetConsoleMode") == 0) - return (void *)kernel32::GetConsoleMode; - if (strcmp(name, "SetConsoleMode") == 0) - return (void *)kernel32::SetConsoleMode; - if (strcmp(name, "GetConsoleCP") == 0) - return (void *)kernel32::GetConsoleCP; - if (strcmp(name, "SetConsoleCtrlHandler") == 0) - return (void *)kernel32::SetConsoleCtrlHandler; - if (strcmp(name, "GetConsoleScreenBufferInfo") == 0) - return (void *)kernel32::GetConsoleScreenBufferInfo; - if (strcmp(name, "WriteConsoleW") == 0) - return (void *)kernel32::WriteConsoleW; - if (strcmp(name, "GetConsoleOutputCP") == 0) - return (void *)kernel32::GetConsoleOutputCP; - if (strcmp(name, "GetConsoleTitleA") == 0) - return (void *)kernel32::GetConsoleTitleA; - if (strcmp(name, "GetConsoleTitleW") == 0) - return (void *)kernel32::GetConsoleTitleW; - if (strcmp(name, "PeekConsoleInputA") == 0) - return (void *)kernel32::PeekConsoleInputA; - if (strcmp(name, "ReadConsoleInputA") == 0) - return (void *)kernel32::ReadConsoleInputA; - - // fileapi.h - if (strcmp(name, "GetFullPathNameA") == 0) - return (void *)kernel32::GetFullPathNameA; - if (strcmp(name, "GetFullPathNameW") == 0) - return (void *)kernel32::GetFullPathNameW; - if (strcmp(name, "GetShortPathNameA") == 0) - return (void *)kernel32::GetShortPathNameA; - if (strcmp(name, "GetShortPathNameW") == 0) - return (void *)kernel32::GetShortPathNameW; - if (strcmp(name, "FindFirstFileA") == 0) - return (void *)kernel32::FindFirstFileA; - if (strcmp(name, "FindFirstFileW") == 0) - return (void *)kernel32::FindFirstFileW; - if (strcmp(name, "FindFirstFileExA") == 0) - return (void *)kernel32::FindFirstFileExA; - if (strcmp(name, "FindNextFileA") == 0) - return (void *)kernel32::FindNextFileA; - if (strcmp(name, "FindNextFileW") == 0) - return (void *)kernel32::FindNextFileW; - if (strcmp(name, "FindClose") == 0) - return (void *)kernel32::FindClose; - if (strcmp(name, "GetFileAttributesA") == 0) - return (void *)kernel32::GetFileAttributesA; - if (strcmp(name, "GetFileAttributesW") == 0) - return (void *)kernel32::GetFileAttributesW; - if (strcmp(name, "GetDriveTypeA") == 0) - return (void *)kernel32::GetDriveTypeA; - if (strcmp(name, "GetDriveTypeW") == 0) - return (void *)kernel32::GetDriveTypeW; - if (strcmp(name, "GetVolumeInformationA") == 0) - return (void *)kernel32::GetVolumeInformationA; - if (strcmp(name, "GetVolumeInformationW") == 0) - return (void *)kernel32::GetVolumeInformationW; - if (strcmp(name, "CompareFileTime") == 0) - return (void *)kernel32::CompareFileTime; - if (strcmp(name, "GetFileAttributesW") == 0) - return (void *)kernel32::GetFileAttributesW; - if (strcmp(name, "WriteFile") == 0) - return (void *)kernel32::WriteFile; - if (strcmp(name, "FlushFileBuffers") == 0) - return (void *)kernel32::FlushFileBuffers; - if (strcmp(name, "ReadFile") == 0) - return (void *)kernel32::ReadFile; - if (strcmp(name, "CreateFileA") == 0) - return (void *)kernel32::CreateFileA; - if (strcmp(name, "CreateFileW") == 0) - return (void *)kernel32::CreateFileW; - if (strcmp(name, "CreateFileMappingA") == 0) - return (void *)kernel32::CreateFileMappingA; - if (strcmp(name, "CreateFileMappingW") == 0) - return (void *)kernel32::CreateFileMappingW; - if (strcmp(name, "MapViewOfFile") == 0) - return (void *)kernel32::MapViewOfFile; - if (strcmp(name, "MapViewOfFileEx") == 0) - return (void *)kernel32::MapViewOfFileEx; - if (strcmp(name, "UnmapViewOfFile") == 0) - return (void *)kernel32::UnmapViewOfFile; - if (strcmp(name, "FlushViewOfFile") == 0) - return (void *)kernel32::FlushViewOfFile; - if (strcmp(name, "DeleteFileA") == 0) - return (void *)kernel32::DeleteFileA; - if (strcmp(name, "DeleteFileW") == 0) - return (void *)kernel32::DeleteFileW; - if (strcmp(name, "MoveFileA") == 0) - return (void *)kernel32::MoveFileA; - if (strcmp(name, "MoveFileW") == 0) - return (void *)kernel32::MoveFileW; - if (strcmp(name, "SetFilePointer") == 0) - return (void *)kernel32::SetFilePointer; - if (strcmp(name, "SetFilePointerEx") == 0) - return (void *)kernel32::SetFilePointerEx; - if (strcmp(name, "SetEndOfFile") == 0) - return (void *)kernel32::SetEndOfFile; - if (strcmp(name, "CreateDirectoryA") == 0) - return (void *)kernel32::CreateDirectoryA; - if (strcmp(name, "RemoveDirectoryA") == 0) - return (void *)kernel32::RemoveDirectoryA; - if (strcmp(name, "SetFileAttributesA") == 0) - return (void *)kernel32::SetFileAttributesA; - if (strcmp(name, "GetFileSize") == 0) - return (void *)kernel32::GetFileSize; - if (strcmp(name, "GetFileTime") == 0) - return (void *)kernel32::GetFileTime; - if (strcmp(name, "SetFileTime") == 0) - return (void *)kernel32::SetFileTime; - if (strcmp(name, "GetFileType") == 0) - return (void *)kernel32::GetFileType; - if (strcmp(name, "FileTimeToLocalFileTime") == 0) - return (void *)kernel32::FileTimeToLocalFileTime; - if (strcmp(name, "LocalFileTimeToFileTime") == 0) - return (void *)kernel32::LocalFileTimeToFileTime; - if (strcmp(name, "DosDateTimeToFileTime") == 0) - return (void *)kernel32::DosDateTimeToFileTime; - if (strcmp(name, "FileTimeToDosDateTime") == 0) - return (void *)kernel32::FileTimeToDosDateTime; - if (strcmp(name, "GetFileInformationByHandle") == 0) - return (void *)kernel32::GetFileInformationByHandle; - if (strcmp(name, "GetTempFileNameA") == 0) - return (void *)kernel32::GetTempFileNameA; - if (strcmp(name, "GetTempPathA") == 0) - return (void *)kernel32::GetTempPathA; - - // sysinfoapi.h - if (strcmp(name, "GetSystemInfo") == 0) - return (void *)kernel32::GetSystemInfo; - if (strcmp(name, "GetSystemTime") == 0) - return (void *)kernel32::GetSystemTime; - if (strcmp(name, "GetLocalTime") == 0) - return (void *)kernel32::GetLocalTime; - if (strcmp(name, "GetSystemTimeAsFileTime") == 0) - return (void *)kernel32::GetSystemTimeAsFileTime; - if (strcmp(name, "GetTickCount") == 0) - return (void *)kernel32::GetTickCount; - if (strcmp(name, "GetSystemDirectoryA") == 0) - return (void *)kernel32::GetSystemDirectoryA; - if (strcmp(name, "GetWindowsDirectoryA") == 0) - return (void *)kernel32::GetWindowsDirectoryA; - if (strcmp(name, "GetVersion") == 0) - return (void *)kernel32::GetVersion; - if (strcmp(name, "GetVersionExA") == 0) - return (void *)kernel32::GetVersionExA; - - // timezoneapi.h - if (strcmp(name, "SystemTimeToFileTime") == 0) - return (void *)kernel32::SystemTimeToFileTime; - if (strcmp(name, "FileTimeToSystemTime") == 0) - return (void *)kernel32::FileTimeToSystemTime; - if (strcmp(name, "GetTimeZoneInformation") == 0) - return (void *)kernel32::GetTimeZoneInformation; - - // libloaderapi.h - if (strcmp(name, "GetModuleHandleA") == 0) - return (void *)kernel32::GetModuleHandleA; - if (strcmp(name, "GetModuleHandleW") == 0) - return (void *)kernel32::GetModuleHandleW; - if (strcmp(name, "GetModuleFileNameA") == 0) - return (void *)kernel32::GetModuleFileNameA; - if (strcmp(name, "GetModuleFileNameW") == 0) - return (void *)kernel32::GetModuleFileNameW; - if (strcmp(name, "LoadResource") == 0) - return (void *)kernel32::LoadResource; - if (strcmp(name, "LockResource") == 0) - return (void *)kernel32::LockResource; - if (strcmp(name, "SizeofResource") == 0) - return (void *)kernel32::SizeofResource; - if (strcmp(name, "LoadLibraryA") == 0) - return (void *)kernel32::LoadLibraryA; - if (strcmp(name, "LoadLibraryW") == 0) - return (void *)kernel32::LoadLibraryW; - if (strcmp(name, "LoadLibraryExW") == 0) - return (void *)kernel32::LoadLibraryExW; - if (strcmp(name, "DisableThreadLibraryCalls") == 0) - return (void *)kernel32::DisableThreadLibraryCalls; - if (strcmp(name, "FreeLibrary") == 0) - return (void *)kernel32::FreeLibrary; - if (strcmp(name, "GetProcAddress") == 0) - return (void *)kernel32::GetProcAddress; - if (strcmp(name, "FindResourceA") == 0) - return (void *)kernel32::FindResourceA; - if (strcmp(name, "FindResourceExA") == 0) - return (void *)kernel32::FindResourceExA; - if (strcmp(name, "FindResourceW") == 0) - return (void *)kernel32::FindResourceW; - if (strcmp(name, "FindResourceExW") == 0) - return (void *)kernel32::FindResourceExW; - - // heapapi.h - if (strcmp(name, "HeapCreate") == 0) - return (void *)kernel32::HeapCreate; - if (strcmp(name, "GetProcessHeap") == 0) - return (void *)kernel32::GetProcessHeap; - if (strcmp(name, "HeapSetInformation") == 0) - return (void *)kernel32::HeapSetInformation; - if (strcmp(name, "HeapAlloc") == 0) - return (void *)kernel32::HeapAlloc; - if (strcmp(name, "HeapDestroy") == 0) - return (void *)kernel32::HeapDestroy; - if (strcmp(name, "HeapReAlloc") == 0) - return (void *)kernel32::HeapReAlloc; - if (strcmp(name, "HeapSize") == 0) - return (void *)kernel32::HeapSize; - if (strcmp(name, "HeapFree") == 0) - return (void *)kernel32::HeapFree; - - // memoryapi.h - if (strcmp(name, "VirtualAlloc") == 0) - return (void *)kernel32::VirtualAlloc; - if (strcmp(name, "VirtualFree") == 0) - return (void *)kernel32::VirtualFree; - if (strcmp(name, "VirtualProtect") == 0) - return (void *)kernel32::VirtualProtect; - if (strcmp(name, "VirtualQuery") == 0) - return (void *)kernel32::VirtualQuery; - if (strcmp(name, "GetProcessWorkingSetSize") == 0) - return (void *)kernel32::GetProcessWorkingSetSize; - if (strcmp(name, "SetProcessWorkingSetSize") == 0) - return (void *)kernel32::SetProcessWorkingSetSize; - - // stringapiset.h - if (strcmp(name, "WideCharToMultiByte") == 0) - return (void *)kernel32::WideCharToMultiByte; - if (strcmp(name, "MultiByteToWideChar") == 0) - return (void *)kernel32::MultiByteToWideChar; - if (strcmp(name, "GetStringTypeA") == 0) - return (void *)kernel32::GetStringTypeA; - if (strcmp(name, "GetStringTypeW") == 0) - return (void *)kernel32::GetStringTypeW; - - // profileapi.h - if (strcmp(name, "QueryPerformanceCounter") == 0) - return (void *)kernel32::QueryPerformanceCounter; - if (strcmp(name, "QueryPerformanceFrequency") == 0) - return (void *)kernel32::QueryPerformanceFrequency; - - // debugapi.h - if (strcmp(name, "IsDebuggerPresent") == 0) - return (void *)kernel32::IsDebuggerPresent; - - // interlockedapi.h - if (strcmp(name, "InitializeSListHead") == 0) - return (void *)kernel32::InitializeSListHead; - if (strcmp(name, "InterlockedIncrement") == 0) - return (void *)kernel32::InterlockedIncrement; - if (strcmp(name, "InterlockedDecrement") == 0) - return (void *)kernel32::InterlockedDecrement; - if (strcmp(name, "InterlockedExchange") == 0) - return (void *)kernel32::InterlockedExchange; - if (strcmp(name, "InterlockedCompareExchange") == 0) - return (void *)kernel32::InterlockedCompareExchange; - - // winnt.h - if (strcmp(name, "RtlUnwind") == 0) - return (void *)kernel32::RtlUnwind; - - // fibersapi.h - if (strcmp(name, "FlsAlloc") == 0) - return (void *)kernel32::FlsAlloc; - if (strcmp(name, "FlsFree") == 0) - return (void *)kernel32::FlsFree; - if (strcmp(name, "FlsSetValue") == 0) - return (void *)kernel32::FlsSetValue; - if (strcmp(name, "FlsGetValue") == 0) - return (void *)kernel32::FlsGetValue; - - // ioapiset.h - if (strcmp(name, "GetOverlappedResult") == 0) - return (void *)kernel32::GetOverlappedResult; - - // wow64apiset.h - if (strcmp(name, "Wow64DisableWow64FsRedirection") == 0) - return (void *)kernel32::Wow64DisableWow64FsRedirection; - if (strcmp(name, "Wow64RevertWow64FsRedirection") == 0) - return (void *)kernel32::Wow64RevertWow64FsRedirection; - if (strcmp(name, "IsWow64Process") == 0) - return (void *)kernel32::IsWow64Process; - - return 0; -} - -} // namespace +#include "kernel32_trampolines.h" extern const wibo::ModuleStub lib_kernel32 = { (const char *[]){ "kernel32", nullptr, }, - resolveByName, + kernel32_trampoline_by_name, nullptr, }; diff --git a/dll/kernel32/debugapi.cpp b/dll/kernel32/debugapi.cpp index d0f7b61..dddf327 100644 --- a/dll/kernel32/debugapi.cpp +++ b/dll/kernel32/debugapi.cpp @@ -5,7 +5,7 @@ namespace kernel32 { -BOOL WIN_FUNC IsDebuggerPresent() { +BOOL WINAPI IsDebuggerPresent() { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: IsDebuggerPresent()\n"); return FALSE; diff --git a/dll/kernel32/debugapi.h b/dll/kernel32/debugapi.h index 7a74e44..5c44393 100644 --- a/dll/kernel32/debugapi.h +++ b/dll/kernel32/debugapi.h @@ -1,9 +1,9 @@ #pragma once -#include "common.h" +#include "types.h" namespace kernel32 { -BOOL WIN_FUNC IsDebuggerPresent(); +BOOL WINAPI IsDebuggerPresent(); } // namespace kernel32 diff --git a/dll/kernel32/errhandlingapi.cpp b/dll/kernel32/errhandlingapi.cpp index 62d12f4..c824b4d 100644 --- a/dll/kernel32/errhandlingapi.cpp +++ b/dll/kernel32/errhandlingapi.cpp @@ -14,13 +14,13 @@ UINT g_processErrorMode = 0; namespace kernel32 { -DWORD getLastError() { return wibo::getThreadTibForHost()->lastErrorValue; } +DWORD getLastError() { return wibo::getThreadTibForHost()->LastErrorValue; } -void setLastError(DWORD error) { wibo::getThreadTibForHost()->lastErrorValue = error; } +void setLastError(DWORD error) { wibo::getThreadTibForHost()->LastErrorValue = error; } void setLastErrorFromErrno() { setLastError(wibo::winErrorFromErrno(errno)); } -DWORD WIN_FUNC GetLastError() { +DWORD WINAPI GetLastError() { #ifndef NDEBUG { HOST_CONTEXT_GUARD(); @@ -29,11 +29,11 @@ DWORD WIN_FUNC GetLastError() { #endif // In guest context, fetch via TIB DWORD err; - __asm__ __volatile__("movl %%fs:%c1, %0" : "=r"(err) : "i"(offsetof(TIB, lastErrorValue))); + __asm__ __volatile__("movl %%fs:%c1, %0" : "=r"(err) : "i"(offsetof(TEB, LastErrorValue))); return err; } -void WIN_FUNC SetLastError(DWORD dwErrCode) { +void WINAPI SetLastError(DWORD dwErrCode) { #ifndef NDEBUG { HOST_CONTEXT_GUARD(); @@ -41,11 +41,11 @@ void WIN_FUNC SetLastError(DWORD dwErrCode) { } #endif // In guest context, store via TIB - __asm__ __volatile__("movl %0, %%fs:%c1" : : "r"(dwErrCode), "i"(offsetof(TIB, lastErrorValue)) : "memory"); + __asm__ __volatile__("movl %0, %%fs:%c1" : : "r"(dwErrCode), "i"(offsetof(TEB, LastErrorValue)) : "memory"); } -void WIN_FUNC RaiseException(DWORD dwExceptionCode, DWORD dwExceptionFlags, DWORD nNumberOfArguments, - const ULONG_PTR *lpArguments) { +void WINAPI RaiseException(DWORD dwExceptionCode, DWORD dwExceptionFlags, DWORD nNumberOfArguments, + const ULONG_PTR *lpArguments) { HOST_CONTEXT_GUARD(); DEBUG_LOG("RaiseException(0x%x, 0x%x, %u, %p)\n", dwExceptionCode, dwExceptionFlags, nNumberOfArguments, lpArguments); @@ -55,13 +55,13 @@ void WIN_FUNC RaiseException(DWORD dwExceptionCode, DWORD dwExceptionFlags, DWOR exitInternal(dwExceptionCode); } -PVOID WIN_FUNC AddVectoredExceptionHandler(ULONG First, PVECTORED_EXCEPTION_HANDLER Handler) { +PVOID WINAPI AddVectoredExceptionHandler(ULONG First, PVECTORED_EXCEPTION_HANDLER Handler) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: AddVectoredExceptionHandler(%u, %p)\n", First, Handler); return reinterpret_cast(Handler); } -LPTOP_LEVEL_EXCEPTION_FILTER WIN_FUNC +LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: SetUnhandledExceptionFilter(%p)\n", lpTopLevelExceptionFilter); @@ -70,13 +70,13 @@ SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilt return previous; } -LONG WIN_FUNC UnhandledExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo) { +LONG WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: UnhandledExceptionFilter(%p)\n", ExceptionInfo); return EXCEPTION_EXECUTE_HANDLER; } -UINT WIN_FUNC SetErrorMode(UINT uMode) { +UINT WINAPI SetErrorMode(UINT uMode) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: SetErrorMode(%u)\n", uMode); UINT previous = g_processErrorMode; diff --git a/dll/kernel32/errhandlingapi.h b/dll/kernel32/errhandlingapi.h index 737284c..7348ad1 100644 --- a/dll/kernel32/errhandlingapi.h +++ b/dll/kernel32/errhandlingapi.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" constexpr DWORD EXCEPTION_MAXIMUM_PARAMETERS = 15; @@ -31,14 +31,13 @@ constexpr LONG EXCEPTION_EXECUTE_HANDLER = 1; namespace kernel32 { -DWORD WIN_FUNC GetLastError(); -void WIN_FUNC SetLastError(DWORD dwErrCode); -void WIN_FUNC RaiseException(DWORD dwExceptionCode, DWORD dwExceptionFlags, DWORD nNumberOfArguments, - const ULONG_PTR *lpArguments); -PVOID WIN_FUNC AddVectoredExceptionHandler(ULONG First, PVECTORED_EXCEPTION_HANDLER Handler); -LPTOP_LEVEL_EXCEPTION_FILTER WIN_FUNC -SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); -LONG WIN_FUNC UnhandledExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo); -UINT WIN_FUNC SetErrorMode(UINT uMode); +DWORD WINAPI GetLastError(); +void WINAPI SetLastError(DWORD dwErrCode); +void WINAPI RaiseException(DWORD dwExceptionCode, DWORD dwExceptionFlags, DWORD nNumberOfArguments, + const ULONG_PTR *lpArguments); +PVOID WINAPI AddVectoredExceptionHandler(ULONG First, PVECTORED_EXCEPTION_HANDLER Handler); +LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); +LONG WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo); +UINT WINAPI SetErrorMode(UINT uMode); } // namespace kernel32 diff --git a/dll/kernel32/fibersapi.cpp b/dll/kernel32/fibersapi.cpp index 6c79b1f..c834bd6 100644 --- a/dll/kernel32/fibersapi.cpp +++ b/dll/kernel32/fibersapi.cpp @@ -15,7 +15,7 @@ LPVOID g_flsValues[kMaxFlsValues] = {nullptr}; namespace kernel32 { -DWORD WIN_FUNC FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback) { +DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FlsAlloc(%p)", lpCallback); // If the function succeeds, the return value is an FLS index initialized to zero. @@ -32,7 +32,7 @@ DWORD WIN_FUNC FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback) { return FLS_OUT_OF_INDEXES; } -BOOL WIN_FUNC FlsFree(DWORD dwFlsIndex) { +BOOL WINAPI FlsFree(DWORD dwFlsIndex) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FlsFree(%u)\n", dwFlsIndex); if (dwFlsIndex < kMaxFlsValues && g_flsValuesUsed[dwFlsIndex]) { @@ -44,7 +44,7 @@ BOOL WIN_FUNC FlsFree(DWORD dwFlsIndex) { } } -PVOID WIN_FUNC FlsGetValue(DWORD dwFlsIndex) { +PVOID WINAPI FlsGetValue(DWORD dwFlsIndex) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("FlsGetValue(%u)\n", dwFlsIndex); PVOID result = nullptr; @@ -59,7 +59,7 @@ PVOID WIN_FUNC FlsGetValue(DWORD dwFlsIndex) { return result; } -BOOL WIN_FUNC FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData) { +BOOL WINAPI FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("FlsSetValue(%u, %p)\n", dwFlsIndex, lpFlsData); if (dwFlsIndex < kMaxFlsValues && g_flsValuesUsed[dwFlsIndex]) { diff --git a/dll/kernel32/fibersapi.h b/dll/kernel32/fibersapi.h index 58d705e..654a3f8 100644 --- a/dll/kernel32/fibersapi.h +++ b/dll/kernel32/fibersapi.h @@ -1,15 +1,15 @@ #pragma once -#include "common.h" +#include "types.h" using PFLS_CALLBACK_FUNCTION = void (*)(void *); constexpr DWORD FLS_OUT_OF_INDEXES = 0xFFFFFFFF; namespace kernel32 { -DWORD WIN_FUNC FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback); -BOOL WIN_FUNC FlsFree(DWORD dwFlsIndex); -PVOID WIN_FUNC FlsGetValue(DWORD dwFlsIndex); -BOOL WIN_FUNC FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData); +DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback); +BOOL WINAPI FlsFree(DWORD dwFlsIndex); +PVOID WINAPI FlsGetValue(DWORD dwFlsIndex); +BOOL WINAPI FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData); } // namespace kernel32 diff --git a/dll/kernel32/fileapi.cpp b/dll/kernel32/fileapi.cpp index 8fe7301..376dad3 100644 --- a/dll/kernel32/fileapi.cpp +++ b/dll/kernel32/fileapi.cpp @@ -551,7 +551,7 @@ bool tryOpenConsoleDevice(DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCrea namespace kernel32 { -DWORD WIN_FUNC GetFileAttributesA(LPCSTR lpFileName) { +DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName) { HOST_CONTEXT_GUARD(); if (!lpFileName) { setLastError(ERROR_INVALID_PARAMETER); @@ -587,7 +587,7 @@ DWORD WIN_FUNC GetFileAttributesA(LPCSTR lpFileName) { } } -DWORD WIN_FUNC GetFileAttributesW(LPCWSTR lpFileName) { +DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetFileAttributesW -> "); if (!lpFileName) { @@ -598,21 +598,21 @@ DWORD WIN_FUNC GetFileAttributesW(LPCWSTR lpFileName) { return GetFileAttributesA(str.c_str()); } -UINT WIN_FUNC GetDriveTypeA(LPCSTR lpRootPathName) { +UINT WINAPI GetDriveTypeA(LPCSTR lpRootPathName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: GetDriveTypeA(%s)\n", lpRootPathName ? lpRootPathName : "(null)"); (void)lpRootPathName; return DRIVE_FIXED; } -UINT WIN_FUNC GetDriveTypeW(LPCWSTR lpRootPathName) { +UINT WINAPI GetDriveTypeW(LPCWSTR lpRootPathName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: GetDriveTypeW(%p)\n", lpRootPathName); (void)lpRootPathName; return DRIVE_FIXED; } -BOOL WIN_FUNC GetVolumeInformationA(LPCSTR lpRootPathName, LPSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, +BOOL WINAPI GetVolumeInformationA(LPCSTR lpRootPathName, LPSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize) { @@ -641,7 +641,7 @@ BOOL WIN_FUNC GetVolumeInformationA(LPCSTR lpRootPathName, LPSTR lpVolumeNameBuf return TRUE; } -BOOL WIN_FUNC GetVolumeInformationW(LPCWSTR lpRootPathName, LPWSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, +BOOL WINAPI GetVolumeInformationW(LPCWSTR lpRootPathName, LPWSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPWSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize) { @@ -672,7 +672,7 @@ BOOL WIN_FUNC GetVolumeInformationW(LPCWSTR lpRootPathName, LPWSTR lpVolumeNameB return TRUE; } -LONG WIN_FUNC CompareFileTime(const FILETIME *lpFileTime1, const FILETIME *lpFileTime2) { +LONG WINAPI CompareFileTime(const FILETIME *lpFileTime1, const FILETIME *lpFileTime2) { HOST_CONTEXT_GUARD(); DEBUG_LOG("CompareFileTime(%p, %p)\n", lpFileTime1, lpFileTime2); auto toInt64 = [](const FILETIME *ft) -> int64_t { @@ -693,7 +693,7 @@ LONG WIN_FUNC CompareFileTime(const FILETIME *lpFileTime1, const FILETIME *lpFil return 0; } -BOOL WIN_FUNC WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, +BOOL WINAPI WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped) { HOST_CONTEXT_GUARD(); DEBUG_LOG("WriteFile(%p, %p, %u, %p, %p)\n", hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, @@ -773,7 +773,7 @@ BOOL WIN_FUNC WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWr return io.unixError == 0; } -BOOL WIN_FUNC FlushFileBuffers(HANDLE hFile) { +BOOL WINAPI FlushFileBuffers(HANDLE hFile) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FlushFileBuffers(%p)\n", hFile); auto file = wibo::handles().getAs(hFile); @@ -788,7 +788,7 @@ BOOL WIN_FUNC FlushFileBuffers(HANDLE hFile) { return TRUE; } -BOOL WIN_FUNC ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, +BOOL WINAPI ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) { HOST_CONTEXT_GUARD(); DEBUG_LOG("ReadFile(%p, %p, %u, %p, %p)\n", hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, @@ -876,7 +876,7 @@ BOOL WIN_FUNC ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead return io.unixError == 0; } -HANDLE WIN_FUNC CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, +HANDLE WINAPI CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { HOST_CONTEXT_GUARD(); @@ -1103,7 +1103,7 @@ HANDLE WIN_FUNC CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwSh return handle; } -HANDLE WIN_FUNC CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, +HANDLE WINAPI CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { HOST_CONTEXT_GUARD(); @@ -1117,7 +1117,7 @@ HANDLE WIN_FUNC CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwS dwFlagsAndAttributes, hTemplateFile); } -BOOL WIN_FUNC DeleteFileA(LPCSTR lpFileName) { +BOOL WINAPI DeleteFileA(LPCSTR lpFileName) { HOST_CONTEXT_GUARD(); if (!lpFileName) { setLastError(ERROR_INVALID_PARAMETER); @@ -1133,7 +1133,7 @@ BOOL WIN_FUNC DeleteFileA(LPCSTR lpFileName) { return TRUE; } -BOOL WIN_FUNC DeleteFileW(LPCWSTR lpFileName) { +BOOL WINAPI DeleteFileW(LPCWSTR lpFileName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("DeleteFileW -> "); if (!lpFileName) { @@ -1144,7 +1144,7 @@ BOOL WIN_FUNC DeleteFileW(LPCWSTR lpFileName) { return DeleteFileA(name.c_str()); } -BOOL WIN_FUNC MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName) { +BOOL WINAPI MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("MoveFileA(%s, %s)\n", lpExistingFileName ? lpExistingFileName : "(null)", lpNewFileName ? lpNewFileName : "(null)"); @@ -1171,7 +1171,7 @@ BOOL WIN_FUNC MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName) { return TRUE; } -BOOL WIN_FUNC MoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName) { +BOOL WINAPI MoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("MoveFileW -> "); if (!lpExistingFileName || !lpNewFileName) { @@ -1183,7 +1183,7 @@ BOOL WIN_FUNC MoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName) { return MoveFileA(from.c_str(), to.c_str()); } -DWORD WIN_FUNC SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod) { +DWORD WINAPI SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetFilePointer(%p, %ld, %p, %u)\n", hFile, static_cast(lDistanceToMove), lpDistanceToMoveHigh, dwMoveMethod); @@ -1223,7 +1223,7 @@ DWORD WIN_FUNC SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistan return static_cast(static_cast(position) & 0xFFFFFFFFu); } -BOOL WIN_FUNC SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, +BOOL WINAPI SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod) { HOST_CONTEXT_GUARD(); if (hFile == nullptr) { @@ -1270,7 +1270,7 @@ BOOL WIN_FUNC SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLA return TRUE; } -BOOL WIN_FUNC SetEndOfFile(HANDLE hFile) { +BOOL WINAPI SetEndOfFile(HANDLE hFile) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetEndOfFile(%p)\n", hFile); HandleMeta meta{}; @@ -1292,7 +1292,7 @@ BOOL WIN_FUNC SetEndOfFile(HANDLE hFile) { return TRUE; } -BOOL WIN_FUNC CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) { +BOOL WINAPI CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) { HOST_CONTEXT_GUARD(); (void)lpSecurityAttributes; if (!lpPathName) { @@ -1308,7 +1308,7 @@ BOOL WIN_FUNC CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecuri return TRUE; } -BOOL WIN_FUNC RemoveDirectoryA(LPCSTR lpPathName) { +BOOL WINAPI RemoveDirectoryA(LPCSTR lpPathName) { HOST_CONTEXT_GUARD(); if (!lpPathName) { setLastError(ERROR_INVALID_PARAMETER); @@ -1323,7 +1323,7 @@ BOOL WIN_FUNC RemoveDirectoryA(LPCSTR lpPathName) { return TRUE; } -BOOL WIN_FUNC SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes) { +BOOL WINAPI SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes) { HOST_CONTEXT_GUARD(); (void)dwFileAttributes; if (!lpFileName) { @@ -1334,7 +1334,7 @@ BOOL WIN_FUNC SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes) { return TRUE; } -DWORD WIN_FUNC GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) { +DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetFileSize(%p, %p) ", hFile, lpFileSizeHigh); // TODO access check @@ -1360,7 +1360,7 @@ DWORD WIN_FUNC GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) { return static_cast(uSize & 0xFFFFFFFFu); } -BOOL WIN_FUNC GetFileTime(HANDLE hFile, LPFILETIME lpCreationTime, LPFILETIME lpLastAccessTime, +BOOL WINAPI GetFileTime(HANDLE hFile, LPFILETIME lpCreationTime, LPFILETIME lpLastAccessTime, LPFILETIME lpLastWriteTime) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetFileTime(%p, %p, %p, %p)\n", hFile, lpCreationTime, lpLastAccessTime, lpLastWriteTime); @@ -1402,7 +1402,7 @@ BOOL WIN_FUNC GetFileTime(HANDLE hFile, LPFILETIME lpCreationTime, LPFILETIME lp return TRUE; } -BOOL WIN_FUNC SetFileTime(HANDLE hFile, const FILETIME *lpCreationTime, const FILETIME *lpLastAccessTime, +BOOL WINAPI SetFileTime(HANDLE hFile, const FILETIME *lpCreationTime, const FILETIME *lpLastAccessTime, const FILETIME *lpLastWriteTime) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetFileTime(%p, %p, %p, %p)\n", hFile, lpCreationTime, lpLastAccessTime, lpLastWriteTime); @@ -1472,7 +1472,7 @@ BOOL WIN_FUNC SetFileTime(HANDLE hFile, const FILETIME *lpCreationTime, const FI return TRUE; } -BOOL WIN_FUNC GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation) { +BOOL WINAPI GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetFileInformationByHandle(%p, %p)\n", hFile, lpFileInformation); if (!lpFileInformation) { @@ -1510,7 +1510,7 @@ BOOL WIN_FUNC GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMAT return TRUE; } -DWORD WIN_FUNC GetFileType(HANDLE hFile) { +DWORD WINAPI GetFileType(HANDLE hFile) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetFileType(%p) ", hFile); auto file = wibo::handles().getAs(hFile); @@ -1539,7 +1539,7 @@ DWORD WIN_FUNC GetFileType(HANDLE hFile) { return type; } -DWORD WIN_FUNC GetFullPathNameA(LPCSTR lpFileName, DWORD nBufferLength, LPSTR lpBuffer, LPSTR *lpFilePart) { +DWORD WINAPI GetFullPathNameA(LPCSTR lpFileName, DWORD nBufferLength, LPSTR lpBuffer, LPSTR *lpFilePart) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetFullPathNameA(%s, %u)\n", lpFileName ? lpFileName : "(null)", nBufferLength); @@ -1591,7 +1591,7 @@ DWORD WIN_FUNC GetFullPathNameA(LPCSTR lpFileName, DWORD nBufferLength, LPSTR lp return static_cast(pathLen); } -DWORD WIN_FUNC GetFullPathNameW(LPCWSTR lpFileName, DWORD nBufferLength, LPWSTR lpBuffer, LPWSTR *lpFilePart) { +DWORD WINAPI GetFullPathNameW(LPCWSTR lpFileName, DWORD nBufferLength, LPWSTR lpBuffer, LPWSTR *lpFilePart) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetFullPathNameW(%p, %u)\n", lpFileName, nBufferLength); @@ -1644,7 +1644,7 @@ DWORD WIN_FUNC GetFullPathNameW(LPCWSTR lpFileName, DWORD nBufferLength, LPWSTR return static_cast(wideLen - 1); } -DWORD WIN_FUNC GetShortPathNameA(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD cchBuffer) { +DWORD WINAPI GetShortPathNameA(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD cchBuffer) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetShortPathNameA(%s)\n", lpszLongPath ? lpszLongPath : "(null)"); if (!lpszLongPath || !lpszShortPath) { @@ -1664,7 +1664,7 @@ DWORD WIN_FUNC GetShortPathNameA(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD return required - 1; } -DWORD WIN_FUNC GetShortPathNameW(LPCWSTR lpszLongPath, LPWSTR lpszShortPath, DWORD cchBuffer) { +DWORD WINAPI GetShortPathNameW(LPCWSTR lpszLongPath, LPWSTR lpszShortPath, DWORD cchBuffer) { HOST_CONTEXT_GUARD(); if (!lpszLongPath || !lpszShortPath) { setLastError(ERROR_INVALID_PARAMETER); @@ -1685,7 +1685,7 @@ DWORD WIN_FUNC GetShortPathNameW(LPCWSTR lpszLongPath, LPWSTR lpszShortPath, DWO return static_cast(len); } -UINT WIN_FUNC GetTempFileNameA(LPCSTR lpPathName, LPCSTR lpPrefixString, UINT uUnique, LPSTR lpTempFileName) { +UINT WINAPI GetTempFileNameA(LPCSTR lpPathName, LPCSTR lpPrefixString, UINT uUnique, LPSTR lpTempFileName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetTempFileNameA(%s, %s, %u)\n", lpPathName ? lpPathName : "(null)", lpPrefixString ? lpPrefixString : "(null)", uUnique); @@ -1727,7 +1727,7 @@ UINT WIN_FUNC GetTempFileNameA(LPCSTR lpPathName, LPCSTR lpPrefixString, UINT uU return uUnique; } -DWORD WIN_FUNC GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer) { +DWORD WINAPI GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetTempPathA(%u, %p)\n", nBufferLength, lpBuffer); @@ -1754,7 +1754,7 @@ DWORD WIN_FUNC GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer) { return static_cast(len); } -HANDLE WIN_FUNC FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData) { +HANDLE WINAPI FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FindFirstFileA(%s, %p)", lpFileName ? lpFileName : "(null)", lpFindFileData); if (!lpFindFileData) { @@ -1773,7 +1773,7 @@ HANDLE WIN_FUNC FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileD return handle; } -HANDLE WIN_FUNC FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData) { +HANDLE WINAPI FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FindFirstFileW(%p, %p)", lpFileName, lpFindFileData); if (!lpFindFileData) { @@ -1793,7 +1793,7 @@ HANDLE WIN_FUNC FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFile return handle; } -HANDLE WIN_FUNC FindFirstFileExA(LPCSTR lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, LPVOID lpFindFileData, +HANDLE WINAPI FindFirstFileExA(LPCSTR lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, LPVOID lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, LPVOID lpSearchFilter, DWORD dwAdditionalFlags) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FindFirstFileExA(%s, %d, %p, %d, %p, 0x%x)", lpFileName ? lpFileName : "(null)", fInfoLevelId, @@ -1833,7 +1833,7 @@ HANDLE WIN_FUNC FindFirstFileExA(LPCSTR lpFileName, FINDEX_INFO_LEVELS fInfoLeve return findFirstFileCommon(std::string(lpFileName), findData); } -BOOL WIN_FUNC FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData) { +BOOL WINAPI FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FindNextFileA(%p, %p)\n", hFindFile, lpFindFileData); if (!lpFindFileData) { @@ -1858,7 +1858,7 @@ BOOL WIN_FUNC FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData) return TRUE; } -BOOL WIN_FUNC FindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData) { +BOOL WINAPI FindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FindNextFileW(%p, %p)\n", hFindFile, lpFindFileData); if (!lpFindFileData) { @@ -1882,7 +1882,7 @@ BOOL WIN_FUNC FindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData) return TRUE; } -BOOL WIN_FUNC FindClose(HANDLE hFindFile) { +BOOL WINAPI FindClose(HANDLE hFindFile) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FindClose(%p)\n", hFindFile); if (hFindFile == nullptr) { diff --git a/dll/kernel32/fileapi.h b/dll/kernel32/fileapi.h index f0b5ee7..3cda7de 100644 --- a/dll/kernel32/fileapi.h +++ b/dll/kernel32/fileapi.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" #include "minwinbase.h" struct BY_HANDLE_FILE_INFORMATION { @@ -56,57 +56,57 @@ constexpr DWORD INVALID_FILE_SIZE = 0xFFFFFFFF; namespace kernel32 { -DWORD WIN_FUNC GetFullPathNameA(LPCSTR lpFileName, DWORD nBufferLength, LPSTR lpBuffer, LPSTR *lpFilePart); -DWORD WIN_FUNC GetFullPathNameW(LPCWSTR lpFileName, DWORD nBufferLength, LPWSTR lpBuffer, LPWSTR *lpFilePart); -DWORD WIN_FUNC GetShortPathNameA(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD cchBuffer); -DWORD WIN_FUNC GetShortPathNameW(LPCWSTR lpszLongPath, LPWSTR lpszShortPath, DWORD cchBuffer); -UINT WIN_FUNC GetTempFileNameA(LPCSTR lpPathName, LPCSTR lpPrefixString, UINT uUnique, LPSTR lpTempFileName); -DWORD WIN_FUNC GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer); -HANDLE WIN_FUNC FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData); -HANDLE WIN_FUNC FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData); -HANDLE WIN_FUNC FindFirstFileExA(LPCSTR lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, LPVOID lpFindFileData, +DWORD WINAPI GetFullPathNameA(LPCSTR lpFileName, DWORD nBufferLength, LPSTR lpBuffer, LPSTR *lpFilePart); +DWORD WINAPI GetFullPathNameW(LPCWSTR lpFileName, DWORD nBufferLength, LPWSTR lpBuffer, LPWSTR *lpFilePart); +DWORD WINAPI GetShortPathNameA(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD cchBuffer); +DWORD WINAPI GetShortPathNameW(LPCWSTR lpszLongPath, LPWSTR lpszShortPath, DWORD cchBuffer); +UINT WINAPI GetTempFileNameA(LPCSTR lpPathName, LPCSTR lpPrefixString, UINT uUnique, LPSTR lpTempFileName); +DWORD WINAPI GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer); +HANDLE WINAPI FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData); +HANDLE WINAPI FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData); +HANDLE WINAPI FindFirstFileExA(LPCSTR lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, LPVOID lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, LPVOID lpSearchFilter, DWORD dwAdditionalFlags); -BOOL WIN_FUNC FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData); -BOOL WIN_FUNC FindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData); -BOOL WIN_FUNC FindClose(HANDLE hFindFile); -DWORD WIN_FUNC GetFileAttributesA(LPCSTR lpFileName); -DWORD WIN_FUNC GetFileAttributesW(LPCWSTR lpFileName); -UINT WIN_FUNC GetDriveTypeA(LPCSTR lpRootPathName); -UINT WIN_FUNC GetDriveTypeW(LPCWSTR lpRootPathName); -BOOL WIN_FUNC WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, +BOOL WINAPI FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData); +BOOL WINAPI FindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData); +BOOL WINAPI FindClose(HANDLE hFindFile); +DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName); +DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName); +UINT WINAPI GetDriveTypeA(LPCSTR lpRootPathName); +UINT WINAPI GetDriveTypeW(LPCWSTR lpRootPathName); +BOOL WINAPI WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped); -BOOL WIN_FUNC ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, +BOOL WINAPI ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped); -BOOL WIN_FUNC FlushFileBuffers(HANDLE hFile); -HANDLE WIN_FUNC CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, +BOOL WINAPI FlushFileBuffers(HANDLE hFile); +HANDLE WINAPI CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); -HANDLE WIN_FUNC CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, +HANDLE WINAPI CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); -BOOL WIN_FUNC DeleteFileA(LPCSTR lpFileName); -BOOL WIN_FUNC DeleteFileW(LPCWSTR lpFileName); -BOOL WIN_FUNC MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName); -BOOL WIN_FUNC MoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName); -DWORD WIN_FUNC SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod); -BOOL WIN_FUNC SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, +BOOL WINAPI DeleteFileA(LPCSTR lpFileName); +BOOL WINAPI DeleteFileW(LPCWSTR lpFileName); +BOOL WINAPI MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName); +BOOL WINAPI MoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName); +DWORD WINAPI SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod); +BOOL WINAPI SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod); -BOOL WIN_FUNC SetEndOfFile(HANDLE hFile); -BOOL WIN_FUNC CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes); -BOOL WIN_FUNC RemoveDirectoryA(LPCSTR lpPathName); -BOOL WIN_FUNC SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes); -DWORD WIN_FUNC GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh); -BOOL WIN_FUNC GetFileTime(HANDLE hFile, LPFILETIME lpCreationTime, LPFILETIME lpLastAccessTime, +BOOL WINAPI SetEndOfFile(HANDLE hFile); +BOOL WINAPI CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes); +BOOL WINAPI RemoveDirectoryA(LPCSTR lpPathName); +BOOL WINAPI SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes); +DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh); +BOOL WINAPI GetFileTime(HANDLE hFile, LPFILETIME lpCreationTime, LPFILETIME lpLastAccessTime, LPFILETIME lpLastWriteTime); -BOOL WIN_FUNC SetFileTime(HANDLE hFile, const FILETIME *lpCreationTime, const FILETIME *lpLastAccessTime, +BOOL WINAPI SetFileTime(HANDLE hFile, const FILETIME *lpCreationTime, const FILETIME *lpLastAccessTime, const FILETIME *lpLastWriteTime); -BOOL WIN_FUNC GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation); -DWORD WIN_FUNC GetFileType(HANDLE hFile); -LONG WIN_FUNC CompareFileTime(const FILETIME *lpFileTime1, const FILETIME *lpFileTime2); -BOOL WIN_FUNC GetVolumeInformationA(LPCSTR lpRootPathName, LPSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, +BOOL WINAPI GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation); +DWORD WINAPI GetFileType(HANDLE hFile); +LONG WINAPI CompareFileTime(const FILETIME *lpFileTime1, const FILETIME *lpFileTime2); +BOOL WINAPI GetVolumeInformationA(LPCSTR lpRootPathName, LPSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize); -BOOL WIN_FUNC GetVolumeInformationW(LPCWSTR lpRootPathName, LPWSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, +BOOL WINAPI GetVolumeInformationW(LPCWSTR lpRootPathName, LPWSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPWSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize); diff --git a/dll/kernel32/handleapi.cpp b/dll/kernel32/handleapi.cpp index 8be88d3..b6e3bae 100644 --- a/dll/kernel32/handleapi.cpp +++ b/dll/kernel32/handleapi.cpp @@ -10,7 +10,7 @@ namespace kernel32 { -BOOL WIN_FUNC DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, +BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions) { HOST_CONTEXT_GUARD(); DEBUG_LOG("DuplicateHandle(%p, %p, %p, %p, %x, %d, %x)\n", hSourceProcessHandle, hSourceHandle, @@ -59,7 +59,7 @@ BOOL WIN_FUNC DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, return TRUE; } -BOOL WIN_FUNC CloseHandle(HANDLE hObject) { +BOOL WINAPI CloseHandle(HANDLE hObject) { HOST_CONTEXT_GUARD(); DEBUG_LOG("CloseHandle(%p)\n", hObject); if (!wibo::handles().release(hObject)) { diff --git a/dll/kernel32/handleapi.h b/dll/kernel32/handleapi.h index c92e032..8b7c8cb 100644 --- a/dll/kernel32/handleapi.h +++ b/dll/kernel32/handleapi.h @@ -1,11 +1,11 @@ #pragma once -#include "common.h" +#include "types.h" namespace kernel32 { -BOOL WIN_FUNC CloseHandle(HANDLE hObject); -BOOL WIN_FUNC DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, +BOOL WINAPI CloseHandle(HANDLE hObject); +BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions); } // namespace kernel32 diff --git a/dll/kernel32/heapapi.cpp b/dll/kernel32/heapapi.cpp index 1fa50e7..18e3c76 100644 --- a/dll/kernel32/heapapi.cpp +++ b/dll/kernel32/heapapi.cpp @@ -7,6 +7,7 @@ #include "internal.h" #include +#include #include #include #include @@ -75,7 +76,7 @@ HeapObject::~HeapObject() { namespace kernel32 { -HANDLE WIN_FUNC HeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize) { +HANDLE WINAPI HeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("HeapCreate(%u, %zu, %zu)\n", flOptions, dwInitialSize, dwMaximumSize); if (dwMaximumSize != 0 && dwInitialSize > dwMaximumSize) { @@ -96,7 +97,7 @@ HANDLE WIN_FUNC HeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaxim return wibo::handles().alloc(std::move(record), 0, 0); } -BOOL WIN_FUNC HeapDestroy(HANDLE hHeap) { +BOOL WINAPI HeapDestroy(HANDLE hHeap) { HOST_CONTEXT_GUARD(); DEBUG_LOG("HeapDestroy(%p)\n", hHeap); auto record = wibo::handles().getAs(hHeap); @@ -110,15 +111,15 @@ BOOL WIN_FUNC HeapDestroy(HANDLE hHeap) { return TRUE; } -HANDLE WIN_FUNC GetProcessHeap() { +HANDLE WINAPI GetProcessHeap() { HOST_CONTEXT_GUARD(); ensureProcessHeapInitialized(); DEBUG_LOG("GetProcessHeap() -> %p\n", g_processHeapHandle); return g_processHeapHandle; } -BOOL WIN_FUNC HeapSetInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, PVOID HeapInformation, - SIZE_T HeapInformationLength) { +BOOL WINAPI HeapSetInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, PVOID HeapInformation, + SIZE_T HeapInformationLength) { HOST_CONTEXT_GUARD(); DEBUG_LOG("HeapSetInformation(%p, %d, %p, %zu)\n", HeapHandle, static_cast(HeapInformationClass), HeapInformation, HeapInformationLength); @@ -147,7 +148,7 @@ BOOL WIN_FUNC HeapSetInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapI } } -LPVOID WIN_FUNC HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes) { +LPVOID WINAPI HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("HeapAlloc(%p, 0x%x, %zu) ", hHeap, dwFlags, dwBytes); auto record = wibo::handles().getAs(hHeap); @@ -161,7 +162,7 @@ LPVOID WIN_FUNC HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes) { return mem; } -LPVOID WIN_FUNC HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, SIZE_T dwBytes) { +LPVOID WINAPI HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, SIZE_T dwBytes) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("HeapReAlloc(%p, 0x%x, %p, %zu) ", hHeap, dwFlags, lpMem, dwBytes); auto record = wibo::handles().getAs(hHeap); @@ -219,7 +220,7 @@ LPVOID WIN_FUNC HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, SIZE_T dw size_t newUsable = mi_usable_size(ret); if (newUsable > oldSize) { size_t zeroLen = std::min(newUsable, requestSize) - oldSize; - memset(static_cast(ret) + oldSize, 0, zeroLen); + std::memset(static_cast(ret) + oldSize, 0, zeroLen); } } if (isExecutableHeap(record.get())) { @@ -229,7 +230,7 @@ LPVOID WIN_FUNC HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, SIZE_T dw return ret; } -SIZE_T WIN_FUNC HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem) { +SIZE_T WINAPI HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("HeapSize(%p, 0x%x, %p)\n", hHeap, dwFlags, lpMem); (void)dwFlags; @@ -253,7 +254,7 @@ SIZE_T WIN_FUNC HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem) { return static_cast(size); } -BOOL WIN_FUNC HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) { +BOOL WINAPI HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("HeapFree(%p, 0x%x, %p)\n", hHeap, dwFlags, lpMem); (void)dwFlags; diff --git a/dll/kernel32/heapapi.h b/dll/kernel32/heapapi.h index 4efa532..3bb8ec2 100644 --- a/dll/kernel32/heapapi.h +++ b/dll/kernel32/heapapi.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" constexpr DWORD HEAP_NO_SERIALIZE = 0x00000001; constexpr DWORD HEAP_GENERATE_EXCEPTIONS = 0x00000004; @@ -16,14 +16,14 @@ enum HEAP_INFORMATION_CLASS { namespace kernel32 { -HANDLE WIN_FUNC HeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize); -BOOL WIN_FUNC HeapDestroy(HANDLE hHeap); -HANDLE WIN_FUNC GetProcessHeap(); -BOOL WIN_FUNC HeapSetInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, PVOID HeapInformation, +HANDLE WINAPI HeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize); +BOOL WINAPI HeapDestroy(HANDLE hHeap); +HANDLE WINAPI GetProcessHeap(); +BOOL WINAPI HeapSetInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, PVOID HeapInformation, SIZE_T HeapInformationLength); -LPVOID WIN_FUNC HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes); -LPVOID WIN_FUNC HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, SIZE_T dwBytes); -SIZE_T WIN_FUNC HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem); -BOOL WIN_FUNC HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem); +LPVOID WINAPI HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes); +LPVOID WINAPI HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, SIZE_T dwBytes); +SIZE_T WINAPI HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem); +BOOL WINAPI HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem); } // namespace kernel32 diff --git a/dll/kernel32/interlockedapi.cpp b/dll/kernel32/interlockedapi.cpp index ea3b70f..f54f66c 100644 --- a/dll/kernel32/interlockedapi.cpp +++ b/dll/kernel32/interlockedapi.cpp @@ -8,28 +8,28 @@ namespace kernel32 { -LONG WIN_FUNC InterlockedIncrement(LONG volatile *Addend) { +LONG WINAPI InterlockedIncrement(LONG volatile *Addend) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("InterlockedIncrement(%p)\n", Addend); std::atomic_ref a(*const_cast(Addend)); return a.fetch_add(1, std::memory_order_seq_cst) + 1; } -LONG WIN_FUNC InterlockedDecrement(LONG volatile *Addend) { +LONG WINAPI InterlockedDecrement(LONG volatile *Addend) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("InterlockedDecrement(%p)\n", Addend); std::atomic_ref a(*const_cast(Addend)); return a.fetch_sub(1, std::memory_order_seq_cst) - 1; } -LONG WIN_FUNC InterlockedExchange(LONG volatile *Target, LONG Value) { +LONG WINAPI InterlockedExchange(LONG volatile *Target, LONG Value) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("InterlockedExchange(%p, %ld)\n", Target, static_cast(Value)); std::atomic_ref a(*const_cast(Target)); return a.exchange(Value, std::memory_order_seq_cst); } -LONG WIN_FUNC InterlockedCompareExchange(LONG volatile *Destination, LONG Exchange, LONG Comperand) { +LONG WINAPI InterlockedCompareExchange(LONG volatile *Destination, LONG Exchange, LONG Comperand) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("InterlockedCompareExchange(%p, %ld, %ld)\n", Destination, static_cast(Exchange), static_cast(Comperand)); @@ -40,7 +40,7 @@ LONG WIN_FUNC InterlockedCompareExchange(LONG volatile *Destination, LONG Exchan return expected; } -void WIN_FUNC InitializeSListHead(PSLIST_HEADER ListHead) { +void WINAPI InitializeSListHead(PSLIST_HEADER ListHead) { HOST_CONTEXT_GUARD(); DEBUG_LOG("InitializeSListHead(%p)\n", ListHead); if (!ListHead) { diff --git a/dll/kernel32/interlockedapi.h b/dll/kernel32/interlockedapi.h index ccb574c..44c222b 100644 --- a/dll/kernel32/interlockedapi.h +++ b/dll/kernel32/interlockedapi.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" namespace kernel32 { @@ -18,10 +18,10 @@ struct SLIST_HEADER { using PSLIST_HEADER = SLIST_HEADER *; -LONG WIN_FUNC InterlockedIncrement(LONG volatile *Addend); -LONG WIN_FUNC InterlockedDecrement(LONG volatile *Addend); -LONG WIN_FUNC InterlockedExchange(LONG volatile *Target, LONG Value); -LONG WIN_FUNC InterlockedCompareExchange(LONG volatile *Destination, LONG Exchange, LONG Comperand); -void WIN_FUNC InitializeSListHead(PSLIST_HEADER ListHead); +LONG WINAPI InterlockedIncrement(LONG volatile *Addend); +LONG WINAPI InterlockedDecrement(LONG volatile *Addend); +LONG WINAPI InterlockedExchange(LONG volatile *Target, LONG Value); +LONG WINAPI InterlockedCompareExchange(LONG volatile *Destination, LONG Exchange, LONG Comperand); +void WINAPI InitializeSListHead(PSLIST_HEADER ListHead); } // namespace kernel32 diff --git a/dll/kernel32/internal.h b/dll/kernel32/internal.h index 063a857..5940f71 100644 --- a/dll/kernel32/internal.h +++ b/dll/kernel32/internal.h @@ -3,6 +3,7 @@ #include "common.h" #include "handles.h" #include "mimalloc.h" +#include "types.h" #include #include @@ -80,7 +81,7 @@ struct ThreadObject final : WaitableObject { pthread_t thread; DWORD exitCode = STILL_ACTIVE; unsigned int suspendCount = 0; - TIB *tib = nullptr; + TEB *tib = nullptr; explicit ThreadObject(pthread_t thread) : WaitableObject(kType), thread(thread) {} diff --git a/dll/kernel32/ioapiset.cpp b/dll/kernel32/ioapiset.cpp index b2116eb..26f0d00 100644 --- a/dll/kernel32/ioapiset.cpp +++ b/dll/kernel32/ioapiset.cpp @@ -10,7 +10,7 @@ namespace kernel32 { -BOOL WIN_FUNC GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, +BOOL WINAPI GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, BOOL bWait) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetOverlappedResult(%p, %p, %p, %d)\n", hFile, lpOverlapped, lpNumberOfBytesTransferred, bWait); diff --git a/dll/kernel32/ioapiset.h b/dll/kernel32/ioapiset.h index 3b08f77..de066be 100644 --- a/dll/kernel32/ioapiset.h +++ b/dll/kernel32/ioapiset.h @@ -1,11 +1,11 @@ #pragma once -#include "common.h" +#include "types.h" #include "minwinbase.h" namespace kernel32 { -BOOL WIN_FUNC GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, +BOOL WINAPI GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, BOOL bWait); } // namespace kernel32 diff --git a/dll/kernel32/libloaderapi.cpp b/dll/kernel32/libloaderapi.cpp index 49ed55a..4ec82e3 100644 --- a/dll/kernel32/libloaderapi.cpp +++ b/dll/kernel32/libloaderapi.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -32,7 +33,7 @@ HRSRC findResourceInternal(HMODULE hModule, const wibo::ResourceIdentifier &type namespace kernel32 { -BOOL WIN_FUNC DisableThreadLibraryCalls(HMODULE hLibModule) { +BOOL WINAPI DisableThreadLibraryCalls(HMODULE hLibModule) { HOST_CONTEXT_GUARD(); DEBUG_LOG("DisableThreadLibraryCalls(%p)\n", hLibModule); if (!hLibModule) { @@ -51,7 +52,7 @@ BOOL WIN_FUNC DisableThreadLibraryCalls(HMODULE hLibModule) { return TRUE; } -HMODULE WIN_FUNC GetModuleHandleA(LPCSTR lpModuleName) { +HMODULE WINAPI GetModuleHandleA(LPCSTR lpModuleName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetModuleHandleA(%s)\n", lpModuleName); const auto *module = wibo::findLoadedModule(lpModuleName); @@ -62,7 +63,7 @@ HMODULE WIN_FUNC GetModuleHandleA(LPCSTR lpModuleName) { return module->handle; } -HMODULE WIN_FUNC GetModuleHandleW(LPCWSTR lpModuleName) { +HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetModuleHandleW -> "); if (lpModuleName) { @@ -72,7 +73,7 @@ HMODULE WIN_FUNC GetModuleHandleW(LPCWSTR lpModuleName) { return GetModuleHandleA(nullptr); } -DWORD WIN_FUNC GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize) { +DWORD WINAPI GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetModuleFileNameA(%p, %p, %u)\n", hModule, lpFilename, nSize); if (!lpFilename) { @@ -108,7 +109,7 @@ DWORD WIN_FUNC GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize return static_cast(copyLen); } -DWORD WIN_FUNC GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSize) { +DWORD WINAPI GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetModuleFileNameW(%p, %s, %u)\n", hModule, wideStringToString(lpFilename).c_str(), nSize); if (!lpFilename) { @@ -149,7 +150,7 @@ DWORD WIN_FUNC GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSiz return static_cast(copyLen); } -HRSRC WIN_FUNC FindResourceA(HMODULE hModule, LPCSTR lpName, LPCSTR lpType) { +HRSRC WINAPI FindResourceA(HMODULE hModule, LPCSTR lpName, LPCSTR lpType) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FindResourceA %p %p %p\n", hModule, lpName, lpType); auto type = wibo::resourceIdentifierFromAnsi(lpType); @@ -157,7 +158,7 @@ HRSRC WIN_FUNC FindResourceA(HMODULE hModule, LPCSTR lpName, LPCSTR lpType) { return findResourceInternal(hModule, type, name, std::nullopt); } -HRSRC WIN_FUNC FindResourceExA(HMODULE hModule, LPCSTR lpType, LPCSTR lpName, WORD wLanguage) { +HRSRC WINAPI FindResourceExA(HMODULE hModule, LPCSTR lpType, LPCSTR lpName, WORD wLanguage) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FindResourceExA %p %p %p %u\n", hModule, lpName, lpType, wLanguage); auto type = wibo::resourceIdentifierFromAnsi(lpType); @@ -165,7 +166,7 @@ HRSRC WIN_FUNC FindResourceExA(HMODULE hModule, LPCSTR lpType, LPCSTR lpName, WO return findResourceInternal(hModule, type, name, wLanguage); } -HRSRC WIN_FUNC FindResourceW(HMODULE hModule, LPCWSTR lpName, LPCWSTR lpType) { +HRSRC WINAPI FindResourceW(HMODULE hModule, LPCWSTR lpName, LPCWSTR lpType) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FindResourceW %p\n", hModule); auto type = wibo::resourceIdentifierFromWide(lpType); @@ -173,7 +174,7 @@ HRSRC WIN_FUNC FindResourceW(HMODULE hModule, LPCWSTR lpName, LPCWSTR lpType) { return findResourceInternal(hModule, type, name, std::nullopt); } -HRSRC WIN_FUNC FindResourceExW(HMODULE hModule, LPCWSTR lpType, LPCWSTR lpName, WORD wLanguage) { +HRSRC WINAPI FindResourceExW(HMODULE hModule, LPCWSTR lpType, LPCWSTR lpName, WORD wLanguage) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FindResourceExW %p %u\n", hModule, wLanguage); auto type = wibo::resourceIdentifierFromWide(lpType); @@ -181,7 +182,7 @@ HRSRC WIN_FUNC FindResourceExW(HMODULE hModule, LPCWSTR lpType, LPCWSTR lpName, return findResourceInternal(hModule, type, name, wLanguage); } -HGLOBAL WIN_FUNC LoadResource(HMODULE hModule, HRSRC hResInfo) { +HGLOBAL WINAPI LoadResource(HMODULE hModule, HRSRC hResInfo) { HOST_CONTEXT_GUARD(); DEBUG_LOG("LoadResource %p %p\n", hModule, hResInfo); if (!hResInfo) { @@ -201,13 +202,13 @@ HGLOBAL WIN_FUNC LoadResource(HMODULE hModule, HRSRC hResInfo) { return const_cast(exe->fromRVA(entry->offsetToData)); } -LPVOID WIN_FUNC LockResource(HGLOBAL hResData) { +LPVOID WINAPI LockResource(HGLOBAL hResData) { HOST_CONTEXT_GUARD(); DEBUG_LOG("LockResource(%p)\n", hResData); return hResData; } -DWORD WIN_FUNC SizeofResource(HMODULE hModule, HRSRC hResInfo) { +DWORD WINAPI SizeofResource(HMODULE hModule, HRSRC hResInfo) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SizeofResource(%p, %p)\n", hModule, hResInfo); if (!hResInfo) { @@ -227,7 +228,7 @@ DWORD WIN_FUNC SizeofResource(HMODULE hModule, HRSRC hResInfo) { return entry->size; } -HMODULE WIN_FUNC LoadLibraryA(LPCSTR lpLibFileName) { +HMODULE WINAPI LoadLibraryA(LPCSTR lpLibFileName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("LoadLibraryA(%s)\n", lpLibFileName); const auto *info = wibo::loadModule(lpLibFileName); @@ -238,7 +239,7 @@ HMODULE WIN_FUNC LoadLibraryA(LPCSTR lpLibFileName) { return info->handle; } -HMODULE WIN_FUNC LoadLibraryW(LPCWSTR lpLibFileName) { +HMODULE WINAPI LoadLibraryW(LPCWSTR lpLibFileName) { HOST_CONTEXT_GUARD(); if (!lpLibFileName) { return nullptr; @@ -248,7 +249,7 @@ HMODULE WIN_FUNC LoadLibraryW(LPCWSTR lpLibFileName) { return LoadLibraryA(filename.c_str()); } -HMODULE WIN_FUNC LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) { +HMODULE WINAPI LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) { HOST_CONTEXT_GUARD(); (void)hFile; // TOOD: handle dwFlags properly @@ -257,7 +258,7 @@ HMODULE WIN_FUNC LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFla return LoadLibraryA(filename.c_str()); } -BOOL WIN_FUNC FreeLibrary(HMODULE hLibModule) { +BOOL WINAPI FreeLibrary(HMODULE hLibModule) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FreeLibrary(%p)\n", hLibModule); auto *info = wibo::moduleInfoFromHandle(hLibModule); @@ -269,7 +270,7 @@ BOOL WIN_FUNC FreeLibrary(HMODULE hLibModule) { return TRUE; } -FARPROC WIN_FUNC GetProcAddress(HMODULE hModule, LPCSTR lpProcName) { +FARPROC WINAPI GetProcAddress(HMODULE hModule, LPCSTR lpProcName) { HOST_CONTEXT_GUARD(); FARPROC result; const auto info = wibo::moduleInfoFromHandle(hModule); diff --git a/dll/kernel32/libloaderapi.h b/dll/kernel32/libloaderapi.h index deb967c..7638de8 100644 --- a/dll/kernel32/libloaderapi.h +++ b/dll/kernel32/libloaderapi.h @@ -1,25 +1,25 @@ #pragma once -#include "common.h" +#include "types.h" namespace kernel32 { -BOOL WIN_FUNC DisableThreadLibraryCalls(HMODULE hLibModule); -HMODULE WIN_FUNC GetModuleHandleA(LPCSTR lpModuleName); -HMODULE WIN_FUNC GetModuleHandleW(LPCWSTR lpModuleName); -DWORD WIN_FUNC GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize); -DWORD WIN_FUNC GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSize); -HRSRC WIN_FUNC FindResourceA(HMODULE hModule, LPCSTR lpName, LPCSTR lpType); -HRSRC WIN_FUNC FindResourceExA(HMODULE hModule, LPCSTR lpType, LPCSTR lpName, WORD wLanguage); -HRSRC WIN_FUNC FindResourceW(HMODULE hModule, LPCWSTR lpName, LPCWSTR lpType); -HRSRC WIN_FUNC FindResourceExW(HMODULE hModule, LPCWSTR lpType, LPCWSTR lpName, WORD wLanguage); -HGLOBAL WIN_FUNC LoadResource(HMODULE hModule, HRSRC hResInfo); -LPVOID WIN_FUNC LockResource(HGLOBAL hResData); -DWORD WIN_FUNC SizeofResource(HMODULE hModule, HRSRC hResInfo); -HMODULE WIN_FUNC LoadLibraryA(LPCSTR lpLibFileName); -HMODULE WIN_FUNC LoadLibraryW(LPCWSTR lpLibFileName); -HMODULE WIN_FUNC LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); -BOOL WIN_FUNC FreeLibrary(HMODULE hLibModule); -FARPROC WIN_FUNC GetProcAddress(HMODULE hModule, LPCSTR lpProcName); +BOOL WINAPI DisableThreadLibraryCalls(HMODULE hLibModule); +HMODULE WINAPI GetModuleHandleA(LPCSTR lpModuleName); +HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName); +DWORD WINAPI GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize); +DWORD WINAPI GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSize); +HRSRC WINAPI FindResourceA(HMODULE hModule, LPCSTR lpName, LPCSTR lpType); +HRSRC WINAPI FindResourceExA(HMODULE hModule, LPCSTR lpType, LPCSTR lpName, WORD wLanguage); +HRSRC WINAPI FindResourceW(HMODULE hModule, LPCWSTR lpName, LPCWSTR lpType); +HRSRC WINAPI FindResourceExW(HMODULE hModule, LPCWSTR lpType, LPCWSTR lpName, WORD wLanguage); +HGLOBAL WINAPI LoadResource(HMODULE hModule, HRSRC hResInfo); +LPVOID WINAPI LockResource(HGLOBAL hResData); +DWORD WINAPI SizeofResource(HMODULE hModule, HRSRC hResInfo); +HMODULE WINAPI LoadLibraryA(LPCSTR lpLibFileName); +HMODULE WINAPI LoadLibraryW(LPCWSTR lpLibFileName); +HMODULE WINAPI LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); +BOOL WINAPI FreeLibrary(HMODULE hLibModule); +FARPROC WINAPI GetProcAddress(HMODULE hModule, LPCSTR lpProcName); } // namespace kernel32 diff --git a/dll/kernel32/memoryapi.cpp b/dll/kernel32/memoryapi.cpp index 0477659..9ed77d6 100644 --- a/dll/kernel32/memoryapi.cpp +++ b/dll/kernel32/memoryapi.cpp @@ -9,6 +9,7 @@ #include "strutil.h" #include +#include #include #include #include @@ -462,7 +463,7 @@ int translateProtect(DWORD flProtect) { namespace kernel32 { -HANDLE WIN_FUNC CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, +HANDLE WINAPI CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("CreateFileMappingA(%p, %p, %u, %u, %u, %s)\n", hFile, lpFileMappingAttributes, flProtect, @@ -513,7 +514,7 @@ HANDLE WIN_FUNC CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMap return wibo::handles().alloc(std::move(mapping), 0, 0); } -HANDLE WIN_FUNC CreateFileMappingW(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, +HANDLE WINAPI CreateFileMappingW(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCWSTR lpName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("CreateFileMappingW -> "); @@ -659,7 +660,7 @@ static LPVOID mapViewOfFileInternal(Pin mapping, DWORD dwDesiredA return viewPtr; } -LPVOID WIN_FUNC MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, +LPVOID WINAPI MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap) { HOST_CONTEXT_GUARD(); DEBUG_LOG("MapViewOfFile(%p, 0x%x, %u, %u, %zu)\n", hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, @@ -674,7 +675,7 @@ LPVOID WIN_FUNC MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, return mapViewOfFileInternal(std::move(mapping), dwDesiredAccess, offset, dwNumberOfBytesToMap, nullptr); } -LPVOID WIN_FUNC MapViewOfFileEx(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, +LPVOID WINAPI MapViewOfFileEx(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap, LPVOID lpBaseAddress) { HOST_CONTEXT_GUARD(); DEBUG_LOG("MapViewOfFileEx(%p, 0x%x, %u, %u, %zu, %p)\n", hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, @@ -689,7 +690,7 @@ LPVOID WIN_FUNC MapViewOfFileEx(HANDLE hFileMappingObject, DWORD dwDesiredAccess return mapViewOfFileInternal(std::move(mapping), dwDesiredAccess, offset, dwNumberOfBytesToMap, lpBaseAddress); } -BOOL WIN_FUNC UnmapViewOfFile(LPCVOID lpBaseAddress) { +BOOL WINAPI UnmapViewOfFile(LPCVOID lpBaseAddress) { HOST_CONTEXT_GUARD(); DEBUG_LOG("UnmapViewOfFile(%p)\n", lpBaseAddress); std::unique_lock lk(g_viewInfoMutex); @@ -708,7 +709,7 @@ BOOL WIN_FUNC UnmapViewOfFile(LPCVOID lpBaseAddress) { return TRUE; } -BOOL WIN_FUNC FlushViewOfFile(LPCVOID lpBaseAddress, SIZE_T dwNumberOfBytesToFlush) { +BOOL WINAPI FlushViewOfFile(LPCVOID lpBaseAddress, SIZE_T dwNumberOfBytesToFlush) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FlushViewOfFile(%p, %zu)\n", lpBaseAddress, dwNumberOfBytesToFlush); @@ -783,7 +784,7 @@ BOOL WIN_FUNC FlushViewOfFile(LPCVOID lpBaseAddress, SIZE_T dwNumberOfBytesToFlu return TRUE; } -LPVOID WIN_FUNC VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) { +LPVOID WINAPI VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) { HOST_CONTEXT_GUARD(); DEBUG_LOG("VirtualAlloc(%p, %zu, %u, %u)\n", lpAddress, dwSize, flAllocationType, flProtect); @@ -970,7 +971,7 @@ LPVOID WIN_FUNC VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocation return reinterpret_cast(start); } -BOOL WIN_FUNC VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) { +BOOL WINAPI VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) { HOST_CONTEXT_GUARD(); DEBUG_LOG("VirtualFree(%p, %zu, %u)\n", lpAddress, dwSize, dwFreeType); if (!lpAddress) { @@ -1061,7 +1062,7 @@ BOOL WIN_FUNC VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) { return TRUE; } -BOOL WIN_FUNC VirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect) { +BOOL WINAPI VirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect) { HOST_CONTEXT_GUARD(); DEBUG_LOG("VirtualProtect(%p, %zu, %u)\n", lpAddress, dwSize, flNewProtect); if (!lpAddress || dwSize == 0) { @@ -1120,7 +1121,7 @@ BOOL WIN_FUNC VirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect return TRUE; } -SIZE_T WIN_FUNC VirtualQuery(LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength) { +SIZE_T WINAPI VirtualQuery(LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength) { HOST_CONTEXT_GUARD(); DEBUG_LOG("VirtualQuery(%p, %p, %zu)\n", lpAddress, lpBuffer, dwLength); if (!lpBuffer || dwLength < sizeof(MEMORY_BASIC_INFORMATION)) { @@ -1158,7 +1159,7 @@ SIZE_T WIN_FUNC VirtualQuery(LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuff return 0; } -BOOL WIN_FUNC GetProcessWorkingSetSize(HANDLE hProcess, PSIZE_T lpMinimumWorkingSetSize, +BOOL WINAPI GetProcessWorkingSetSize(HANDLE hProcess, PSIZE_T lpMinimumWorkingSetSize, PSIZE_T lpMaximumWorkingSetSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetProcessWorkingSetSize(%p, %p, %p)\n", hProcess, lpMinimumWorkingSetSize, lpMaximumWorkingSetSize); @@ -1172,7 +1173,7 @@ BOOL WIN_FUNC GetProcessWorkingSetSize(HANDLE hProcess, PSIZE_T lpMinimumWorking return TRUE; } -BOOL WIN_FUNC SetProcessWorkingSetSize(HANDLE hProcess, SIZE_T dwMinimumWorkingSetSize, +BOOL WINAPI SetProcessWorkingSetSize(HANDLE hProcess, SIZE_T dwMinimumWorkingSetSize, SIZE_T dwMaximumWorkingSetSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetProcessWorkingSetSize(%p, %zu, %zu)\n", hProcess, dwMinimumWorkingSetSize, dwMaximumWorkingSetSize); diff --git a/dll/kernel32/memoryapi.h b/dll/kernel32/memoryapi.h index 767fc3b..c9a99c0 100644 --- a/dll/kernel32/memoryapi.h +++ b/dll/kernel32/memoryapi.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" #include "minwinbase.h" struct MEMORY_BASIC_INFORMATION { @@ -17,23 +17,23 @@ using PMEMORY_BASIC_INFORMATION = MEMORY_BASIC_INFORMATION *; namespace kernel32 { -HANDLE WIN_FUNC CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, +HANDLE WINAPI CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName); -HANDLE WIN_FUNC CreateFileMappingW(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, +HANDLE WINAPI CreateFileMappingW(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCWSTR lpName); -LPVOID WIN_FUNC MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, +LPVOID WINAPI MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap); -LPVOID WIN_FUNC MapViewOfFileEx(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, +LPVOID WINAPI MapViewOfFileEx(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap, LPVOID lpBaseAddress); -BOOL WIN_FUNC UnmapViewOfFile(LPCVOID lpBaseAddress); -BOOL WIN_FUNC FlushViewOfFile(LPCVOID lpBaseAddress, SIZE_T dwNumberOfBytesToFlush); +BOOL WINAPI UnmapViewOfFile(LPCVOID lpBaseAddress); +BOOL WINAPI FlushViewOfFile(LPCVOID lpBaseAddress, SIZE_T dwNumberOfBytesToFlush); -LPVOID WIN_FUNC VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect); -BOOL WIN_FUNC VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType); -BOOL WIN_FUNC VirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect); -SIZE_T WIN_FUNC VirtualQuery(LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength); -BOOL WIN_FUNC GetProcessWorkingSetSize(HANDLE hProcess, PSIZE_T lpMinimumWorkingSetSize, +LPVOID WINAPI VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect); +BOOL WINAPI VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType); +BOOL WINAPI VirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect); +SIZE_T WINAPI VirtualQuery(LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength); +BOOL WINAPI GetProcessWorkingSetSize(HANDLE hProcess, PSIZE_T lpMinimumWorkingSetSize, PSIZE_T lpMaximumWorkingSetSize); -BOOL WIN_FUNC SetProcessWorkingSetSize(HANDLE hProcess, SIZE_T dwMinimumWorkingSetSize, SIZE_T dwMaximumWorkingSetSize); +BOOL WINAPI SetProcessWorkingSetSize(HANDLE hProcess, SIZE_T dwMinimumWorkingSetSize, SIZE_T dwMaximumWorkingSetSize); } // namespace kernel32 diff --git a/dll/kernel32/minwinbase.h b/dll/kernel32/minwinbase.h index 07ce777..5aaa20e 100644 --- a/dll/kernel32/minwinbase.h +++ b/dll/kernel32/minwinbase.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" struct SECURITY_ATTRIBUTES { DWORD nLength; @@ -56,8 +56,8 @@ struct WIN32_FIND_DATAA { DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; - char cFileName[MAX_PATH]; - char cAlternateFileName[14]; + CHAR cFileName[MAX_PATH]; + CHAR cAlternateFileName[14]; }; struct WIN32_FIND_DATAW { diff --git a/dll/kernel32/namedpipeapi.cpp b/dll/kernel32/namedpipeapi.cpp index c905d3f..f1b29cd 100644 --- a/dll/kernel32/namedpipeapi.cpp +++ b/dll/kernel32/namedpipeapi.cpp @@ -348,7 +348,7 @@ bool tryCreateFileNamedPipeA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwS return true; } -BOOL WIN_FUNC CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize) { +BOOL WINAPI CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("CreatePipe(%p, %p, %p, %u)\n", hReadPipe, hWritePipe, lpPipeAttributes, nSize); if (!hReadPipe || !hWritePipe) { @@ -383,7 +383,7 @@ BOOL WIN_FUNC CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRI return TRUE; } -HANDLE WIN_FUNC CreateNamedPipeA(LPCSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, +HANDLE WINAPI CreateNamedPipeA(LPCSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes) { HOST_CONTEXT_GUARD(); @@ -526,7 +526,7 @@ HANDLE WIN_FUNC CreateNamedPipeA(LPCSTR lpName, DWORD dwOpenMode, DWORD dwPipeMo return wibo::handles().alloc(std::move(pipeObj), grantedAccess, handleFlags); } -BOOL WIN_FUNC ConnectNamedPipe(HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped) { +BOOL WINAPI ConnectNamedPipe(HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped) { HOST_CONTEXT_GUARD(); DEBUG_LOG("ConnectNamedPipe(%p, %p)\n", hNamedPipe, lpOverlapped); diff --git a/dll/kernel32/namedpipeapi.h b/dll/kernel32/namedpipeapi.h index bfff0e7..fe49246 100644 --- a/dll/kernel32/namedpipeapi.h +++ b/dll/kernel32/namedpipeapi.h @@ -1,15 +1,15 @@ #pragma once -#include "common.h" +#include "types.h" #include "minwinbase.h" namespace kernel32 { -BOOL WIN_FUNC CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize); -HANDLE WIN_FUNC CreateNamedPipeA(LPCSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, +BOOL WINAPI CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize); +HANDLE WINAPI CreateNamedPipeA(LPCSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes); -BOOL WIN_FUNC ConnectNamedPipe(HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped); +BOOL WINAPI ConnectNamedPipe(HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped); bool tryCreateFileNamedPipeA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE &outHandle); diff --git a/dll/kernel32/processenv.cpp b/dll/kernel32/processenv.cpp index f213ef8..557ae00 100644 --- a/dll/kernel32/processenv.cpp +++ b/dll/kernel32/processenv.cpp @@ -41,31 +41,31 @@ std::string convertEnvValueToHost(const std::string &name, const char *rawValue) namespace kernel32 { -LPSTR WIN_FUNC GetCommandLineA() { +LPSTR WINAPI GetCommandLineA() { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetCommandLineA() -> %s\n", wibo::commandLine.c_str()); return const_cast(wibo::commandLine.c_str()); } -LPWSTR WIN_FUNC GetCommandLineW() { +LPWSTR WINAPI GetCommandLineW() { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetCommandLineW() -> %s\n", wideStringToString(wibo::commandLineW.data()).c_str()); return wibo::commandLineW.data(); } -HANDLE WIN_FUNC GetStdHandle(DWORD nStdHandle) { +HANDLE WINAPI GetStdHandle(DWORD nStdHandle) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetStdHandle(%d)\n", nStdHandle); return files::getStdHandle(nStdHandle); } -BOOL WIN_FUNC SetStdHandle(DWORD nStdHandle, HANDLE hHandle) { +BOOL WINAPI SetStdHandle(DWORD nStdHandle, HANDLE hHandle) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetStdHandle(%d, %p)\n", nStdHandle, hHandle); return files::setStdHandle(nStdHandle, hHandle); } -LPCH WIN_FUNC GetEnvironmentStrings() { +LPCH WINAPI GetEnvironmentStrings() { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetEnvironmentStrings()\n"); @@ -98,7 +98,7 @@ LPCH WIN_FUNC GetEnvironmentStrings() { return buffer; } -LPWCH WIN_FUNC GetEnvironmentStringsW() { +LPWCH WINAPI GetEnvironmentStringsW() { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetEnvironmentStringsW()\n"); @@ -133,7 +133,7 @@ LPWCH WIN_FUNC GetEnvironmentStringsW() { return buffer; } -BOOL WIN_FUNC FreeEnvironmentStringsA(LPCH penv) { +BOOL WINAPI FreeEnvironmentStringsA(LPCH penv) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FreeEnvironmentStringsA(%p)\n", penv); if (!penv) { @@ -144,7 +144,7 @@ BOOL WIN_FUNC FreeEnvironmentStringsA(LPCH penv) { return TRUE; } -BOOL WIN_FUNC FreeEnvironmentStringsW(LPWCH penv) { +BOOL WINAPI FreeEnvironmentStringsW(LPWCH penv) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FreeEnvironmentStringsW(%p)\n", penv); if (!penv) { @@ -155,7 +155,7 @@ BOOL WIN_FUNC FreeEnvironmentStringsW(LPWCH penv) { return TRUE; } -DWORD WIN_FUNC GetEnvironmentVariableA(LPCSTR lpName, LPSTR lpBuffer, DWORD nSize) { +DWORD WINAPI GetEnvironmentVariableA(LPCSTR lpName, LPSTR lpBuffer, DWORD nSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetEnvironmentVariableA(%s, %p, %u)\n", lpName ? lpName : "(null)", lpBuffer, nSize); if (!lpName) { @@ -184,7 +184,7 @@ DWORD WIN_FUNC GetEnvironmentVariableA(LPCSTR lpName, LPSTR lpBuffer, DWORD nSiz return len; } -DWORD WIN_FUNC GetEnvironmentVariableW(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize) { +DWORD WINAPI GetEnvironmentVariableW(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize) { HOST_CONTEXT_GUARD(); std::string name = lpName ? wideStringToString(lpName) : std::string(); DEBUG_LOG("GetEnvironmentVariableW(%s, %p, %u)\n", name.c_str(), lpBuffer, nSize); @@ -215,7 +215,7 @@ DWORD WIN_FUNC GetEnvironmentVariableW(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nS return required - 1; } -BOOL WIN_FUNC SetEnvironmentVariableA(LPCSTR lpName, LPCSTR lpValue) { +BOOL WINAPI SetEnvironmentVariableA(LPCSTR lpName, LPCSTR lpValue) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetEnvironmentVariableA(%s, %s)\n", lpName ? lpName : "(null)", lpValue ? lpValue : "(null)"); if (!lpName || std::strchr(lpName, '=')) { @@ -241,7 +241,7 @@ BOOL WIN_FUNC SetEnvironmentVariableA(LPCSTR lpName, LPCSTR lpValue) { return TRUE; } -BOOL WIN_FUNC SetEnvironmentVariableW(LPCWSTR lpName, LPCWSTR lpValue) { +BOOL WINAPI SetEnvironmentVariableW(LPCWSTR lpName, LPCWSTR lpValue) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetEnvironmentVariableW -> "); if (!lpName) { diff --git a/dll/kernel32/processenv.h b/dll/kernel32/processenv.h index 5f957fd..d04c7fa 100644 --- a/dll/kernel32/processenv.h +++ b/dll/kernel32/processenv.h @@ -1,20 +1,20 @@ #pragma once -#include "common.h" +#include "types.h" namespace kernel32 { -LPSTR WIN_FUNC GetCommandLineA(); -LPWSTR WIN_FUNC GetCommandLineW(); -HANDLE WIN_FUNC GetStdHandle(DWORD nStdHandle); -BOOL WIN_FUNC SetStdHandle(DWORD nStdHandle, HANDLE hHandle); -LPCH WIN_FUNC GetEnvironmentStrings(); -LPWCH WIN_FUNC GetEnvironmentStringsW(); -BOOL WIN_FUNC FreeEnvironmentStringsA(LPCH penv); -BOOL WIN_FUNC FreeEnvironmentStringsW(LPWCH penv); -DWORD WIN_FUNC GetEnvironmentVariableA(LPCSTR lpName, LPSTR lpBuffer, DWORD nSize); -DWORD WIN_FUNC GetEnvironmentVariableW(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize); -BOOL WIN_FUNC SetEnvironmentVariableA(LPCSTR lpName, LPCSTR lpValue); -BOOL WIN_FUNC SetEnvironmentVariableW(LPCWSTR lpName, LPCWSTR lpValue); +LPSTR WINAPI GetCommandLineA(); +LPWSTR WINAPI GetCommandLineW(); +HANDLE WINAPI GetStdHandle(DWORD nStdHandle); +BOOL WINAPI SetStdHandle(DWORD nStdHandle, HANDLE hHandle); +LPCH WINAPI GetEnvironmentStrings(); +LPWCH WINAPI GetEnvironmentStringsW(); +BOOL WINAPI FreeEnvironmentStringsA(LPCH penv); +BOOL WINAPI FreeEnvironmentStringsW(LPWCH penv); +DWORD WINAPI GetEnvironmentVariableA(LPCSTR lpName, LPSTR lpBuffer, DWORD nSize); +DWORD WINAPI GetEnvironmentVariableW(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize); +BOOL WINAPI SetEnvironmentVariableA(LPCSTR lpName, LPCSTR lpValue); +BOOL WINAPI SetEnvironmentVariableW(LPCWSTR lpName, LPCWSTR lpValue); } // namespace kernel32 diff --git a/dll/kernel32/processthreadsapi.cpp b/dll/kernel32/processthreadsapi.cpp index 3836187..b7a3e41 100644 --- a/dll/kernel32/processthreadsapi.cpp +++ b/dll/kernel32/processthreadsapi.cpp @@ -124,7 +124,7 @@ void *threadTrampoline(void *param) { g_currentThreadObject = data.obj; // Install TIB - TIB *threadTib = nullptr; + TEB *threadTib = nullptr; uint16_t previousFs = 0; uint16_t previousGs = 0; if (wibo::tibSelector) { @@ -176,7 +176,7 @@ void *threadTrampoline(void *param) { namespace kernel32 { -BOOL WIN_FUNC IsProcessorFeaturePresent(DWORD ProcessorFeature) { +BOOL WINAPI IsProcessorFeaturePresent(DWORD ProcessorFeature) { HOST_CONTEXT_GUARD(); DEBUG_LOG("IsProcessorFeaturePresent(%u)\n", ProcessorFeature); if (ProcessorFeature == 0) { // PF_FLOATING_POINT_PRECISION_ERRATA @@ -192,20 +192,20 @@ BOOL WIN_FUNC IsProcessorFeaturePresent(DWORD ProcessorFeature) { return TRUE; } -HANDLE WIN_FUNC GetCurrentProcess() { +HANDLE WINAPI GetCurrentProcess() { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetCurrentProcess() -> %p\n", reinterpret_cast(static_cast(-1))); return reinterpret_cast(static_cast(-1)); } -DWORD WIN_FUNC GetCurrentProcessId() { +DWORD WINAPI GetCurrentProcessId() { HOST_CONTEXT_GUARD(); DWORD pid = static_cast(getpid()); DEBUG_LOG("GetCurrentProcessId() -> %u\n", pid); return pid; } -DWORD WIN_FUNC GetCurrentThreadId() { +DWORD WINAPI GetCurrentThreadId() { HOST_CONTEXT_GUARD(); pthread_t thread = pthread_self(); const auto threadId = static_cast(thread); @@ -213,14 +213,14 @@ DWORD WIN_FUNC GetCurrentThreadId() { return threadId; } -HANDLE WIN_FUNC GetCurrentThread() { +HANDLE WINAPI GetCurrentThread() { HOST_CONTEXT_GUARD(); HANDLE pseudoHandle = reinterpret_cast(kPseudoCurrentThreadHandleValue); DEBUG_LOG("GetCurrentThread() -> %p\n", pseudoHandle); return pseudoHandle; } -BOOL WIN_FUNC GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR lpProcessAffinityMask, +BOOL WINAPI GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR lpProcessAffinityMask, PDWORD_PTR lpSystemAffinityMask) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetProcessAffinityMask(%p, %p, %p)\n", hProcess, lpProcessAffinityMask, lpSystemAffinityMask); @@ -252,7 +252,7 @@ BOOL WIN_FUNC GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR lpProcessAffini return TRUE; } -BOOL WIN_FUNC SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask) { +BOOL WINAPI SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetProcessAffinityMask(%p, 0x%lx)\n", hProcess, static_cast(dwProcessAffinityMask)); if (dwProcessAffinityMask == 0) { @@ -279,7 +279,7 @@ BOOL WIN_FUNC SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinit return TRUE; } -DWORD_PTR WIN_FUNC SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask) { +DWORD_PTR WINAPI SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetThreadAffinityMask(%p, 0x%lx)\n", hThread, static_cast(dwThreadAffinityMask)); if (dwThreadAffinityMask == 0) { @@ -314,13 +314,13 @@ DWORD_PTR WIN_FUNC SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffin _exit(static_cast(exitCode)); } -void WIN_FUNC ExitProcess(UINT uExitCode) { +void WINAPI ExitProcess(UINT uExitCode) { HOST_CONTEXT_GUARD(); DEBUG_LOG("ExitProcess(%u)\n", uExitCode); exitInternal(uExitCode); } -BOOL WIN_FUNC TerminateProcess(HANDLE hProcess, UINT uExitCode) { +BOOL WINAPI TerminateProcess(HANDLE hProcess, UINT uExitCode) { HOST_CONTEXT_GUARD(); DEBUG_LOG("TerminateProcess(%p, %u)\n", hProcess, uExitCode); if (isPseudoCurrentProcessHandle(hProcess)) { @@ -354,7 +354,7 @@ BOOL WIN_FUNC TerminateProcess(HANDLE hProcess, UINT uExitCode) { return TRUE; } -BOOL WIN_FUNC GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode) { +BOOL WINAPI GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetExitCodeProcess(%p, %p)\n", hProcess, lpExitCode); if (!lpExitCode) { @@ -379,7 +379,7 @@ BOOL WIN_FUNC GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode) { return TRUE; } -DWORD WIN_FUNC TlsAlloc() { +DWORD WINAPI TlsAlloc() { HOST_CONTEXT_GUARD(); VERBOSE_LOG("TlsAlloc()\n"); DWORD index = wibo::tls::reserveSlot(); @@ -391,7 +391,7 @@ DWORD WIN_FUNC TlsAlloc() { return index; } -BOOL WIN_FUNC TlsFree(DWORD dwTlsIndex) { +BOOL WINAPI TlsFree(DWORD dwTlsIndex) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("TlsFree(%u)\n", dwTlsIndex); if (!wibo::tls::releaseSlot(dwTlsIndex)) { @@ -402,7 +402,7 @@ BOOL WIN_FUNC TlsFree(DWORD dwTlsIndex) { return TRUE; } -LPVOID WIN_FUNC TlsGetValue(DWORD dwTlsIndex) { +LPVOID WINAPI TlsGetValue(DWORD dwTlsIndex) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("TlsGetValue(%u)\n", dwTlsIndex); if (!wibo::tls::isSlotAllocated(dwTlsIndex)) { @@ -414,7 +414,7 @@ LPVOID WIN_FUNC TlsGetValue(DWORD dwTlsIndex) { return result; } -BOOL WIN_FUNC TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) { +BOOL WINAPI TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("TlsSetValue(%u, %p)\n", dwTlsIndex, lpTlsValue); if (!wibo::tls::isSlotAllocated(dwTlsIndex)) { @@ -429,7 +429,7 @@ BOOL WIN_FUNC TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) { return TRUE; } -DWORD WIN_FUNC ResumeThread(HANDLE hThread) { +DWORD WINAPI ResumeThread(HANDLE hThread) { HOST_CONTEXT_GUARD(); DEBUG_LOG("ResumeThread(%p)\n", hThread); // TODO: behavior with current thread handle? @@ -456,7 +456,7 @@ DWORD WIN_FUNC ResumeThread(HANDLE hThread) { return previous; } -HRESULT WIN_FUNC SetThreadDescription(HANDLE hThread, LPCWSTR lpThreadDescription) { +HRESULT WINAPI SetThreadDescription(HANDLE hThread, LPCWSTR lpThreadDescription) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: SetThreadDescription(%p, %p)\n", hThread, lpThreadDescription); (void)hThread; @@ -464,7 +464,7 @@ HRESULT WIN_FUNC SetThreadDescription(HANDLE hThread, LPCWSTR lpThreadDescriptio return S_OK; } -HANDLE WIN_FUNC CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, +HANDLE WINAPI CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId) { HOST_CONTEXT_GUARD(); @@ -516,7 +516,7 @@ HANDLE WIN_FUNC CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dw return wibo::handles().alloc(std::move(obj), 0 /* TODO */, 0); } -[[noreturn]] void WIN_FUNC ExitThread(DWORD dwExitCode) { +[[noreturn]] void WINAPI ExitThread(DWORD dwExitCode) { HOST_CONTEXT_GUARD(); DEBUG_LOG("ExitThread(%u)\n", dwExitCode); ThreadObject *obj = g_currentThreadObject; @@ -530,7 +530,7 @@ HANDLE WIN_FUNC CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dw pthread_exit(nullptr); } -BOOL WIN_FUNC GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode) { +BOOL WINAPI GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetExitCodeThread(%p, %p)\n", hThread, lpExitCode); if (!lpExitCode) { @@ -551,7 +551,7 @@ BOOL WIN_FUNC GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode) { return TRUE; } -BOOL WIN_FUNC SetThreadPriority(HANDLE hThread, int nPriority) { +BOOL WINAPI SetThreadPriority(HANDLE hThread, int nPriority) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: SetThreadPriority(%p, %d)\n", hThread, nPriority); (void)hThread; @@ -559,21 +559,21 @@ BOOL WIN_FUNC SetThreadPriority(HANDLE hThread, int nPriority) { return TRUE; } -int WIN_FUNC GetThreadPriority(HANDLE hThread) { +int WINAPI GetThreadPriority(HANDLE hThread) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: GetThreadPriority(%p)\n", hThread); (void)hThread; return 0; } -DWORD WIN_FUNC GetPriorityClass(HANDLE hProcess) { +DWORD WINAPI GetPriorityClass(HANDLE hProcess) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetPriorityClass(%p)\n", hProcess); (void)hProcess; return NORMAL_PRIORITY_CLASS; } -BOOL WIN_FUNC GetThreadTimes(HANDLE hThread, FILETIME *lpCreationTime, FILETIME *lpExitTime, FILETIME *lpKernelTime, +BOOL WINAPI GetThreadTimes(HANDLE hThread, FILETIME *lpCreationTime, FILETIME *lpExitTime, FILETIME *lpKernelTime, FILETIME *lpUserTime) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetThreadTimes(%p, %p, %p, %p, %p)\n", hThread, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime); @@ -617,7 +617,7 @@ BOOL WIN_FUNC GetThreadTimes(HANDLE hThread, FILETIME *lpCreationTime, FILETIME return FALSE; } -BOOL WIN_FUNC CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, +BOOL WINAPI CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation) { @@ -671,7 +671,7 @@ BOOL WIN_FUNC CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSE return TRUE; } -BOOL WIN_FUNC CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, +BOOL WINAPI CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation) { @@ -706,19 +706,19 @@ BOOL WIN_FUNC CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LP lpProcessInformation); } -void WIN_FUNC GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo) { +void WINAPI GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetStartupInfoA(%p)\n", lpStartupInfo); populateStartupInfo(lpStartupInfo); } -void WIN_FUNC GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo) { +void WINAPI GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetStartupInfoW(%p)\n", lpStartupInfo); populateStartupInfo(lpStartupInfo); } -BOOL WIN_FUNC SetThreadStackGuarantee(PULONG StackSizeInBytes) { +BOOL WINAPI SetThreadStackGuarantee(PULONG StackSizeInBytes) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: SetThreadStackGuarantee(%p)\n", StackSizeInBytes); (void)StackSizeInBytes; diff --git a/dll/kernel32/processthreadsapi.h b/dll/kernel32/processthreadsapi.h index d247efc..708b98c 100644 --- a/dll/kernel32/processthreadsapi.h +++ b/dll/kernel32/processthreadsapi.h @@ -1,8 +1,7 @@ #pragma once -#include "common.h" -#include "errors.h" #include "minwinbase.h" +#include "types.h" struct PROCESS_INFORMATION { HANDLE hProcess; @@ -29,7 +28,7 @@ struct STARTUPINFOA { DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; - unsigned char *lpReserved2; + LPBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; @@ -52,7 +51,7 @@ struct STARTUPINFOW { DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; - unsigned char *lpReserved2; + LPBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; @@ -67,44 +66,43 @@ typedef DWORD(WIN_FUNC *LPTHREAD_START_ROUTINE)(LPVOID); namespace kernel32 { -HANDLE WIN_FUNC GetCurrentProcess(); -DWORD WIN_FUNC GetCurrentProcessId(); -DWORD WIN_FUNC GetCurrentThreadId(); -HANDLE WIN_FUNC GetCurrentThread(); -BOOL WIN_FUNC IsProcessorFeaturePresent(DWORD ProcessorFeature); -BOOL WIN_FUNC GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR lpProcessAffinityMask, - PDWORD_PTR lpSystemAffinityMask); -BOOL WIN_FUNC SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask); -DWORD_PTR WIN_FUNC SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask); -DWORD WIN_FUNC ResumeThread(HANDLE hThread); -HRESULT WIN_FUNC SetThreadDescription(HANDLE hThread, LPCWSTR lpThreadDescription); -void WIN_FUNC ExitProcess(UINT uExitCode); -BOOL WIN_FUNC TerminateProcess(HANDLE hProcess, UINT uExitCode); -BOOL WIN_FUNC GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode); -DWORD WIN_FUNC TlsAlloc(); -BOOL WIN_FUNC TlsFree(DWORD dwTlsIndex); -LPVOID WIN_FUNC TlsGetValue(DWORD dwTlsIndex); -BOOL WIN_FUNC TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue); -HANDLE WIN_FUNC CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, - LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, - LPDWORD lpThreadId); -[[noreturn]] void WIN_FUNC ExitThread(DWORD dwExitCode); -BOOL WIN_FUNC GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode); -BOOL WIN_FUNC SetThreadPriority(HANDLE hThread, int nPriority); -int WIN_FUNC GetThreadPriority(HANDLE hThread); -DWORD WIN_FUNC GetPriorityClass(HANDLE hProcess); -BOOL WIN_FUNC GetThreadTimes(HANDLE hThread, FILETIME *lpCreationTime, FILETIME *lpExitTime, FILETIME *lpKernelTime, - FILETIME *lpUserTime); -BOOL WIN_FUNC CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, - LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation); -BOOL WIN_FUNC CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, - LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, - LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, - LPPROCESS_INFORMATION lpProcessInformation); -void WIN_FUNC GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo); -void WIN_FUNC GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo); -BOOL WIN_FUNC SetThreadStackGuarantee(PULONG StackSizeInBytes); +HANDLE WINAPI GetCurrentProcess(); +DWORD WINAPI GetCurrentProcessId(); +DWORD WINAPI GetCurrentThreadId(); +HANDLE WINAPI GetCurrentThread(); +BOOL WINAPI IsProcessorFeaturePresent(DWORD ProcessorFeature); +BOOL WINAPI GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR lpProcessAffinityMask, PDWORD_PTR lpSystemAffinityMask); +BOOL WINAPI SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask); +DWORD_PTR WINAPI SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask); +DWORD WINAPI ResumeThread(HANDLE hThread); +HRESULT WINAPI SetThreadDescription(HANDLE hThread, LPCWSTR lpThreadDescription); +void WINAPI ExitProcess(UINT uExitCode); +BOOL WINAPI TerminateProcess(HANDLE hProcess, UINT uExitCode); +BOOL WINAPI GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode); +DWORD WINAPI TlsAlloc(); +BOOL WINAPI TlsFree(DWORD dwTlsIndex); +LPVOID WINAPI TlsGetValue(DWORD dwTlsIndex); +BOOL WINAPI TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue); +HANDLE WINAPI CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, + LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, + LPDWORD lpThreadId); +[[noreturn]] void WINAPI ExitThread(DWORD dwExitCode); +BOOL WINAPI GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode); +BOOL WINAPI SetThreadPriority(HANDLE hThread, int nPriority); +int WINAPI GetThreadPriority(HANDLE hThread); +DWORD WINAPI GetPriorityClass(HANDLE hProcess); +BOOL WINAPI GetThreadTimes(HANDLE hThread, FILETIME *lpCreationTime, FILETIME *lpExitTime, FILETIME *lpKernelTime, + FILETIME *lpUserTime); +BOOL WINAPI CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, + LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation); +BOOL WINAPI CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, + LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, + LPPROCESS_INFORMATION lpProcessInformation); +void WINAPI GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo); +void WINAPI GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo); +BOOL WINAPI SetThreadStackGuarantee(PULONG StackSizeInBytes); } // namespace kernel32 diff --git a/dll/kernel32/profileapi.cpp b/dll/kernel32/profileapi.cpp index 90fd85c..a8f6300 100644 --- a/dll/kernel32/profileapi.cpp +++ b/dll/kernel32/profileapi.cpp @@ -7,7 +7,7 @@ namespace kernel32 { -BOOL WIN_FUNC QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) { +BOOL WINAPI QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("STUB: QueryPerformanceCounter(%p)\n", lpPerformanceCount); if (!lpPerformanceCount) { @@ -18,7 +18,7 @@ BOOL WIN_FUNC QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) { return TRUE; } -BOOL WIN_FUNC QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) { +BOOL WINAPI QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("STUB: QueryPerformanceFrequency(%p)\n", lpFrequency); if (!lpFrequency) { diff --git a/dll/kernel32/profileapi.h b/dll/kernel32/profileapi.h index e35b678..9a17eb9 100644 --- a/dll/kernel32/profileapi.h +++ b/dll/kernel32/profileapi.h @@ -1,10 +1,10 @@ #pragma once -#include "common.h" +#include "types.h" namespace kernel32 { -BOOL WIN_FUNC QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount); -BOOL WIN_FUNC QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency); +BOOL WINAPI QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount); +BOOL WINAPI QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency); } // namespace kernel32 diff --git a/dll/kernel32/stringapiset.cpp b/dll/kernel32/stringapiset.cpp index c6daddb..c140ed1 100644 --- a/dll/kernel32/stringapiset.cpp +++ b/dll/kernel32/stringapiset.cpp @@ -13,7 +13,7 @@ namespace kernel32 { -int WIN_FUNC WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, +int WINAPI WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("WideCharToMultiByte(%u, %u, %p, %d, %p, %d, %p, %p)\n", CodePage, dwFlags, lpWideCharStr, cchWideChar, @@ -45,7 +45,7 @@ int WIN_FUNC WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWCH lpWideChar return cchWideChar; } -int WIN_FUNC MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCCH lpMultiByteStr, int cbMultiByte, +int WINAPI MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCCH lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("MultiByteToWideChar(%u, %u, %d, %d)\n", CodePage, dwFlags, cbMultiByte, cchWideChar); @@ -72,7 +72,7 @@ int WIN_FUNC MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCCH lpMultiByte return cbMultiByte; } -BOOL WIN_FUNC GetStringTypeW(DWORD dwInfoType, LPCWCH lpSrcStr, int cchSrc, LPWORD lpCharType) { +BOOL WINAPI GetStringTypeW(DWORD dwInfoType, LPCWCH lpSrcStr, int cchSrc, LPWORD lpCharType) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetStringTypeW(%u, %p, %i, %p)\n", dwInfoType, lpSrcStr, cchSrc, lpCharType); @@ -105,7 +105,7 @@ BOOL WIN_FUNC GetStringTypeW(DWORD dwInfoType, LPCWCH lpSrcStr, int cchSrc, LPWO return TRUE; } -BOOL WIN_FUNC GetStringTypeA(LCID Locale, DWORD dwInfoType, LPCSTR lpSrcStr, int cchSrc, LPWORD lpCharType) { +BOOL WINAPI GetStringTypeA(LCID Locale, DWORD dwInfoType, LPCSTR lpSrcStr, int cchSrc, LPWORD lpCharType) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetStringTypeA(%u, %u, %p, %d, %p)\n", Locale, dwInfoType, lpSrcStr, cchSrc, lpCharType); (void)Locale; diff --git a/dll/kernel32/stringapiset.h b/dll/kernel32/stringapiset.h index 974b8f6..68962b7 100644 --- a/dll/kernel32/stringapiset.h +++ b/dll/kernel32/stringapiset.h @@ -1,14 +1,14 @@ #pragma once -#include "common.h" +#include "types.h" namespace kernel32 { -int WIN_FUNC WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, +int WINAPI WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar); -int WIN_FUNC MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCCH lpMultiByteStr, int cbMultiByte, +int WINAPI MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCCH lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar); -BOOL WIN_FUNC GetStringTypeW(DWORD dwInfoType, LPCWCH lpSrcStr, int cchSrc, LPWORD lpCharType); -BOOL WIN_FUNC GetStringTypeA(LCID Locale, DWORD dwInfoType, LPCSTR lpSrcStr, int cchSrc, LPWORD lpCharType); +BOOL WINAPI GetStringTypeW(DWORD dwInfoType, LPCWCH lpSrcStr, int cchSrc, LPWORD lpCharType); +BOOL WINAPI GetStringTypeA(LCID Locale, DWORD dwInfoType, LPCSTR lpSrcStr, int cchSrc, LPWORD lpCharType); } // namespace kernel32 diff --git a/dll/kernel32/synchapi.cpp b/dll/kernel32/synchapi.cpp index fa3fc5f..ad81411 100644 --- a/dll/kernel32/synchapi.cpp +++ b/dll/kernel32/synchapi.cpp @@ -128,13 +128,13 @@ struct WaitBlock { namespace kernel32 { -void WIN_FUNC Sleep(DWORD dwMilliseconds) { +void WINAPI Sleep(DWORD dwMilliseconds) { HOST_CONTEXT_GUARD(); DEBUG_LOG("Sleep(%u)\n", dwMilliseconds); usleep(static_cast(dwMilliseconds) * 1000); } -HANDLE WIN_FUNC CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCWSTR lpName) { +HANDLE WINAPI CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCWSTR lpName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("CreateMutexW(%p, %d, %s)\n", lpMutexAttributes, static_cast(bInitialOwner), wideStringToString(lpName).c_str()); @@ -165,7 +165,7 @@ HANDLE WIN_FUNC CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInit return h; } -HANDLE WIN_FUNC CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCSTR lpName) { +HANDLE WINAPI CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCSTR lpName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("CreateMutexA -> "); std::vector wideName; @@ -174,7 +174,7 @@ HANDLE WIN_FUNC CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInit lpName ? reinterpret_cast(wideName.data()) : nullptr); } -BOOL WIN_FUNC ReleaseMutex(HANDLE hMutex) { +BOOL WINAPI ReleaseMutex(HANDLE hMutex) { HOST_CONTEXT_GUARD(); DEBUG_LOG("ReleaseMutex(%p)\n", hMutex); auto mu = wibo::handles().getAs(hMutex); @@ -203,7 +203,7 @@ BOOL WIN_FUNC ReleaseMutex(HANDLE hMutex) { return TRUE; } -HANDLE WIN_FUNC CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, +HANDLE WINAPI CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCWSTR lpName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("CreateEventW(%p, %d, %d, %s)\n", lpEventAttributes, static_cast(bManualReset), @@ -230,7 +230,7 @@ HANDLE WIN_FUNC CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManu return h; } -HANDLE WIN_FUNC CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, +HANDLE WINAPI CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCSTR lpName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("CreateEventA -> "); @@ -240,7 +240,7 @@ HANDLE WIN_FUNC CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManu lpName ? reinterpret_cast(wideName.data()) : nullptr); } -HANDLE WIN_FUNC CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, +HANDLE WINAPI CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCWSTR lpName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("CreateSemaphoreW(%p, %ld, %ld, %s)\n", lpSemaphoreAttributes, lInitialCount, lMaximumCount, @@ -267,7 +267,7 @@ HANDLE WIN_FUNC CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LO return h; } -HANDLE WIN_FUNC CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, +HANDLE WINAPI CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCSTR lpName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("CreateSemaphoreA -> "); @@ -277,7 +277,7 @@ HANDLE WIN_FUNC CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LO lpName ? reinterpret_cast(wideName.data()) : nullptr); } -BOOL WIN_FUNC ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, PLONG lpPreviousCount) { +BOOL WINAPI ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, PLONG lpPreviousCount) { HOST_CONTEXT_GUARD(); DEBUG_LOG("ReleaseSemaphore(%p, %ld, %p)\n", hSemaphore, lReleaseCount, lpPreviousCount); if (lReleaseCount < 0) { @@ -318,7 +318,7 @@ BOOL WIN_FUNC ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, PLONG lpPr return TRUE; } -BOOL WIN_FUNC SetEvent(HANDLE hEvent) { +BOOL WINAPI SetEvent(HANDLE hEvent) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetEvent(%p)\n", hEvent); auto ev = wibo::handles().getAs(hEvent); @@ -330,7 +330,7 @@ BOOL WIN_FUNC SetEvent(HANDLE hEvent) { return TRUE; } -BOOL WIN_FUNC ResetEvent(HANDLE hEvent) { +BOOL WINAPI ResetEvent(HANDLE hEvent) { HOST_CONTEXT_GUARD(); DEBUG_LOG("ResetEvent(%p)\n", hEvent); auto ev = wibo::handles().getAs(hEvent); @@ -342,7 +342,7 @@ BOOL WIN_FUNC ResetEvent(HANDLE hEvent) { return TRUE; } -DWORD WIN_FUNC WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) { +DWORD WINAPI WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) { HOST_CONTEXT_GUARD(); DEBUG_LOG("WaitForSingleObject(%p, %u)\n", hHandle, dwMilliseconds); HandleMeta meta{}; @@ -448,7 +448,7 @@ DWORD WIN_FUNC WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) { } } -DWORD WIN_FUNC WaitForMultipleObjects(DWORD nCount, const HANDLE *lpHandles, BOOL bWaitAll, DWORD dwMilliseconds) { +DWORD WINAPI WaitForMultipleObjects(DWORD nCount, const HANDLE *lpHandles, BOOL bWaitAll, DWORD dwMilliseconds) { HOST_CONTEXT_GUARD(); DEBUG_LOG("WaitForMultipleObjects(%u, %p, %d, %u)\n", nCount, lpHandles, static_cast(bWaitAll), dwMilliseconds); @@ -543,7 +543,7 @@ DWORD WIN_FUNC WaitForMultipleObjects(DWORD nCount, const HANDLE *lpHandles, BOO return waitResult; } -void WIN_FUNC InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { +void WINAPI InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("STUB: InitializeCriticalSection(%p)\n", lpCriticalSection); if (!lpCriticalSection) { @@ -552,7 +552,7 @@ void WIN_FUNC InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { std::memset(lpCriticalSection, 0, sizeof(*lpCriticalSection)); } -BOOL WIN_FUNC InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags) { +BOOL WINAPI InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: InitializeCriticalSectionEx(%p, %u, 0x%x)\n", lpCriticalSection, dwSpinCount, Flags); if (!lpCriticalSection) { @@ -568,7 +568,7 @@ BOOL WIN_FUNC InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, return TRUE; } -BOOL WIN_FUNC InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount) { +BOOL WINAPI InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: InitializeCriticalSectionAndSpinCount(%p, %u)\n", lpCriticalSection, dwSpinCount); if (!lpCriticalSection) { @@ -580,25 +580,25 @@ BOOL WIN_FUNC InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCritica return TRUE; } -void WIN_FUNC DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { +void WINAPI DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("STUB: DeleteCriticalSection(%p)\n", lpCriticalSection); (void)lpCriticalSection; } -void WIN_FUNC EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { +void WINAPI EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("STUB: EnterCriticalSection(%p)\n", lpCriticalSection); (void)lpCriticalSection; } -void WIN_FUNC LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { +void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("STUB: LeaveCriticalSection(%p)\n", lpCriticalSection); (void)lpCriticalSection; } -BOOL WIN_FUNC InitOnceBeginInitialize(LPINIT_ONCE lpInitOnce, DWORD dwFlags, PBOOL fPending, LPVOID *lpContext) { +BOOL WINAPI InitOnceBeginInitialize(LPINIT_ONCE lpInitOnce, DWORD dwFlags, PBOOL fPending, LPVOID *lpContext) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: InitOnceBeginInitialize(%p, %u, %p, %p)\n", lpInitOnce, dwFlags, fPending, lpContext); if (!lpInitOnce) { @@ -618,7 +618,7 @@ BOOL WIN_FUNC InitOnceBeginInitialize(LPINIT_ONCE lpInitOnce, DWORD dwFlags, PBO return TRUE; } -BOOL WIN_FUNC InitOnceComplete(LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpContext) { +BOOL WINAPI InitOnceComplete(LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpContext) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: InitOnceComplete(%p, %u, %p)\n", lpInitOnce, dwFlags, lpContext); if (!lpInitOnce) { @@ -633,31 +633,31 @@ BOOL WIN_FUNC InitOnceComplete(LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpC return TRUE; } -void WIN_FUNC AcquireSRWLockShared(PSRWLOCK SRWLock) { +void WINAPI AcquireSRWLockShared(PSRWLOCK SRWLock) { HOST_CONTEXT_GUARD(); (void)SRWLock; VERBOSE_LOG("STUB: AcquireSRWLockShared(%p)\n", SRWLock); } -void WIN_FUNC ReleaseSRWLockShared(PSRWLOCK SRWLock) { +void WINAPI ReleaseSRWLockShared(PSRWLOCK SRWLock) { HOST_CONTEXT_GUARD(); (void)SRWLock; VERBOSE_LOG("STUB: ReleaseSRWLockShared(%p)\n", SRWLock); } -void WIN_FUNC AcquireSRWLockExclusive(PSRWLOCK SRWLock) { +void WINAPI AcquireSRWLockExclusive(PSRWLOCK SRWLock) { HOST_CONTEXT_GUARD(); (void)SRWLock; VERBOSE_LOG("STUB: AcquireSRWLockExclusive(%p)\n", SRWLock); } -void WIN_FUNC ReleaseSRWLockExclusive(PSRWLOCK SRWLock) { +void WINAPI ReleaseSRWLockExclusive(PSRWLOCK SRWLock) { HOST_CONTEXT_GUARD(); (void)SRWLock; VERBOSE_LOG("STUB: ReleaseSRWLockExclusive(%p)\n", SRWLock); } -BOOLEAN WIN_FUNC TryAcquireSRWLockExclusive(PSRWLOCK SRWLock) { +BOOLEAN WINAPI TryAcquireSRWLockExclusive(PSRWLOCK SRWLock) { HOST_CONTEXT_GUARD(); (void)SRWLock; VERBOSE_LOG("STUB: TryAcquireSRWLockExclusive(%p)\n", SRWLock); diff --git a/dll/kernel32/synchapi.h b/dll/kernel32/synchapi.h index 1514e90..060bff9 100644 --- a/dll/kernel32/synchapi.h +++ b/dll/kernel32/synchapi.h @@ -1,7 +1,7 @@ #pragma once -#include "common.h" #include "minwinbase.h" +#include "types.h" constexpr DWORD WAIT_OBJECT_0 = 0x00000000; constexpr DWORD WAIT_ABANDONED = 0x00000080; @@ -17,11 +17,6 @@ constexpr DWORD INIT_ONCE_CTX_RESERVED_BITS = 2; constexpr DWORD CRITICAL_SECTION_NO_DEBUG_INFO = 0x01000000UL; -struct LIST_ENTRY { - LIST_ENTRY *Flink; - LIST_ENTRY *Blink; -}; - struct RTL_CRITICAL_SECTION; struct RTL_CRITICAL_SECTION_DEBUG { @@ -74,35 +69,35 @@ constexpr SRWLOCK SRWLOCK_INIT{nullptr}; namespace kernel32 { -void WIN_FUNC Sleep(DWORD dwMilliseconds); -HANDLE WIN_FUNC CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCSTR lpName); -HANDLE WIN_FUNC CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCWSTR lpName); -BOOL WIN_FUNC ReleaseMutex(HANDLE hMutex); -HANDLE WIN_FUNC CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, - LPCSTR lpName); -HANDLE WIN_FUNC CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, - LPCWSTR lpName); -BOOL WIN_FUNC SetEvent(HANDLE hEvent); -BOOL WIN_FUNC ResetEvent(HANDLE hEvent); -HANDLE WIN_FUNC CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, - LPCSTR lpName); -HANDLE WIN_FUNC CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, - LPCWSTR lpName); -BOOL WIN_FUNC ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, PLONG lpPreviousCount); -DWORD WIN_FUNC WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds); -DWORD WIN_FUNC WaitForMultipleObjects(DWORD nCount, const HANDLE *lpHandles, BOOL bWaitAll, DWORD dwMilliseconds); -void WIN_FUNC InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection); -BOOL WIN_FUNC InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags); -BOOL WIN_FUNC InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount); -void WIN_FUNC DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection); -void WIN_FUNC EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection); -void WIN_FUNC LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection); -BOOL WIN_FUNC InitOnceBeginInitialize(LPINIT_ONCE lpInitOnce, DWORD dwFlags, PBOOL fPending, LPVOID *lpContext); -BOOL WIN_FUNC InitOnceComplete(LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpContext); -void WIN_FUNC AcquireSRWLockShared(PSRWLOCK SRWLock); -void WIN_FUNC ReleaseSRWLockShared(PSRWLOCK SRWLock); -void WIN_FUNC AcquireSRWLockExclusive(PSRWLOCK SRWLock); -void WIN_FUNC ReleaseSRWLockExclusive(PSRWLOCK SRWLock); -BOOLEAN WIN_FUNC TryAcquireSRWLockExclusive(PSRWLOCK SRWLock); +void WINAPI Sleep(DWORD dwMilliseconds); +HANDLE WINAPI CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCSTR lpName); +HANDLE WINAPI CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCWSTR lpName); +BOOL WINAPI ReleaseMutex(HANDLE hMutex); +HANDLE WINAPI CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, + LPCSTR lpName); +HANDLE WINAPI CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, + LPCWSTR lpName); +BOOL WINAPI SetEvent(HANDLE hEvent); +BOOL WINAPI ResetEvent(HANDLE hEvent); +HANDLE WINAPI CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, + LPCSTR lpName); +HANDLE WINAPI CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, + LPCWSTR lpName); +BOOL WINAPI ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, PLONG lpPreviousCount); +DWORD WINAPI WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds); +DWORD WINAPI WaitForMultipleObjects(DWORD nCount, const HANDLE *lpHandles, BOOL bWaitAll, DWORD dwMilliseconds); +void WINAPI InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection); +BOOL WINAPI InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags); +BOOL WINAPI InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount); +void WINAPI DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection); +void WINAPI EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection); +void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection); +BOOL WINAPI InitOnceBeginInitialize(LPINIT_ONCE lpInitOnce, DWORD dwFlags, PBOOL fPending, LPVOID *lpContext); +BOOL WINAPI InitOnceComplete(LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpContext); +void WINAPI AcquireSRWLockShared(PSRWLOCK SRWLock); +void WINAPI ReleaseSRWLockShared(PSRWLOCK SRWLock); +void WINAPI AcquireSRWLockExclusive(PSRWLOCK SRWLock); +void WINAPI ReleaseSRWLockExclusive(PSRWLOCK SRWLock); +BOOLEAN WINAPI TryAcquireSRWLockExclusive(PSRWLOCK SRWLock); } // namespace kernel32 diff --git a/dll/kernel32/sysinfoapi.cpp b/dll/kernel32/sysinfoapi.cpp index 07901b8..2ef5913 100644 --- a/dll/kernel32/sysinfoapi.cpp +++ b/dll/kernel32/sysinfoapi.cpp @@ -33,7 +33,7 @@ DWORD_PTR computeSystemProcessorMask(unsigned int cpuCount) { namespace kernel32 { -void WIN_FUNC GetSystemInfo(LPSYSTEM_INFO lpSystemInfo) { +void WINAPI GetSystemInfo(LPSYSTEM_INFO lpSystemInfo) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetSystemInfo(%p)\n", lpSystemInfo); if (!lpSystemInfo) { @@ -70,7 +70,7 @@ void WIN_FUNC GetSystemInfo(LPSYSTEM_INFO lpSystemInfo) { lpSystemInfo->dwAllocationGranularity = 0x10000; } -void WIN_FUNC GetSystemTime(LPSYSTEMTIME lpSystemTime) { +void WINAPI GetSystemTime(LPSYSTEMTIME lpSystemTime) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetSystemTime(%p)\n", lpSystemTime); if (!lpSystemTime) { @@ -99,7 +99,7 @@ void WIN_FUNC GetSystemTime(LPSYSTEMTIME lpSystemTime) { lpSystemTime->wMilliseconds = 0; } -void WIN_FUNC GetLocalTime(LPSYSTEMTIME lpSystemTime) { +void WINAPI GetLocalTime(LPSYSTEMTIME lpSystemTime) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetLocalTime(%p)\n", lpSystemTime); if (!lpSystemTime) { @@ -128,7 +128,7 @@ void WIN_FUNC GetLocalTime(LPSYSTEMTIME lpSystemTime) { lpSystemTime->wMilliseconds = 0; } -void WIN_FUNC GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) { +void WINAPI GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetSystemTimeAsFileTime(%p)\n", lpSystemTimeAsFileTime); if (!lpSystemTimeAsFileTime) { @@ -160,7 +160,7 @@ void WIN_FUNC GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) { *lpSystemTimeAsFileTime = fallback; } -DWORD WIN_FUNC GetTickCount() { +DWORD WINAPI GetTickCount() { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetTickCount()\n"); #if defined(CLOCK_MONOTONIC) @@ -185,13 +185,13 @@ DWORD WIN_FUNC GetTickCount() { return 0; } -DWORD WIN_FUNC GetVersion() { +DWORD WINAPI GetVersion() { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetVersion()\n"); return kMajorVersion | (kMinorVersion << 8) | (5 << 16) | (kBuildNumber << 24); } -BOOL WIN_FUNC GetVersionExA(LPOSVERSIONINFOA lpVersionInformation) { +BOOL WINAPI GetVersionExA(LPOSVERSIONINFOA lpVersionInformation) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetVersionExA(%p)\n", lpVersionInformation); if (!lpVersionInformation) { diff --git a/dll/kernel32/sysinfoapi.h b/dll/kernel32/sysinfoapi.h index b195261..44c196c 100644 --- a/dll/kernel32/sysinfoapi.h +++ b/dll/kernel32/sysinfoapi.h @@ -1,7 +1,7 @@ #pragma once -#include "common.h" #include "minwinbase.h" +#include "types.h" struct SYSTEM_INFO { union { @@ -37,12 +37,12 @@ using LPOSVERSIONINFOA = OSVERSIONINFOA *; namespace kernel32 { -void WIN_FUNC GetSystemInfo(LPSYSTEM_INFO lpSystemInfo); -void WIN_FUNC GetSystemTime(LPSYSTEMTIME lpSystemTime); -void WIN_FUNC GetLocalTime(LPSYSTEMTIME lpSystemTime); -void WIN_FUNC GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime); -DWORD WIN_FUNC GetTickCount(); -DWORD WIN_FUNC GetVersion(); -BOOL WIN_FUNC GetVersionExA(LPOSVERSIONINFOA lpVersionInformation); +void WINAPI GetSystemInfo(LPSYSTEM_INFO lpSystemInfo); +void WINAPI GetSystemTime(LPSYSTEMTIME lpSystemTime); +void WINAPI GetLocalTime(LPSYSTEMTIME lpSystemTime); +void WINAPI GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime); +DWORD WINAPI GetTickCount(); +DWORD WINAPI GetVersion(); +BOOL WINAPI GetVersionExA(LPOSVERSIONINFOA lpVersionInformation); } // namespace kernel32 diff --git a/dll/kernel32/timezoneapi.cpp b/dll/kernel32/timezoneapi.cpp index ff0a51c..28d4c90 100644 --- a/dll/kernel32/timezoneapi.cpp +++ b/dll/kernel32/timezoneapi.cpp @@ -11,7 +11,7 @@ namespace kernel32 { -BOOL WIN_FUNC SystemTimeToFileTime(const SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime) { +BOOL WINAPI SystemTimeToFileTime(const SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SystemTimeToFileTime(%p, %p)\n", lpSystemTime, lpFileTime); if (!lpSystemTime || !lpFileTime) { @@ -37,7 +37,7 @@ BOOL WIN_FUNC SystemTimeToFileTime(const SYSTEMTIME *lpSystemTime, LPFILETIME lp return TRUE; } -BOOL WIN_FUNC FileTimeToSystemTime(const FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime) { +BOOL WINAPI FileTimeToSystemTime(const FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FileTimeToSystemTime(%p, %p)\n", lpFileTime, lpSystemTime); if (!lpFileTime || !lpSystemTime) { @@ -66,7 +66,7 @@ BOOL WIN_FUNC FileTimeToSystemTime(const FILETIME *lpFileTime, LPSYSTEMTIME lpSy return TRUE; } -BOOL WIN_FUNC FileTimeToLocalFileTime(const FILETIME *lpFileTime, LPFILETIME lpLocalFileTime) { +BOOL WINAPI FileTimeToLocalFileTime(const FILETIME *lpFileTime, LPFILETIME lpLocalFileTime) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FileTimeToLocalFileTime(%p, %p)\n", lpFileTime, lpLocalFileTime); if (!lpFileTime || !lpLocalFileTime) { @@ -115,7 +115,7 @@ BOOL WIN_FUNC FileTimeToLocalFileTime(const FILETIME *lpFileTime, LPFILETIME lpL return TRUE; } -BOOL WIN_FUNC LocalFileTimeToFileTime(const FILETIME *lpLocalFileTime, LPFILETIME lpFileTime) { +BOOL WINAPI LocalFileTimeToFileTime(const FILETIME *lpLocalFileTime, LPFILETIME lpFileTime) { HOST_CONTEXT_GUARD(); DEBUG_LOG("LocalFileTimeToFileTime(%p, %p)\n", lpLocalFileTime, lpFileTime); if (!lpLocalFileTime || !lpFileTime) { @@ -157,7 +157,7 @@ BOOL WIN_FUNC LocalFileTimeToFileTime(const FILETIME *lpLocalFileTime, LPFILETIM return TRUE; } -BOOL WIN_FUNC DosDateTimeToFileTime(WORD wFatDate, WORD wFatTime, LPFILETIME lpFileTime) { +BOOL WINAPI DosDateTimeToFileTime(WORD wFatDate, WORD wFatTime, LPFILETIME lpFileTime) { HOST_CONTEXT_GUARD(); DEBUG_LOG("DosDateTimeToFileTime(%04x, %04x, %p)\n", wFatDate, wFatTime, lpFileTime); if (!lpFileTime) { @@ -192,7 +192,7 @@ BOOL WIN_FUNC DosDateTimeToFileTime(WORD wFatDate, WORD wFatTime, LPFILETIME lpF return TRUE; } -BOOL WIN_FUNC FileTimeToDosDateTime(const FILETIME *lpFileTime, LPWORD lpFatDate, LPWORD lpFatTime) { +BOOL WINAPI FileTimeToDosDateTime(const FILETIME *lpFileTime, LPWORD lpFatDate, LPWORD lpFatTime) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FileTimeToDosDateTime(%p, %p, %p)\n", lpFileTime, lpFatDate, lpFatTime); if (!lpFileTime || !lpFatDate || !lpFatTime) { @@ -221,7 +221,7 @@ BOOL WIN_FUNC FileTimeToDosDateTime(const FILETIME *lpFileTime, LPWORD lpFatDate return TRUE; } -DWORD WIN_FUNC GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation) { +DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetTimeZoneInformation(%p)\n", lpTimeZoneInformation); if (!lpTimeZoneInformation) { diff --git a/dll/kernel32/timezoneapi.h b/dll/kernel32/timezoneapi.h index 8fb1192..dfe1010 100644 --- a/dll/kernel32/timezoneapi.h +++ b/dll/kernel32/timezoneapi.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" #include "minwinbase.h" struct TIME_ZONE_INFORMATION { @@ -22,12 +22,12 @@ constexpr DWORD TIME_ZONE_ID_INVALID = 0xFFFFFFFFu; namespace kernel32 { -BOOL WIN_FUNC SystemTimeToFileTime(const SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime); -BOOL WIN_FUNC FileTimeToSystemTime(const FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime); -BOOL WIN_FUNC FileTimeToLocalFileTime(const FILETIME *lpFileTime, LPFILETIME lpLocalFileTime); -BOOL WIN_FUNC LocalFileTimeToFileTime(const FILETIME *lpLocalFileTime, LPFILETIME lpFileTime); -BOOL WIN_FUNC DosDateTimeToFileTime(WORD wFatDate, WORD wFatTime, LPFILETIME lpFileTime); -BOOL WIN_FUNC FileTimeToDosDateTime(const FILETIME *lpFileTime, LPWORD lpFatDate, LPWORD lpFatTime); -DWORD WIN_FUNC GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation); +BOOL WINAPI SystemTimeToFileTime(const SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime); +BOOL WINAPI FileTimeToSystemTime(const FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime); +BOOL WINAPI FileTimeToLocalFileTime(const FILETIME *lpFileTime, LPFILETIME lpLocalFileTime); +BOOL WINAPI LocalFileTimeToFileTime(const FILETIME *lpLocalFileTime, LPFILETIME lpFileTime); +BOOL WINAPI DosDateTimeToFileTime(WORD wFatDate, WORD wFatTime, LPFILETIME lpFileTime); +BOOL WINAPI FileTimeToDosDateTime(const FILETIME *lpFileTime, LPWORD lpFatDate, LPWORD lpFatTime); +DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation); } // namespace kernel32 diff --git a/dll/kernel32/winbase.cpp b/dll/kernel32/winbase.cpp index a459186..0dbeb81 100644 --- a/dll/kernel32/winbase.cpp +++ b/dll/kernel32/winbase.cpp @@ -333,7 +333,7 @@ void ensureDefaultActivationContext() { namespace kernel32 { -ATOM WIN_FUNC AddAtomA(LPCSTR lpString) { +ATOM WINAPI AddAtomA(LPCSTR lpString) { HOST_CONTEXT_GUARD(); ATOM atom = 0; if (tryHandleIntegerAtomPointer(lpString, atom)) { @@ -356,7 +356,7 @@ ATOM WIN_FUNC AddAtomA(LPCSTR lpString) { return result; } -ATOM WIN_FUNC AddAtomW(LPCWSTR lpString) { +ATOM WINAPI AddAtomW(LPCWSTR lpString) { HOST_CONTEXT_GUARD(); ATOM atom = 0; if (tryHandleIntegerAtomPointer(lpString, atom)) { @@ -381,7 +381,7 @@ ATOM WIN_FUNC AddAtomW(LPCWSTR lpString) { return result; } -ATOM WIN_FUNC FindAtomA(LPCSTR lpString) { +ATOM WINAPI FindAtomA(LPCSTR lpString) { HOST_CONTEXT_GUARD(); ATOM atom = 0; if (tryHandleIntegerAtomPointer(lpString, atom)) { @@ -404,7 +404,7 @@ ATOM WIN_FUNC FindAtomA(LPCSTR lpString) { return result; } -ATOM WIN_FUNC FindAtomW(LPCWSTR lpString) { +ATOM WINAPI FindAtomW(LPCWSTR lpString) { HOST_CONTEXT_GUARD(); ATOM atom = 0; if (tryHandleIntegerAtomPointer(lpString, atom)) { @@ -429,7 +429,7 @@ ATOM WIN_FUNC FindAtomW(LPCWSTR lpString) { return result; } -UINT WIN_FUNC GetAtomNameA(ATOM nAtom, LPSTR lpBuffer, int nSize) { +UINT WINAPI GetAtomNameA(ATOM nAtom, LPSTR lpBuffer, int nSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetAtomNameA(%u, %p, %d)\n", nAtom, lpBuffer, nSize); if (!lpBuffer || nSize <= 0) { @@ -461,7 +461,7 @@ UINT WIN_FUNC GetAtomNameA(ATOM nAtom, LPSTR lpBuffer, int nSize) { return written; } -UINT WIN_FUNC GetAtomNameW(ATOM nAtom, LPWSTR lpBuffer, int nSize) { +UINT WINAPI GetAtomNameW(ATOM nAtom, LPWSTR lpBuffer, int nSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetAtomNameW(%u, %p, %d)\n", nAtom, lpBuffer, nSize); if (!lpBuffer || nSize <= 0) { @@ -497,15 +497,15 @@ UINT WIN_FUNC GetAtomNameW(ATOM nAtom, LPWSTR lpBuffer, int nSize) { return written; } -UINT WIN_FUNC SetHandleCount(UINT uNumber) { +UINT WINAPI SetHandleCount(UINT uNumber) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetHandleCount(%u)\n", uNumber); (void)uNumber; return 0x3FFE; } -DWORD WIN_FUNC FormatMessageA(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer, - DWORD nSize, va_list *Arguments) { +DWORD WINAPI FormatMessageA(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer, + DWORD nSize, va_list *Arguments) { HOST_CONTEXT_GUARD(); DEBUG_LOG("FormatMessageA(%u, %p, %u, %u, %p, %u, %p)\n", dwFlags, lpSource, dwMessageId, dwLanguageId, lpBuffer, nSize, Arguments); @@ -549,19 +549,19 @@ DWORD WIN_FUNC FormatMessageA(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId return 0; } -PVOID WIN_FUNC EncodePointer(PVOID Ptr) { +PVOID WINAPI EncodePointer(PVOID Ptr) { HOST_CONTEXT_GUARD(); DEBUG_LOG("EncodePointer(%p)\n", Ptr); return Ptr; } -PVOID WIN_FUNC DecodePointer(PVOID Ptr) { +PVOID WINAPI DecodePointer(PVOID Ptr) { HOST_CONTEXT_GUARD(); DEBUG_LOG("DecodePointer(%p)\n", Ptr); return Ptr; } -BOOL WIN_FUNC SetDllDirectoryA(LPCSTR lpPathName) { +BOOL WINAPI SetDllDirectoryA(LPCSTR lpPathName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetDllDirectoryA(%s)\n", lpPathName); if (!lpPathName || lpPathName[0] == '\0') { @@ -579,8 +579,8 @@ BOOL WIN_FUNC SetDllDirectoryA(LPCSTR lpPathName) { return TRUE; } -BOOL WIN_FUNC FindActCtxSectionStringA(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId, - LPCSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData) { +BOOL WINAPI FindActCtxSectionStringA(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId, + LPCSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData) { DEBUG_LOG("FindActCtxSectionStringA(%#x, %p, %u, %s, %p)\n", dwFlags, lpExtensionGuid, ulSectionId, lpStringToFind ? lpStringToFind : "", ReturnedData); std::vector wideStorage; @@ -596,8 +596,8 @@ BOOL WIN_FUNC FindActCtxSectionStringA(DWORD dwFlags, const GUID *lpExtensionGui ReturnedData); } -BOOL WIN_FUNC FindActCtxSectionStringW(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId, - LPCWSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData) { +BOOL WINAPI FindActCtxSectionStringW(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId, + LPCWSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData) { std::string lookup = lpStringToFind ? wideStringToString(lpStringToFind) : std::string(); DEBUG_LOG("FindActCtxSectionStringW(%#x, %p, %u, %s, %p)\n", dwFlags, lpExtensionGuid, ulSectionId, lookup.c_str(), ReturnedData); @@ -682,7 +682,7 @@ void tryMarkExecutable(void *mem) { mprotect(reinterpret_cast(alignedStart), length, PROT_READ | PROT_WRITE | PROT_EXEC); } -BOOL WIN_FUNC IsBadReadPtr(LPCVOID lp, UINT_PTR ucb) { +BOOL WINAPI IsBadReadPtr(LPCVOID lp, UINT_PTR ucb) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: IsBadReadPtr(ptr=%p, size=%zu)\n", lp, static_cast(ucb)); if (!lp) { @@ -691,7 +691,7 @@ BOOL WIN_FUNC IsBadReadPtr(LPCVOID lp, UINT_PTR ucb) { return FALSE; } -BOOL WIN_FUNC IsBadWritePtr(LPVOID lp, UINT_PTR ucb) { +BOOL WINAPI IsBadWritePtr(LPVOID lp, UINT_PTR ucb) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: IsBadWritePtr(ptr=%p, size=%zu)\n", lp, static_cast(ucb)); if (!lp && ucb != 0) { @@ -700,7 +700,7 @@ BOOL WIN_FUNC IsBadWritePtr(LPVOID lp, UINT_PTR ucb) { return FALSE; } -BOOL WIN_FUNC GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize) { +BOOL WINAPI GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetComputerNameA(%p, %p)\n", lpBuffer, nSize); if (!nSize || !lpBuffer) { @@ -722,7 +722,7 @@ BOOL WIN_FUNC GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize) { return TRUE; } -BOOL WIN_FUNC GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize) { +BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetComputerNameW(%p, %p)\n", lpBuffer, nSize); if (!nSize || !lpBuffer) { @@ -744,7 +744,7 @@ BOOL WIN_FUNC GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize) { return TRUE; } -HGLOBAL WIN_FUNC GlobalAlloc(UINT uFlags, SIZE_T dwBytes) { +HGLOBAL WINAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("GlobalAlloc(%x, %zu)\n", uFlags, static_cast(dwBytes)); if (uFlags & GMEM_MOVEABLE) { @@ -756,14 +756,14 @@ HGLOBAL WIN_FUNC GlobalAlloc(UINT uFlags, SIZE_T dwBytes) { return doAlloc(static_cast(dwBytes), zero); } -HGLOBAL WIN_FUNC GlobalFree(HGLOBAL hMem) { +HGLOBAL WINAPI GlobalFree(HGLOBAL hMem) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("GlobalFree(%p)\n", hMem); std::free(hMem); return nullptr; } -HGLOBAL WIN_FUNC GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags) { +HGLOBAL WINAPI GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("GlobalReAlloc(%p, %zu, %x)\n", hMem, static_cast(dwBytes), uFlags); if (uFlags & GMEM_MODIFY) { @@ -774,14 +774,14 @@ HGLOBAL WIN_FUNC GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags) { return doRealloc(hMem, static_cast(dwBytes), zero); } -UINT WIN_FUNC GlobalFlags(HGLOBAL hMem) { +UINT WINAPI GlobalFlags(HGLOBAL hMem) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("GlobalFlags(%p)\n", hMem); (void)hMem; return 0; } -HLOCAL WIN_FUNC LocalAlloc(UINT uFlags, SIZE_T uBytes) { +HLOCAL WINAPI LocalAlloc(UINT uFlags, SIZE_T uBytes) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("LocalAlloc(%x, %zu)\n", uFlags, static_cast(uBytes)); bool zero = (uFlags & LMEM_ZEROINIT) != 0; @@ -799,7 +799,7 @@ HLOCAL WIN_FUNC LocalAlloc(UINT uFlags, SIZE_T uBytes) { return result; } -HLOCAL WIN_FUNC LocalFree(HLOCAL hMem) { +HLOCAL WINAPI LocalFree(HLOCAL hMem) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("LocalFree(%p)\n", hMem); // Windows returns NULL on success. @@ -807,7 +807,7 @@ HLOCAL WIN_FUNC LocalFree(HLOCAL hMem) { return nullptr; } -HLOCAL WIN_FUNC LocalReAlloc(HLOCAL hMem, SIZE_T uBytes, UINT uFlags) { +HLOCAL WINAPI LocalReAlloc(HLOCAL hMem, SIZE_T uBytes, UINT uFlags) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("LocalReAlloc(%p, %zu, %x)\n", hMem, static_cast(uBytes), uFlags); bool zero = (uFlags & LMEM_ZEROINIT) != 0; @@ -825,32 +825,32 @@ HLOCAL WIN_FUNC LocalReAlloc(HLOCAL hMem, SIZE_T uBytes, UINT uFlags) { return result; } -HLOCAL WIN_FUNC LocalHandle(LPCVOID pMem) { +HLOCAL WINAPI LocalHandle(LPCVOID pMem) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("LocalHandle(%p)\n", pMem); return const_cast(pMem); } -LPVOID WIN_FUNC LocalLock(HLOCAL hMem) { +LPVOID WINAPI LocalLock(HLOCAL hMem) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("LocalLock(%p)\n", hMem); return hMem; } -BOOL WIN_FUNC LocalUnlock(HLOCAL hMem) { +BOOL WINAPI LocalUnlock(HLOCAL hMem) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("LocalUnlock(%p)\n", hMem); (void)hMem; return TRUE; } -SIZE_T WIN_FUNC LocalSize(HLOCAL hMem) { +SIZE_T WINAPI LocalSize(HLOCAL hMem) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("LocalSize(%p)\n", hMem); return hMem ? mi_usable_size(hMem) : 0; } -UINT WIN_FUNC LocalFlags(HLOCAL hMem) { +UINT WINAPI LocalFlags(HLOCAL hMem) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("LocalFlags(%p)\n", hMem); (void)hMem; @@ -859,7 +859,7 @@ UINT WIN_FUNC LocalFlags(HLOCAL hMem) { static constexpr const char *kSystemDirectoryA = "C:\\Windows\\System32"; -UINT WIN_FUNC GetSystemDirectoryA(LPSTR lpBuffer, UINT uSize) { +UINT WINAPI GetSystemDirectoryA(LPSTR lpBuffer, UINT uSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetSystemDirectoryA(%p, %u)\n", lpBuffer, uSize); if (!lpBuffer) { @@ -874,7 +874,7 @@ UINT WIN_FUNC GetSystemDirectoryA(LPSTR lpBuffer, UINT uSize) { return static_cast(len); } -UINT WIN_FUNC GetSystemDirectoryW(LPWSTR lpBuffer, UINT uSize) { +UINT WINAPI GetSystemDirectoryW(LPWSTR lpBuffer, UINT uSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetSystemDirectoryW(%p, %u)\n", lpBuffer, uSize); if (!lpBuffer) { @@ -890,7 +890,7 @@ UINT WIN_FUNC GetSystemDirectoryW(LPWSTR lpBuffer, UINT uSize) { return length; } -UINT WIN_FUNC GetSystemWow64DirectoryA(LPSTR lpBuffer, UINT uSize) { +UINT WINAPI GetSystemWow64DirectoryA(LPSTR lpBuffer, UINT uSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetSystemWow64DirectoryA(%p, %u)\n", lpBuffer, uSize); (void)lpBuffer; @@ -899,7 +899,7 @@ UINT WIN_FUNC GetSystemWow64DirectoryA(LPSTR lpBuffer, UINT uSize) { return 0; } -UINT WIN_FUNC GetSystemWow64DirectoryW(LPWSTR lpBuffer, UINT uSize) { +UINT WINAPI GetSystemWow64DirectoryW(LPWSTR lpBuffer, UINT uSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetSystemWow64DirectoryW(%p, %u)\n", lpBuffer, uSize); (void)lpBuffer; @@ -908,7 +908,7 @@ UINT WIN_FUNC GetSystemWow64DirectoryW(LPWSTR lpBuffer, UINT uSize) { return 0; } -UINT WIN_FUNC GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize) { +UINT WINAPI GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetWindowsDirectoryA(%p, %u)\n", lpBuffer, uSize); if (!lpBuffer) { @@ -924,12 +924,12 @@ UINT WIN_FUNC GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize) { return static_cast(len); } -UINT WIN_FUNC GetSystemWindowsDirectoryA(LPSTR lpBuffer, UINT uSize) { +UINT WINAPI GetSystemWindowsDirectoryA(LPSTR lpBuffer, UINT uSize) { DEBUG_LOG("GetSystemWindowsDirectoryA(%p, %u)\n", lpBuffer, uSize); return GetWindowsDirectoryA(lpBuffer, uSize); } -UINT WIN_FUNC GetSystemWindowsDirectoryW(LPWSTR lpBuffer, UINT uSize) { +UINT WINAPI GetSystemWindowsDirectoryW(LPWSTR lpBuffer, UINT uSize) { DEBUG_LOG("GetSystemWindowsDirectoryW(%p, %u)\n", lpBuffer, uSize); if (!lpBuffer) { return 0; @@ -945,7 +945,7 @@ UINT WIN_FUNC GetSystemWindowsDirectoryW(LPWSTR lpBuffer, UINT uSize) { return length; } -DWORD WIN_FUNC GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer) { +DWORD WINAPI GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetCurrentDirectoryA(%u, %p)\n", nBufferLength, lpBuffer); @@ -970,7 +970,7 @@ DWORD WIN_FUNC GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer) { return required - 1; } -DWORD WIN_FUNC GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer) { +DWORD WINAPI GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetCurrentDirectoryW(%u, %p)\n", nBufferLength, lpBuffer); @@ -995,7 +995,7 @@ DWORD WIN_FUNC GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer) { return required - 1; } -int WIN_FUNC SetCurrentDirectoryA(LPCSTR lpPathName) { +int WINAPI SetCurrentDirectoryA(LPCSTR lpPathName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetCurrentDirectoryA(%s)\n", lpPathName ? lpPathName : "(null)"); if (!lpPathName) { @@ -1012,7 +1012,7 @@ int WIN_FUNC SetCurrentDirectoryA(LPCSTR lpPathName) { return 1; } -int WIN_FUNC SetCurrentDirectoryW(LPCWSTR lpPathName) { +int WINAPI SetCurrentDirectoryW(LPCWSTR lpPathName) { HOST_CONTEXT_GUARD(); DEBUG_LOG("SetCurrentDirectoryW\n"); if (!lpPathName) { @@ -1023,7 +1023,7 @@ int WIN_FUNC SetCurrentDirectoryW(LPCWSTR lpPathName) { return SetCurrentDirectoryA(path.c_str()); } -DWORD WIN_FUNC GetLongPathNameA(LPCSTR lpszShortPath, LPSTR lpszLongPath, DWORD cchBuffer) { +DWORD WINAPI GetLongPathNameA(LPCSTR lpszShortPath, LPSTR lpszLongPath, DWORD cchBuffer) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetLongPathNameA(%s, %p, %u)\n", lpszShortPath ? lpszShortPath : "(null)", lpszLongPath, cchBuffer); if (!lpszShortPath) { @@ -1053,7 +1053,7 @@ DWORD WIN_FUNC GetLongPathNameA(LPCSTR lpszShortPath, LPSTR lpszLongPath, DWORD return required - 1; } -DWORD WIN_FUNC GetLongPathNameW(LPCWSTR lpszShortPath, LPWSTR lpszLongPath, DWORD cchBuffer) { +DWORD WINAPI GetLongPathNameW(LPCWSTR lpszShortPath, LPWSTR lpszLongPath, DWORD cchBuffer) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetLongPathNameW(%p, %p, %u)\n", lpszShortPath, lpszLongPath, cchBuffer); if (!lpszShortPath) { @@ -1082,8 +1082,8 @@ DWORD WIN_FUNC GetLongPathNameW(LPCWSTR lpszShortPath, LPWSTR lpszLongPath, DWOR return required - 1; } -BOOL WIN_FUNC GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, - LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) { +BOOL WINAPI GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, + LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetDiskFreeSpaceA(%s)\n", lpRootPathName ? lpRootPathName : "(null)"); struct statvfs buf{}; @@ -1133,16 +1133,16 @@ BOOL WIN_FUNC GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerClust return TRUE; } -BOOL WIN_FUNC GetDiskFreeSpaceW(LPCWSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, - LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) { +BOOL WINAPI GetDiskFreeSpaceW(LPCWSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, + LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) { HOST_CONTEXT_GUARD(); std::string rootPath = wideStringToString(lpRootPathName); return GetDiskFreeSpaceA(lpRootPathName ? rootPath.c_str() : nullptr, lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters); } -BOOL WIN_FUNC GetDiskFreeSpaceExA(LPCSTR lpDirectoryName, uint64_t *lpFreeBytesAvailableToCaller, - uint64_t *lpTotalNumberOfBytes, uint64_t *lpTotalNumberOfFreeBytes) { +BOOL WINAPI GetDiskFreeSpaceExA(LPCSTR lpDirectoryName, uint64_t *lpFreeBytesAvailableToCaller, + uint64_t *lpTotalNumberOfBytes, uint64_t *lpTotalNumberOfFreeBytes) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetDiskFreeSpaceExA(%s)\n", lpDirectoryName ? lpDirectoryName : "(null)"); struct statvfs buf{}; @@ -1176,8 +1176,8 @@ BOOL WIN_FUNC GetDiskFreeSpaceExA(LPCSTR lpDirectoryName, uint64_t *lpFreeBytesA return TRUE; } -BOOL WIN_FUNC GetDiskFreeSpaceExW(LPCWSTR lpDirectoryName, uint64_t *lpFreeBytesAvailableToCaller, - uint64_t *lpTotalNumberOfBytes, uint64_t *lpTotalNumberOfFreeBytes) { +BOOL WINAPI GetDiskFreeSpaceExW(LPCWSTR lpDirectoryName, uint64_t *lpFreeBytesAvailableToCaller, + uint64_t *lpTotalNumberOfBytes, uint64_t *lpTotalNumberOfFreeBytes) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetDiskFreeSpaceExW -> "); std::string directoryName = wideStringToString(lpDirectoryName); diff --git a/dll/kernel32/winbase.h b/dll/kernel32/winbase.h index 81abf6a..4f2af22 100644 --- a/dll/kernel32/winbase.h +++ b/dll/kernel32/winbase.h @@ -1,8 +1,6 @@ #pragma once -#include "common.h" - -#include +#include "types.h" struct GUID; @@ -61,63 +59,63 @@ struct ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION_PATH_SEGMENT { namespace kernel32 { -BOOL WIN_FUNC IsBadReadPtr(LPCVOID lp, UINT_PTR ucb); -BOOL WIN_FUNC IsBadWritePtr(LPVOID lp, UINT_PTR ucb); -ATOM WIN_FUNC FindAtomA(LPCSTR lpString); -ATOM WIN_FUNC FindAtomW(LPCWSTR lpString); -ATOM WIN_FUNC AddAtomA(LPCSTR lpString); -ATOM WIN_FUNC AddAtomW(LPCWSTR lpString); -UINT WIN_FUNC GetAtomNameA(ATOM nAtom, LPSTR lpBuffer, int nSize); -UINT WIN_FUNC GetAtomNameW(ATOM nAtom, LPWSTR lpBuffer, int nSize); -UINT WIN_FUNC SetHandleCount(UINT uNumber); -DWORD WIN_FUNC FormatMessageA(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer, - DWORD nSize, va_list *Arguments); -PVOID WIN_FUNC EncodePointer(PVOID Ptr); -PVOID WIN_FUNC DecodePointer(PVOID Ptr); -BOOL WIN_FUNC SetDllDirectoryA(LPCSTR lpPathName); +BOOL WINAPI IsBadReadPtr(LPCVOID lp, UINT_PTR ucb); +BOOL WINAPI IsBadWritePtr(LPVOID lp, UINT_PTR ucb); +ATOM WINAPI FindAtomA(LPCSTR lpString); +ATOM WINAPI FindAtomW(LPCWSTR lpString); +ATOM WINAPI AddAtomA(LPCSTR lpString); +ATOM WINAPI AddAtomW(LPCWSTR lpString); +UINT WINAPI GetAtomNameA(ATOM nAtom, LPSTR lpBuffer, int nSize); +UINT WINAPI GetAtomNameW(ATOM nAtom, LPWSTR lpBuffer, int nSize); +UINT WINAPI SetHandleCount(UINT uNumber); +DWORD WINAPI FormatMessageA(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer, + DWORD nSize, va_list *Arguments); +PVOID WINAPI EncodePointer(PVOID Ptr); +PVOID WINAPI DecodePointer(PVOID Ptr); +BOOL WINAPI SetDllDirectoryA(LPCSTR lpPathName); -BOOL WIN_FUNC FindActCtxSectionStringA(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId, - LPCSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData); -BOOL WIN_FUNC FindActCtxSectionStringW(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId, - LPCWSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData); +BOOL WINAPI FindActCtxSectionStringA(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId, + LPCSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData); +BOOL WINAPI FindActCtxSectionStringW(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId, + LPCWSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData); -BOOL WIN_FUNC GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize); -BOOL WIN_FUNC GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize); +BOOL WINAPI GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize); +BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize); -HGLOBAL WIN_FUNC GlobalAlloc(UINT uFlags, SIZE_T dwBytes); -HGLOBAL WIN_FUNC GlobalFree(HGLOBAL hMem); -HGLOBAL WIN_FUNC GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags); -UINT WIN_FUNC GlobalFlags(HGLOBAL hMem); +HGLOBAL WINAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes); +HGLOBAL WINAPI GlobalFree(HGLOBAL hMem); +HGLOBAL WINAPI GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags); +UINT WINAPI GlobalFlags(HGLOBAL hMem); -HLOCAL WIN_FUNC LocalAlloc(UINT uFlags, SIZE_T uBytes); -HLOCAL WIN_FUNC LocalFree(HLOCAL hMem); -HLOCAL WIN_FUNC LocalReAlloc(HLOCAL hMem, SIZE_T uBytes, UINT uFlags); -HLOCAL WIN_FUNC LocalHandle(LPCVOID pMem); -LPVOID WIN_FUNC LocalLock(HLOCAL hMem); -BOOL WIN_FUNC LocalUnlock(HLOCAL hMem); -SIZE_T WIN_FUNC LocalSize(HLOCAL hMem); -UINT WIN_FUNC LocalFlags(HLOCAL hMem); +HLOCAL WINAPI LocalAlloc(UINT uFlags, SIZE_T uBytes); +HLOCAL WINAPI LocalFree(HLOCAL hMem); +HLOCAL WINAPI LocalReAlloc(HLOCAL hMem, SIZE_T uBytes, UINT uFlags); +HLOCAL WINAPI LocalHandle(LPCVOID pMem); +LPVOID WINAPI LocalLock(HLOCAL hMem); +BOOL WINAPI LocalUnlock(HLOCAL hMem); +SIZE_T WINAPI LocalSize(HLOCAL hMem); +UINT WINAPI LocalFlags(HLOCAL hMem); -UINT WIN_FUNC GetSystemDirectoryA(LPSTR lpBuffer, UINT uSize); -UINT WIN_FUNC GetSystemDirectoryW(LPWSTR lpBuffer, UINT uSize); -UINT WIN_FUNC GetSystemWow64DirectoryA(LPSTR lpBuffer, UINT uSize); -UINT WIN_FUNC GetSystemWow64DirectoryW(LPWSTR lpBuffer, UINT uSize); -UINT WIN_FUNC GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize); -UINT WIN_FUNC GetSystemWindowsDirectoryA(LPSTR lpBuffer, UINT uSize); -UINT WIN_FUNC GetSystemWindowsDirectoryW(LPWSTR lpBuffer, UINT uSize); -DWORD WIN_FUNC GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer); -DWORD WIN_FUNC GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer); -int WIN_FUNC SetCurrentDirectoryA(LPCSTR lpPathName); -int WIN_FUNC SetCurrentDirectoryW(LPCWSTR lpPathName); -DWORD WIN_FUNC GetLongPathNameA(LPCSTR lpszShortPath, LPSTR lpszLongPath, DWORD cchBuffer); -DWORD WIN_FUNC GetLongPathNameW(LPCWSTR lpszShortPath, LPWSTR lpszLongPath, DWORD cchBuffer); -BOOL WIN_FUNC GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, - LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters); -BOOL WIN_FUNC GetDiskFreeSpaceW(LPCWSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, - LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters); -BOOL WIN_FUNC GetDiskFreeSpaceExA(LPCSTR lpDirectoryName, uint64_t *lpFreeBytesAvailableToCaller, - uint64_t *lpTotalNumberOfBytes, uint64_t *lpTotalNumberOfFreeBytes); -BOOL WIN_FUNC GetDiskFreeSpaceExW(LPCWSTR lpDirectoryName, uint64_t *lpFreeBytesAvailableToCaller, - uint64_t *lpTotalNumberOfBytes, uint64_t *lpTotalNumberOfFreeBytes); +UINT WINAPI GetSystemDirectoryA(LPSTR lpBuffer, UINT uSize); +UINT WINAPI GetSystemDirectoryW(LPWSTR lpBuffer, UINT uSize); +UINT WINAPI GetSystemWow64DirectoryA(LPSTR lpBuffer, UINT uSize); +UINT WINAPI GetSystemWow64DirectoryW(LPWSTR lpBuffer, UINT uSize); +UINT WINAPI GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize); +UINT WINAPI GetSystemWindowsDirectoryA(LPSTR lpBuffer, UINT uSize); +UINT WINAPI GetSystemWindowsDirectoryW(LPWSTR lpBuffer, UINT uSize); +DWORD WINAPI GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer); +DWORD WINAPI GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer); +int WINAPI SetCurrentDirectoryA(LPCSTR lpPathName); +int WINAPI SetCurrentDirectoryW(LPCWSTR lpPathName); +DWORD WINAPI GetLongPathNameA(LPCSTR lpszShortPath, LPSTR lpszLongPath, DWORD cchBuffer); +DWORD WINAPI GetLongPathNameW(LPCWSTR lpszShortPath, LPWSTR lpszLongPath, DWORD cchBuffer); +BOOL WINAPI GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, + LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters); +BOOL WINAPI GetDiskFreeSpaceW(LPCWSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, + LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters); +BOOL WINAPI GetDiskFreeSpaceExA(LPCSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailableToCaller, + PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes); +BOOL WINAPI GetDiskFreeSpaceExW(LPCWSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailableToCaller, + PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes); } // namespace kernel32 diff --git a/dll/kernel32/wincon.cpp b/dll/kernel32/wincon.cpp index a631485..a580014 100644 --- a/dll/kernel32/wincon.cpp +++ b/dll/kernel32/wincon.cpp @@ -8,7 +8,7 @@ namespace kernel32 { -BOOL WIN_FUNC GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode) { +BOOL WINAPI GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: GetConsoleMode(%p)\n", hConsoleHandle); if (lpMode) { @@ -17,7 +17,7 @@ BOOL WIN_FUNC GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode) { return TRUE; } -BOOL WIN_FUNC SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode) { +BOOL WINAPI SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: SetConsoleMode(%p, 0x%x)\n", hConsoleHandle, dwMode); (void)hConsoleHandle; @@ -25,19 +25,19 @@ BOOL WIN_FUNC SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode) { return TRUE; } -UINT WIN_FUNC GetConsoleCP() { +UINT WINAPI GetConsoleCP() { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: GetConsoleCP() -> 65001\n"); return 65001; // UTF-8 } -UINT WIN_FUNC GetConsoleOutputCP() { +UINT WINAPI GetConsoleOutputCP() { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: GetConsoleOutputCP() -> 65001\n"); return 65001; // UTF-8 } -BOOL WIN_FUNC SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add) { +BOOL WINAPI SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: SetConsoleCtrlHandler(%p, %u)\n", reinterpret_cast(HandlerRoutine), Add); (void)HandlerRoutine; @@ -45,7 +45,7 @@ BOOL WIN_FUNC SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add) { return TRUE; } -BOOL WIN_FUNC GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, CONSOLE_SCREEN_BUFFER_INFO *lpConsoleScreenBufferInfo) { +BOOL WINAPI GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, CONSOLE_SCREEN_BUFFER_INFO *lpConsoleScreenBufferInfo) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: GetConsoleScreenBufferInfo(%p, %p)\n", hConsoleOutput, lpConsoleScreenBufferInfo); (void)hConsoleOutput; @@ -61,7 +61,7 @@ BOOL WIN_FUNC GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, CONSOLE_SCREEN_B return TRUE; } -BOOL WIN_FUNC WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumberOfCharsToWrite, +BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved) { HOST_CONTEXT_GUARD(); DEBUG_LOG("WriteConsoleW(%p, %p, %u, %p, %p)\n", hConsoleOutput, lpBuffer, nNumberOfCharsToWrite, @@ -89,7 +89,7 @@ BOOL WIN_FUNC WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumb return FALSE; } -DWORD WIN_FUNC GetConsoleTitleA(LPSTR lpConsoleTitle, DWORD nSize) { +DWORD WINAPI GetConsoleTitleA(LPSTR lpConsoleTitle, DWORD nSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetConsoleTitleA(%p, %u)\n", lpConsoleTitle, nSize); if (lpConsoleTitle && nSize > 0) { @@ -99,7 +99,7 @@ DWORD WIN_FUNC GetConsoleTitleA(LPSTR lpConsoleTitle, DWORD nSize) { return 0; } -DWORD WIN_FUNC GetConsoleTitleW(LPWSTR lpConsoleTitle, DWORD nSize) { +DWORD WINAPI GetConsoleTitleW(LPWSTR lpConsoleTitle, DWORD nSize) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetConsoleTitleW(%p, %u)\n", lpConsoleTitle, nSize); if (lpConsoleTitle && nSize > 0) { @@ -109,7 +109,7 @@ DWORD WIN_FUNC GetConsoleTitleW(LPWSTR lpConsoleTitle, DWORD nSize) { return 0; } -BOOL WIN_FUNC PeekConsoleInputA(HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength, +BOOL WINAPI PeekConsoleInputA(HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength, LPDWORD lpNumberOfEventsRead) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: PeekConsoleInputA(%p, %p, %u)\n", hConsoleInput, lpBuffer, nLength); @@ -122,7 +122,7 @@ BOOL WIN_FUNC PeekConsoleInputA(HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DW return TRUE; } -BOOL WIN_FUNC ReadConsoleInputA(HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength, +BOOL WINAPI ReadConsoleInputA(HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength, LPDWORD lpNumberOfEventsRead) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: ReadConsoleInputA(%p, %p, %u)\n", hConsoleInput, lpBuffer, nLength); diff --git a/dll/kernel32/wincon.h b/dll/kernel32/wincon.h index b99a9c7..e716707 100644 --- a/dll/kernel32/wincon.h +++ b/dll/kernel32/wincon.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" struct COORD { SHORT X; @@ -28,19 +28,19 @@ using PHANDLER_ROUTINE = BOOL(WIN_FUNC *)(DWORD CtrlType); namespace kernel32 { -BOOL WIN_FUNC GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode); -BOOL WIN_FUNC SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode); -UINT WIN_FUNC GetConsoleCP(); -UINT WIN_FUNC GetConsoleOutputCP(); -BOOL WIN_FUNC SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add); -BOOL WIN_FUNC GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, CONSOLE_SCREEN_BUFFER_INFO *lpConsoleScreenBufferInfo); -BOOL WIN_FUNC WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumberOfCharsToWrite, +BOOL WINAPI GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode); +BOOL WINAPI SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode); +UINT WINAPI GetConsoleCP(); +UINT WINAPI GetConsoleOutputCP(); +BOOL WINAPI SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add); +BOOL WINAPI GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, CONSOLE_SCREEN_BUFFER_INFO *lpConsoleScreenBufferInfo); +BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved); -DWORD WIN_FUNC GetConsoleTitleA(LPSTR lpConsoleTitle, DWORD nSize); -DWORD WIN_FUNC GetConsoleTitleW(LPWSTR lpConsoleTitle, DWORD nSize); -BOOL WIN_FUNC PeekConsoleInputA(HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength, +DWORD WINAPI GetConsoleTitleA(LPSTR lpConsoleTitle, DWORD nSize); +DWORD WINAPI GetConsoleTitleW(LPWSTR lpConsoleTitle, DWORD nSize); +BOOL WINAPI PeekConsoleInputA(HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength, LPDWORD lpNumberOfEventsRead); -BOOL WIN_FUNC ReadConsoleInputA(HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength, +BOOL WINAPI ReadConsoleInputA(HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength, LPDWORD lpNumberOfEventsRead); } // namespace kernel32 diff --git a/dll/kernel32/winnls.cpp b/dll/kernel32/winnls.cpp index 520ff75..692e32b 100644 --- a/dll/kernel32/winnls.cpp +++ b/dll/kernel32/winnls.cpp @@ -83,25 +83,25 @@ std::string localeInfoString(int LCType) { namespace kernel32 { -UINT WIN_FUNC GetACP() { +UINT WINAPI GetACP() { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetACP() -> %u\n", 28591); return 28591; // Latin1 (ISO/IEC 8859-1) } -LANGID WIN_FUNC GetSystemDefaultLangID() { +LANGID WINAPI GetSystemDefaultLangID() { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: GetSystemDefaultLangID()\n"); return 0; } -LANGID WIN_FUNC GetUserDefaultUILanguage() { +LANGID WINAPI GetUserDefaultUILanguage() { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: GetUserDefaultUILanguage()\n"); return 0; } -BOOL WIN_FUNC GetCPInfo(UINT CodePage, LPCPINFO lpCPInfo) { +BOOL WINAPI GetCPInfo(UINT CodePage, LPCPINFO lpCPInfo) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetCPInfo(%u, %p)\n", CodePage, lpCPInfo); (void)CodePage; @@ -118,7 +118,7 @@ BOOL WIN_FUNC GetCPInfo(UINT CodePage, LPCPINFO lpCPInfo) { return TRUE; } -int WIN_FUNC CompareStringA(LCID Locale, DWORD dwCmpFlags, LPCSTR lpString1, int cchCount1, LPCSTR lpString2, +int WINAPI CompareStringA(LCID Locale, DWORD dwCmpFlags, LPCSTR lpString1, int cchCount1, LPCSTR lpString2, int cchCount2) { HOST_CONTEXT_GUARD(); DEBUG_LOG("CompareStringA(%u, %u, %s, %d, %s, %d)\n", Locale, dwCmpFlags, lpString1 ? lpString1 : "(null)", @@ -141,7 +141,7 @@ int WIN_FUNC CompareStringA(LCID Locale, DWORD dwCmpFlags, LPCSTR lpString1, int return compareStrings(str1, str2, dwCmpFlags); } -int WIN_FUNC CompareStringW(LCID Locale, DWORD dwCmpFlags, LPCWCH lpString1, int cchCount1, LPCWCH lpString2, +int WINAPI CompareStringW(LCID Locale, DWORD dwCmpFlags, LPCWCH lpString1, int cchCount1, LPCWCH lpString2, int cchCount2) { HOST_CONTEXT_GUARD(); DEBUG_LOG("CompareStringW(%u, %u, %p, %d, %p, %d)\n", Locale, dwCmpFlags, lpString1, cchCount1, lpString2, @@ -157,14 +157,14 @@ int WIN_FUNC CompareStringW(LCID Locale, DWORD dwCmpFlags, LPCWCH lpString1, int return compareStrings(str1, str2, dwCmpFlags); } -BOOL WIN_FUNC IsValidCodePage(UINT CodePage) { +BOOL WINAPI IsValidCodePage(UINT CodePage) { HOST_CONTEXT_GUARD(); DEBUG_LOG("IsValidCodePage(%u)\n", CodePage); (void)CodePage; return TRUE; } -BOOL WIN_FUNC IsValidLocale(LCID Locale, DWORD dwFlags) { +BOOL WINAPI IsValidLocale(LCID Locale, DWORD dwFlags) { HOST_CONTEXT_GUARD(); DEBUG_LOG("IsValidLocale(%u, 0x%x)\n", Locale, dwFlags); (void)Locale; @@ -175,7 +175,7 @@ BOOL WIN_FUNC IsValidLocale(LCID Locale, DWORD dwFlags) { return TRUE; } -int WIN_FUNC GetLocaleInfoA(LCID Locale, LCTYPE LCType, LPSTR lpLCData, int cchData) { +int WINAPI GetLocaleInfoA(LCID Locale, LCTYPE LCType, LPSTR lpLCData, int cchData) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetLocaleInfoA(%u, %u, %p, %d)\n", Locale, LCType, lpLCData, cchData); (void)Locale; @@ -199,7 +199,7 @@ int WIN_FUNC GetLocaleInfoA(LCID Locale, LCTYPE LCType, LPSTR lpLCData, int cchD return static_cast(required); } -int WIN_FUNC GetLocaleInfoW(LCID Locale, LCTYPE LCType, LPWSTR lpLCData, int cchData) { +int WINAPI GetLocaleInfoW(LCID Locale, LCTYPE LCType, LPWSTR lpLCData, int cchData) { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetLocaleInfoW(%u, %u, %p, %d)\n", Locale, LCType, lpLCData, cchData); (void)Locale; @@ -224,7 +224,7 @@ int WIN_FUNC GetLocaleInfoW(LCID Locale, LCTYPE LCType, LPWSTR lpLCData, int cch return static_cast(required); } -BOOL WIN_FUNC EnumSystemLocalesA(LOCALE_ENUMPROCA lpLocaleEnumProc, DWORD dwFlags) { +BOOL WINAPI EnumSystemLocalesA(LOCALE_ENUMPROCA lpLocaleEnumProc, DWORD dwFlags) { { HOST_CONTEXT_GUARD(); DEBUG_LOG("EnumSystemLocalesA(%p, 0x%x)\n", lpLocaleEnumProc, dwFlags); @@ -239,20 +239,20 @@ BOOL WIN_FUNC EnumSystemLocalesA(LOCALE_ENUMPROCA lpLocaleEnumProc, DWORD dwFlag return lpLocaleEnumProc(localeId); } -LCID WIN_FUNC GetUserDefaultLCID() { +LCID WINAPI GetUserDefaultLCID() { HOST_CONTEXT_GUARD(); DEBUG_LOG("GetUserDefaultLCID()\n"); return 0x0409; // en-US } -BOOL WIN_FUNC IsDBCSLeadByte(BYTE TestChar) { +BOOL WINAPI IsDBCSLeadByte(BYTE TestChar) { HOST_CONTEXT_GUARD(); DEBUG_LOG("IsDBCSLeadByte(%u)\n", TestChar); (void)TestChar; return FALSE; } -BOOL WIN_FUNC IsDBCSLeadByteEx(UINT CodePage, BYTE TestChar) { +BOOL WINAPI IsDBCSLeadByteEx(UINT CodePage, BYTE TestChar) { HOST_CONTEXT_GUARD(); DEBUG_LOG("IsDBCSLeadByteEx(%u, %u)\n", CodePage, TestChar); @@ -283,7 +283,7 @@ BOOL WIN_FUNC IsDBCSLeadByteEx(UINT CodePage, BYTE TestChar) { } } -int WIN_FUNC LCMapStringW(LCID Locale, DWORD dwMapFlags, LPCWCH lpSrcStr, int cchSrc, LPWSTR lpDestStr, int cchDest) { +int WINAPI LCMapStringW(LCID Locale, DWORD dwMapFlags, LPCWCH lpSrcStr, int cchSrc, LPWSTR lpDestStr, int cchDest) { HOST_CONTEXT_GUARD(); DEBUG_LOG("LCMapStringW(%u, 0x%x, %p, %d, %p, %d)\n", Locale, dwMapFlags, lpSrcStr, cchSrc, lpDestStr, cchDest); (void)Locale; @@ -330,7 +330,7 @@ int WIN_FUNC LCMapStringW(LCID Locale, DWORD dwMapFlags, LPCWCH lpSrcStr, int cc return static_cast(srcLen); } -int WIN_FUNC LCMapStringA(LCID Locale, DWORD dwMapFlags, LPCCH lpSrcStr, int cchSrc, LPSTR lpDestStr, int cchDest) { +int WINAPI LCMapStringA(LCID Locale, DWORD dwMapFlags, LPCCH lpSrcStr, int cchSrc, LPSTR lpDestStr, int cchDest) { HOST_CONTEXT_GUARD(); DEBUG_LOG("LCMapStringA(%u, 0x%x, %p, %d, %p, %d)\n", Locale, dwMapFlags, lpSrcStr, cchSrc, lpDestStr, cchDest); if (!lpSrcStr) { diff --git a/dll/kernel32/winnls.h b/dll/kernel32/winnls.h index 21369b5..4168591 100644 --- a/dll/kernel32/winnls.h +++ b/dll/kernel32/winnls.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" constexpr UINT MAX_DEFAULTCHAR = 2; constexpr UINT MAX_LEADBYTES = 12; @@ -16,23 +16,23 @@ using LOCALE_ENUMPROCA = BOOL(WIN_FUNC *)(LPSTR); namespace kernel32 { -UINT WIN_FUNC GetACP(); -LANGID WIN_FUNC GetSystemDefaultLangID(); -LANGID WIN_FUNC GetUserDefaultUILanguage(); -BOOL WIN_FUNC GetCPInfo(UINT CodePage, LPCPINFO lpCPInfo); -int WIN_FUNC CompareStringA(LCID Locale, DWORD dwCmpFlags, LPCSTR lpString1, int cchCount1, LPCSTR lpString2, +UINT WINAPI GetACP(); +LANGID WINAPI GetSystemDefaultLangID(); +LANGID WINAPI GetUserDefaultUILanguage(); +BOOL WINAPI GetCPInfo(UINT CodePage, LPCPINFO lpCPInfo); +int WINAPI CompareStringA(LCID Locale, DWORD dwCmpFlags, LPCSTR lpString1, int cchCount1, LPCSTR lpString2, int cchCount2); -int WIN_FUNC CompareStringW(LCID Locale, DWORD dwCmpFlags, LPCWCH lpString1, int cchCount1, LPCWCH lpString2, +int WINAPI CompareStringW(LCID Locale, DWORD dwCmpFlags, LPCWCH lpString1, int cchCount1, LPCWCH lpString2, int cchCount2); -BOOL WIN_FUNC IsValidCodePage(UINT CodePage); -BOOL WIN_FUNC IsValidLocale(LCID Locale, DWORD dwFlags); -int WIN_FUNC GetLocaleInfoA(LCID Locale, LCTYPE LCType, LPSTR lpLCData, int cchData); -int WIN_FUNC GetLocaleInfoW(LCID Locale, LCTYPE LCType, LPWSTR lpLCData, int cchData); -BOOL WIN_FUNC EnumSystemLocalesA(LOCALE_ENUMPROCA lpLocaleEnumProc, DWORD dwFlags); -LCID WIN_FUNC GetUserDefaultLCID(); -BOOL WIN_FUNC IsDBCSLeadByte(BYTE TestChar); -BOOL WIN_FUNC IsDBCSLeadByteEx(UINT CodePage, BYTE TestChar); -int WIN_FUNC LCMapStringW(LCID Locale, DWORD dwMapFlags, LPCWCH lpSrcStr, int cchSrc, LPWSTR lpDestStr, int cchDest); -int WIN_FUNC LCMapStringA(LCID Locale, DWORD dwMapFlags, LPCCH lpSrcStr, int cchSrc, LPSTR lpDestStr, int cchDest); +BOOL WINAPI IsValidCodePage(UINT CodePage); +BOOL WINAPI IsValidLocale(LCID Locale, DWORD dwFlags); +int WINAPI GetLocaleInfoA(LCID Locale, LCTYPE LCType, LPSTR lpLCData, int cchData); +int WINAPI GetLocaleInfoW(LCID Locale, LCTYPE LCType, LPWSTR lpLCData, int cchData); +BOOL WINAPI EnumSystemLocalesA(LOCALE_ENUMPROCA lpLocaleEnumProc, DWORD dwFlags); +LCID WINAPI GetUserDefaultLCID(); +BOOL WINAPI IsDBCSLeadByte(BYTE TestChar); +BOOL WINAPI IsDBCSLeadByteEx(UINT CodePage, BYTE TestChar); +int WINAPI LCMapStringW(LCID Locale, DWORD dwMapFlags, LPCWCH lpSrcStr, int cchSrc, LPWSTR lpDestStr, int cchDest); +int WINAPI LCMapStringA(LCID Locale, DWORD dwMapFlags, LPCCH lpSrcStr, int cchSrc, LPSTR lpDestStr, int cchDest); } // namespace kernel32 diff --git a/dll/kernel32/winnt.cpp b/dll/kernel32/winnt.cpp index 1ba1861..8b46fb0 100644 --- a/dll/kernel32/winnt.cpp +++ b/dll/kernel32/winnt.cpp @@ -5,7 +5,7 @@ namespace kernel32 { -void WIN_FUNC RtlUnwind(PVOID TargetFrame, PVOID TargetIp, PEXCEPTION_RECORD ExceptionRecord, PVOID ReturnValue) { +void WINAPI RtlUnwind(PVOID TargetFrame, PVOID TargetIp, PEXCEPTION_RECORD ExceptionRecord, PVOID ReturnValue) { HOST_CONTEXT_GUARD(); DEBUG_LOG("RtlUnwind(%p, %p, %p, %p)\n", TargetFrame, TargetIp, ExceptionRecord, ReturnValue); DEBUG_LOG("WARNING: Silently returning from RtlUnwind - exception handlers and clean up code may not be run\n"); diff --git a/dll/kernel32/winnt.h b/dll/kernel32/winnt.h index ac3786f..32bd605 100644 --- a/dll/kernel32/winnt.h +++ b/dll/kernel32/winnt.h @@ -1,10 +1,10 @@ #pragma once -#include "common.h" +#include "types.h" #include "errhandlingapi.h" namespace kernel32 { -void WIN_FUNC RtlUnwind(PVOID TargetFrame, PVOID TargetIp, PEXCEPTION_RECORD ExceptionRecord, PVOID ReturnValue); +void WINAPI RtlUnwind(PVOID TargetFrame, PVOID TargetIp, PEXCEPTION_RECORD ExceptionRecord, PVOID ReturnValue); } // namespace kernel32 diff --git a/dll/kernel32/wow64apiset.cpp b/dll/kernel32/wow64apiset.cpp index 8e8e875..f0f8f62 100644 --- a/dll/kernel32/wow64apiset.cpp +++ b/dll/kernel32/wow64apiset.cpp @@ -8,7 +8,7 @@ namespace kernel32 { -BOOL WIN_FUNC Wow64DisableWow64FsRedirection(PVOID *OldValue) { +BOOL WINAPI Wow64DisableWow64FsRedirection(PVOID *OldValue) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: Wow64DisableWow64FsRedirection(%p)\n", OldValue); if (OldValue) { @@ -17,14 +17,14 @@ BOOL WIN_FUNC Wow64DisableWow64FsRedirection(PVOID *OldValue) { return TRUE; } -BOOL WIN_FUNC Wow64RevertWow64FsRedirection(PVOID OldValue) { +BOOL WINAPI Wow64RevertWow64FsRedirection(PVOID OldValue) { HOST_CONTEXT_GUARD(); DEBUG_LOG("STUB: Wow64RevertWow64FsRedirection(%p)\n", OldValue); (void)OldValue; return TRUE; } -BOOL WIN_FUNC IsWow64Process(HANDLE hProcess, PBOOL Wow64Process) { +BOOL WINAPI IsWow64Process(HANDLE hProcess, PBOOL Wow64Process) { HOST_CONTEXT_GUARD(); DEBUG_LOG("IsWow64Process(%p, %p)\n", hProcess, Wow64Process); if (!Wow64Process) { diff --git a/dll/kernel32/wow64apiset.h b/dll/kernel32/wow64apiset.h index 23b72b1..4194db0 100644 --- a/dll/kernel32/wow64apiset.h +++ b/dll/kernel32/wow64apiset.h @@ -1,11 +1,11 @@ #pragma once -#include "common.h" +#include "types.h" namespace kernel32 { -BOOL WIN_FUNC Wow64DisableWow64FsRedirection(PVOID *OldValue); -BOOL WIN_FUNC Wow64RevertWow64FsRedirection(PVOID OldValue); -BOOL WIN_FUNC IsWow64Process(HANDLE hProcess, PBOOL Wow64Process); +BOOL WINAPI Wow64DisableWow64FsRedirection(PVOID *OldValue); +BOOL WINAPI Wow64RevertWow64FsRedirection(PVOID OldValue); +BOOL WINAPI IsWow64Process(HANDLE hProcess, PBOOL Wow64Process); } // namespace kernel32 diff --git a/dll/mscoree.cpp b/dll/mscoree.cpp index ffcfccf..15d7292 100644 --- a/dll/mscoree.cpp +++ b/dll/mscoree.cpp @@ -3,6 +3,8 @@ #include "kernel32/internal.h" #include "modules.h" +#include + namespace mscoree { void WIN_FUNC CorExitProcess(int exitCode) { diff --git a/dll/msvcrt.cpp b/dll/msvcrt.cpp index 78a9fb1..4ddbd4e 100644 --- a/dll/msvcrt.cpp +++ b/dll/msvcrt.cpp @@ -702,7 +702,7 @@ namespace msvcrt { void WIN_ENTRY _initterm(const _PVFV *ppfn, const _PVFV* end) { HOST_CONTEXT_GUARD(); DEBUG_LOG("_initterm(%p, %p)\n", ppfn, end); - TIB *tib = wibo::getThreadTibForHost(); + auto *tib = wibo::getThreadTibForHost(); for (; ppfn < end; ppfn++) { _PVFV func = *ppfn; if (func) { @@ -718,7 +718,7 @@ namespace msvcrt { int WIN_ENTRY _initterm_e(const _PIFV *ppfn, const _PIFV *end) { HOST_CONTEXT_GUARD(); DEBUG_LOG("_initterm_e(%p, %p)\n", ppfn, end); - TIB *tib = wibo::getThreadTibForHost(); + auto *tib = wibo::getThreadTibForHost(); for (; ppfn < end; ppfn++) { _PIFV func = *ppfn; if (func) { diff --git a/dll/ntdll.cpp b/dll/ntdll.cpp index 3fd79bc..6217fdf 100644 --- a/dll/ntdll.cpp +++ b/dll/ntdll.cpp @@ -10,6 +10,7 @@ #include "strutil.h" #include +#include #include #include #include diff --git a/dll/ole32.cpp b/dll/ole32.cpp index 174f054..1fc47ac 100644 --- a/dll/ole32.cpp +++ b/dll/ole32.cpp @@ -3,6 +3,8 @@ #include "errors.h" #include "modules.h" +#include + namespace { constexpr HRESULT E_INVALIDARG = static_cast(0x80070057); constexpr HRESULT CO_E_CLASSSTRING = static_cast(0x800401F3); diff --git a/dll/user32.cpp b/dll/user32.cpp index 0d1d939..30a17b5 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -5,6 +5,8 @@ #include "modules.h" #include "resources.h" +#include + namespace user32 { constexpr uint32_t RT_STRING_ID = 6; diff --git a/dll/vcruntime.cpp b/dll/vcruntime.cpp index 2e93c83..5e4292a 100644 --- a/dll/vcruntime.cpp +++ b/dll/vcruntime.cpp @@ -2,6 +2,8 @@ #include "context.h" #include "modules.h" +#include + namespace vcruntime { void *WIN_ENTRY memcpy(void *dest, const void *src, size_t count) { diff --git a/src/common.h b/src/common.h index b240af2..9c08ef2 100644 --- a/src/common.h +++ b/src/common.h @@ -1,27 +1,15 @@ #pragma once +#include "types.h" + #include -#include #include -#include -#include -#include #include #include #include #include #include -// On Windows, the incoming stack is aligned to a 4 byte boundary. -// force_align_arg_pointer will realign the stack to match GCC's 16 byte alignment. -#ifdef __clang__ -#define WIN_ENTRY __attribute__((cdecl, force_align_arg_pointer)) -#define WIN_FUNC __attribute__((stdcall, force_align_arg_pointer)) -#else -#define WIN_ENTRY __attribute__((ms_abi, cdecl, force_align_arg_pointer)) -#define WIN_FUNC __attribute__((ms_abi, stdcall, force_align_arg_pointer)) -#endif - #define DEBUG_LOG(...) \ do { \ if (wibo::debugEnabled) { \ @@ -34,368 +22,6 @@ #define VERBOSE_LOG(...) ((void)0) #endif -using HANDLE = void *; -using HMODULE = void *; -using HGLOBAL = HANDLE; -using HLOCAL = HANDLE; -using HRSRC = HANDLE; -using LPHANDLE = HANDLE *; -using PHANDLE = HANDLE *; -using HKL = HANDLE; -using PVOID = void *; -using LPVOID = void *; -using LPCVOID = const void *; -using FARPROC = void *; -using WORD = uint16_t; -using LPWORD = WORD *; -using LANGID = WORD; -using ATOM = uint16_t; -using DWORD = uint32_t; -using PDWORD = DWORD *; -using LPDWORD = DWORD *; -using LONG = int32_t; -using PLONG = LONG *; -using ULONG = uint32_t; -using PULONG = ULONG *; -struct GUID { - uint32_t Data1; - uint16_t Data2; - uint16_t Data3; - uint8_t Data4[8]; -}; -struct LUID { - DWORD LowPart; - LONG HighPart; -}; -using PLUID = LUID *; -using LPLUID = LUID *; -using LARGE_INTEGER = int64_t; -using PLARGE_INTEGER = LARGE_INTEGER *; -using ULONG_PTR = uintptr_t; -using UINT_PTR = uintptr_t; -using DWORD_PTR = ULONG_PTR; -using PDWORD_PTR = DWORD_PTR *; -using SHORT = int16_t; -using LPSTR = char *; -using LPCSTR = const char *; -using LPCCH = const char *; -using LPWSTR = uint16_t *; -using LPCWSTR = const uint16_t *; -using LPCWCH = const uint16_t *; -using WCHAR = uint16_t; -using LPCH = char *; -using LPWCH = uint16_t *; -using BOOL = int; -using PBOOL = BOOL *; -using LPBOOL = BOOL *; -using UCHAR = unsigned char; -using PUCHAR = UCHAR *; -using SIZE_T = size_t; -using PSIZE_T = SIZE_T *; -using BYTE = unsigned char; -using BOOLEAN = unsigned char; -using UINT = unsigned int; -using HKEY = void *; -using PHKEY = HKEY *; -using PSID = void *; -using REGSAM = DWORD; -using LSTATUS = LONG; -using LCID = DWORD; -using LCTYPE = DWORD; -using HWINSTA = HANDLE; -using HWND = HANDLE; -using PBYTE = BYTE *; - -constexpr BOOL TRUE = 1; -constexpr BOOL FALSE = 0; - -constexpr DWORD STILL_ACTIVE = 259; - -constexpr DWORD FILE_FLAG_BACKUP_SEMANTICS = 0x02000000; -constexpr DWORD FILE_FLAG_DELETE_ON_CLOSE = 0x04000000; -constexpr DWORD FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000; -constexpr DWORD FILE_FLAG_NO_BUFFERING = 0x20000000; -constexpr DWORD FILE_FLAG_OVERLAPPED = 0x40000000; -constexpr DWORD FILE_FLAG_WRITE_THROUGH = 0x80000000; - -constexpr DWORD STD_INPUT_HANDLE = ((DWORD)-10); -constexpr DWORD STD_OUTPUT_HANDLE = ((DWORD)-11); -constexpr DWORD STD_ERROR_HANDLE = ((DWORD)-12); - -constexpr DWORD FILE_READ_DATA = 0x00000001; -constexpr DWORD FILE_LIST_DIRECTORY = 0x00000001; -constexpr DWORD FILE_WRITE_DATA = 0x00000002; -constexpr DWORD FILE_ADD_FILE = 0x00000002; -constexpr DWORD FILE_APPEND_DATA = 0x00000004; -constexpr DWORD FILE_ADD_SUBDIRECTORY = 0x00000004; -constexpr DWORD FILE_CREATE_PIPE_INSTANCE = 0x00000004; -constexpr DWORD FILE_READ_EA = 0x00000008; -constexpr DWORD FILE_WRITE_EA = 0x00000010; -constexpr DWORD FILE_EXECUTE = 0x00000020; -constexpr DWORD FILE_TRAVERSE = 0x00000020; -constexpr DWORD FILE_DELETE_CHILD = 0x00000040; -constexpr DWORD FILE_READ_ATTRIBUTES = 0x00000080; -constexpr DWORD FILE_WRITE_ATTRIBUTES = 0x00000100; - -constexpr DWORD SYNCHRONIZE = 0x00100000; -constexpr DWORD DELETE = 0x00010000; -constexpr DWORD WRITE_DAC = 0x00040000; -constexpr DWORD WRITE_OWNER = 0x00080000; -constexpr DWORD ACCESS_SYSTEM_SECURITY = 0x01000000; - -constexpr DWORD STANDARD_RIGHTS_READ = 0x00020000; -constexpr DWORD STANDARD_RIGHTS_WRITE = 0x00020000; -constexpr DWORD STANDARD_RIGHTS_EXECUTE = 0x00020000; -constexpr DWORD STANDARD_RIGHTS_REQUIRED = 0x000f0000; -constexpr DWORD STANDARD_RIGHTS_ALL = 0x001f0000; - -constexpr DWORD FILE_GENERIC_READ = - STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE; -constexpr DWORD FILE_GENERIC_WRITE = - STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE; -constexpr DWORD FILE_GENERIC_EXECUTE = STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE; -constexpr DWORD FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF; - -constexpr DWORD EVENT_ALL_ACCESS = 0x1F0003; -constexpr DWORD MUTEX_ALL_ACCESS = 0x1F0001; -constexpr DWORD SEMAPHORE_ALL_ACCESS = 0x1F0003; - -constexpr DWORD GENERIC_READ = 0x80000000; -constexpr DWORD GENERIC_WRITE = 0x40000000; -constexpr DWORD GENERIC_EXECUTE = 0x20000000; -constexpr DWORD GENERIC_ALL = 0x10000000; - -// Page protection constants -constexpr DWORD PAGE_NOACCESS = 0x01; -constexpr DWORD PAGE_READONLY = 0x02; -constexpr DWORD PAGE_READWRITE = 0x04; -constexpr DWORD PAGE_WRITECOPY = 0x08; -constexpr DWORD PAGE_EXECUTE = 0x10; -constexpr DWORD PAGE_EXECUTE_READ = 0x20; -constexpr DWORD PAGE_EXECUTE_READWRITE = 0x40; -constexpr DWORD PAGE_EXECUTE_WRITECOPY = 0x80; -constexpr DWORD PAGE_GUARD = 0x100; -constexpr DWORD PAGE_NOCACHE = 0x200; -constexpr DWORD PAGE_WRITECOMBINE = 0x400; - -// Allocation type and memory state constants -constexpr DWORD MEM_COMMIT = 0x00001000; -constexpr DWORD MEM_RESERVE = 0x00002000; -constexpr DWORD MEM_DECOMMIT = 0x00004000; -constexpr DWORD MEM_RELEASE = 0x00008000; -constexpr DWORD MEM_FREE = 0x00010000; -constexpr DWORD MEM_PRIVATE = 0x00020000; -constexpr DWORD MEM_MAPPED = 0x00040000; -constexpr DWORD MEM_RESET = 0x00080000; -constexpr DWORD MEM_TOP_DOWN = 0x00100000; -constexpr DWORD MEM_WRITE_WATCH = 0x00200000; -constexpr DWORD MEM_PHYSICAL = 0x00400000; -constexpr DWORD MEM_RESET_UNDO = 0x01000000; -constexpr DWORD MEM_LARGE_PAGES = 0x20000000; -constexpr DWORD MEM_COALESCE_PLACEHOLDERS = 0x00000001; -constexpr DWORD MEM_PRESERVE_PLACEHOLDER = 0x00000002; -constexpr DWORD MEM_IMAGE = 0x01000000; - -// File mapping access flags -constexpr DWORD FILE_MAP_COPY = 0x00000001; -constexpr DWORD FILE_MAP_WRITE = 0x00000002; -constexpr DWORD FILE_MAP_READ = 0x00000004; -constexpr DWORD FILE_MAP_EXECUTE = 0x00000020; -constexpr DWORD FILE_MAP_ALL_ACCESS = 0x000f001f; - -// File share modes -constexpr DWORD FILE_SHARE_READ = 0x00000001; -constexpr DWORD FILE_SHARE_WRITE = 0x00000002; -constexpr DWORD FILE_SHARE_DELETE = 0x00000004; - -constexpr DWORD PIPE_ACCESS_INBOUND = 0x00000001; -constexpr DWORD PIPE_ACCESS_OUTBOUND = 0x00000002; -constexpr DWORD PIPE_ACCESS_DUPLEX = 0x00000003; - -constexpr DWORD PIPE_TYPE_BYTE = 0x00000000; -constexpr DWORD PIPE_TYPE_MESSAGE = 0x00000004; -constexpr DWORD PIPE_READMODE_BYTE = 0x00000000; -constexpr DWORD PIPE_READMODE_MESSAGE = 0x00000002; -constexpr DWORD PIPE_WAIT = 0x00000000; -constexpr DWORD PIPE_NOWAIT = 0x00000001; -constexpr DWORD PIPE_ACCEPT_REMOTE_CLIENTS = 0x00000000; -constexpr DWORD PIPE_REJECT_REMOTE_CLIENTS = 0x00000008; -constexpr DWORD PIPE_UNLIMITED_INSTANCES = 255; - -constexpr size_t kTlsSlotCount = 64; - -struct UNICODE_STRING { - unsigned short Length; - unsigned short MaximumLength; - uint16_t *Buffer; -}; - -struct RTL_USER_PROCESS_PARAMETERS { - char Reserved1[16]; - void *Reserved2[10]; - UNICODE_STRING ImagePathName; - UNICODE_STRING CommandLine; -}; - -struct PEB { - char Reserved1[2]; - char BeingDebugged; - char Reserved2[1]; - void *Reserved3[2]; - void *Ldr; - RTL_USER_PROCESS_PARAMETERS *ProcessParameters; - char Reserved4[104]; - void *Reserved5[52]; - void *PostProcessInitRoutine; - char Reserved6[128]; - void *Reserved7[1]; - unsigned int SessionId; -}; - -struct ClientId { - void *uniqueProcess; - void *uniqueThread; -}; - -struct ListEntry { - void *flink; - void *blink; -}; - -struct ActivationContextStack { - void *activeFrame; - ListEntry frameListCache; - uint32_t flags; - uint32_t nextCookieSequenceNumber; - uint32_t stackId; -}; - -struct GdiTebBatch { - uint32_t offset; - uint32_t hdc; - uint32_t buffer[310]; -}; - -struct TIB { - void *exceptionList; - void *stackBase; - void *stackLimit; - void *subSystemTib; - union { - void *fiberData; - uint32_t version; - } fiber; - void *arbitraryUserPointer; - TIB *self; - void *environmentPointer; - ClientId clientId; - void *activeRpcHandle; - void *threadLocalStoragePointer; - PEB *peb; - uint32_t lastErrorValue; - uint32_t countOfOwnedCriticalSections; - void *csrClientThread; - void *win32ThreadInfo; - uint32_t user32Reserved[26]; - uint32_t userReserved[5]; - void *wow32Reserved; - uint32_t currentLocale; - uint32_t fpSoftwareStatusRegister; - void *reservedForDebuggerInstrumentation[16]; - void *systemReserved1[26]; - uint8_t placeholderCompatibilityMode; - uint8_t placeholderHydrationAlwaysExplicit; - uint8_t placeholderReserved[10]; - uint32_t proxiedProcessId; - ActivationContextStack activationContextStack; - uint8_t workingOnBehalfOfTicket[8]; - int32_t exceptionCode; - ActivationContextStack *activationContextStackPointer; - uintptr_t instrumentationCallbackSp; - uintptr_t instrumentationCallbackPreviousPc; - uintptr_t instrumentationCallbackPreviousSp; - uint8_t instrumentationCallbackDisabled; - uint8_t spareBytes1[23]; - uint32_t txFsContext; - GdiTebBatch gdiTebBatch; - ClientId realClientId; - void *gdiCachedProcessHandle; - uint32_t gdiClientPID; - uint32_t gdiClientTID; - void *gdiThreadLocaleInfo; - uintptr_t win32ClientInfo[62]; - void *glDispatchTable[233]; - void *glReserved1[29]; - void *glReserved2; - void *glSectionInfo; - void *glSection; - void *glTable; - void *glCurrentRC; - void *glContext; - uint32_t lastStatusValue; - UNICODE_STRING staticUnicodeString; - WCHAR staticUnicodeBuffer[261]; - void *deallocationStack; - void *tlsSlots[kTlsSlotCount]; - ListEntry tlsLinks; - void *vdm; - void *reservedForNtRpc; - void *dbgSsReserved[2]; - uint32_t hardErrorMode; - void *instrumentation[9]; - GUID activityId; - void *subProcessTag; - void *perflibData; - void *etwTraceData; - void *winSockData; - uint32_t gdiBatchCount; - uint32_t idealProcessorValue; - uint32_t guaranteedStackBytes; - void *reservedForPerf; - void *reservedForOle; - uint32_t waitingOnLoaderLock; - void *savedPriorityState; - uintptr_t reservedForCodeCoverage; - void *threadPoolData; - void **tlsExpansionSlots; - uint32_t muiGeneration; - uint32_t isImpersonating; - void *nlsCache; - void *shimData; - uint32_t heapVirtualAffinity; - void *currentTransactionHandle; - void *activeFrame; - void *flsSlots; - void *preferredLanguages; - void *userPrefLanguages; - void *mergedPrefLanguages; - uint32_t muiImpersonation; - uint16_t crossTebFlags; - uint16_t sameTebFlags; - void *txnScopeEnterCallback; - void *txnScopeExitCallback; - void *txnScopeContext; - uint32_t lockCount; - long wowTebOffset; - void *resourceRetValue; - void *reservedForWdf; - uint64_t reservedForCrt; - GUID effectiveContainerId; - uint16_t hostFsSelector; - uint16_t hostGsSelector; - uint8_t hostSegmentsValid; - uint8_t padding[3]; -}; - -static_assert(offsetof(TIB, self) == 0x18, "Self pointer offset mismatch"); -static_assert(offsetof(TIB, threadLocalStoragePointer) == 0x2C, "TLS pointer offset mismatch"); -static_assert(offsetof(TIB, peb) == 0x30, "PEB pointer offset mismatch"); -static_assert(offsetof(TIB, lastErrorValue) == 0x34, "LastErrorValue offset mismatch"); -static_assert(offsetof(TIB, gdiTebBatch) == 0x1D4, "GdiTebBatch offset mismatch"); -static_assert(offsetof(TIB, deallocationStack) == 0xE0C, "DeallocationStack offset mismatch"); -static_assert(offsetof(TIB, tlsSlots) == 0xE10, "TLS slots offset mismatch"); -static_assert(sizeof(TIB) >= 0x1000, "TIB too small"); - namespace wibo { extern char **argv; @@ -410,12 +36,12 @@ extern uint16_t tibSelector; extern int tibEntryNumber; extern PEB *processPeb; -TIB *allocateTib(); -void destroyTib(TIB *tib); -void initializeTibStackInfo(TIB *tib); -bool installTibForCurrentThread(TIB *tib); -void setThreadTibForHost(TIB *tib); -TIB *getThreadTibForHost(); +TEB *allocateTib(); +void destroyTib(TEB *tib); +void initializeTibStackInfo(TEB *tib); +bool installTibForCurrentThread(TEB *tib); +void setThreadTibForHost(TEB *tib); +TEB *getThreadTibForHost(); void debug_log(const char *fmt, ...); diff --git a/src/context.cpp b/src/context.cpp index 58ea23f..8d7bf7a 100644 --- a/src/context.cpp +++ b/src/context.cpp @@ -4,18 +4,18 @@ namespace { -constexpr size_t kHostFsOffset = offsetof(TIB, hostFsSelector); -constexpr size_t kHostGsOffset = offsetof(TIB, hostGsSelector); -constexpr size_t kHostValidOffset = offsetof(TIB, hostSegmentsValid); -thread_local TIB *g_threadTibForHost = nullptr; +constexpr size_t kHostFsOffset = offsetof(TEB, hostFsSelector); +constexpr size_t kHostGsOffset = offsetof(TEB, hostGsSelector); +constexpr size_t kHostValidOffset = offsetof(TEB, hostSegmentsValid); +thread_local TEB *g_threadTibForHost = nullptr; } // namespace namespace wibo { -void setThreadTibForHost(TIB *tib) { g_threadTibForHost = tib; } +void setThreadTibForHost(TEB *tib) { g_threadTibForHost = tib; } -TIB *getThreadTibForHost() { return g_threadTibForHost; } +TEB *getThreadTibForHost() { return g_threadTibForHost; } HostContextGuard::HostContextGuard() : previousFs_(0), previousGs_(0), restore_(false) { asm volatile("mov %%fs, %0" : "=r"(previousFs_)); @@ -42,7 +42,7 @@ HostContextGuard::~HostContextGuard() { } } -GuestContextGuard::GuestContextGuard(TIB *tib) : previousFs_(0), previousGs_(0), applied_(false) { +GuestContextGuard::GuestContextGuard(TEB *tib) : previousFs_(0), previousGs_(0), applied_(false) { if (!tib || !wibo::tibSelector) { return; } diff --git a/src/context.h b/src/context.h index 2a5a9a2..8d35d97 100644 --- a/src/context.h +++ b/src/context.h @@ -19,7 +19,7 @@ class HostContextGuard { class GuestContextGuard { public: - explicit GuestContextGuard(TIB *tib); + explicit GuestContextGuard(TEB *tib); ~GuestContextGuard(); GuestContextGuard(const GuestContextGuard &) = delete; GuestContextGuard &operator=(const GuestContextGuard &) = delete; diff --git a/src/errors.cpp b/src/errors.cpp index 955bf98..b442612 100644 --- a/src/errors.cpp +++ b/src/errors.cpp @@ -1,6 +1,7 @@ - #include "errors.h" +#include "common.h" + #include namespace wibo { diff --git a/src/errors.h b/src/errors.h index ca34bd5..efda59e 100644 --- a/src/errors.h +++ b/src/errors.h @@ -1,6 +1,6 @@ #pragma once -#include "common.h" +#include "types.h" #define ERROR_SUCCESS 0 #define ERROR_FILE_NOT_FOUND 2 @@ -49,7 +49,6 @@ #define INVALID_SET_FILE_POINTER ((DWORD) - 1) #define INVALID_HANDLE_VALUE ((HANDLE) - 1) -typedef int NTSTATUS; #define STATUS_SUCCESS ((NTSTATUS)0x00000000) #define STATUS_INVALID_HANDLE ((NTSTATUS)0xC0000008) #define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000D) @@ -62,7 +61,6 @@ typedef int NTSTATUS; #define STATUS_UNEXPECTED_IO_ERROR ((NTSTATUS)0xC00000E9) #define STATUS_PIPE_BROKEN ((NTSTATUS)0xC000014B) -typedef int HRESULT; #define S_OK ((HRESULT)0x00000000) namespace wibo { diff --git a/src/main.cpp b/src/main.cpp index b4a9939..445a6e4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -51,18 +51,18 @@ void wibo::debug_log(const char *fmt, ...) { va_end(args); } -TIB *wibo::allocateTib() { - auto *newTib = static_cast(std::calloc(1, sizeof(TIB))); +TEB *wibo::allocateTib() { + auto *newTib = static_cast(std::calloc(1, sizeof(TEB))); if (!newTib) { return nullptr; } tls::initializeTib(newTib); - newTib->self = newTib; - newTib->peb = processPeb; + newTib->Tib.Self = &newTib->Tib; + newTib->Peb = processPeb; return newTib; } -void wibo::destroyTib(TIB *tibPtr) { +void wibo::destroyTib(TEB *tibPtr) { if (!tibPtr) { return; } @@ -70,7 +70,7 @@ void wibo::destroyTib(TIB *tibPtr) { std::free(tibPtr); } -void wibo::initializeTibStackInfo(TIB *tibPtr) { +void wibo::initializeTibStackInfo(TEB *tibPtr) { if (!tibPtr) { return; } @@ -82,16 +82,16 @@ void wibo::initializeTibStackInfo(TIB *tibPtr) { void *stackAddr = nullptr; size_t stackSize = 0; if (pthread_attr_getstack(&attr, &stackAddr, &stackSize) == 0 && stackAddr && stackSize > 0) { - tibPtr->stackLimit = stackAddr; - tibPtr->stackBase = static_cast(stackAddr) + stackSize; + tibPtr->Tib.StackLimit = stackAddr; + tibPtr->Tib.StackBase = static_cast(stackAddr) + stackSize; } else { perror("Failed to get thread stack info"); } - DEBUG_LOG("initializeTibStackInfo: stackBase=%p stackLimit=%p\n", tibPtr->stackBase, tibPtr->stackLimit); + DEBUG_LOG("initializeTibStackInfo: stackBase=%p stackLimit=%p\n", tibPtr->Tib.StackBase, tibPtr->Tib.StackLimit); pthread_attr_destroy(&attr); } -bool wibo::installTibForCurrentThread(TIB *tibPtr) { +bool wibo::installTibForCurrentThread(TEB *tibPtr) { if (!tibPtr) { return false; } @@ -99,7 +99,7 @@ bool wibo::installTibForCurrentThread(TIB *tibPtr) { std::memset(&desc, 0, sizeof(desc)); desc.entry_number = tibEntryNumber; desc.base_addr = reinterpret_cast(tibPtr); - desc.limit = static_cast(sizeof(TIB) - 1); + desc.limit = static_cast(sizeof(TEB) - 1); desc.seg_32bit = 1; desc.contents = 0; desc.read_exec_only = 0; @@ -121,7 +121,7 @@ bool wibo::installTibForCurrentThread(TIB *tibPtr) { } // Make this global to ease debugging -TIB tib; +TEB tib; const size_t MAPS_BUFFER_SIZE = 0x10000; @@ -453,11 +453,11 @@ int main(int argc, char **argv) { // Create TIB memset(&tib, 0, sizeof(tib)); wibo::tls::initializeTib(&tib); - tib.self = &tib; - tib.peb = static_cast(calloc(1, sizeof(PEB))); - tib.peb->ProcessParameters = + tib.Tib.Self = &tib.Tib; + tib.Peb = static_cast(calloc(1, sizeof(PEB))); + tib.Peb->ProcessParameters = static_cast(calloc(1, sizeof(RTL_USER_PROCESS_PARAMETERS))); - wibo::processPeb = tib.peb; + wibo::processPeb = tib.Peb; wibo::initializeTibStackInfo(&tib); if (!wibo::installTibForCurrentThread(&tib)) { fprintf(stderr, "Failed to install TIB for main thread\n"); diff --git a/src/modules.cpp b/src/modules.cpp index 6ec6fe4..a736a8e 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -275,7 +275,7 @@ uintptr_t resolveModuleAddress(const wibo::Executable &exec, uintptr_t address) return static_cast(static_cast(address) + exec.relocationDelta); } -bool allocateModuleTlsForThread(wibo::ModuleInfo &module, TIB *tib) { +bool allocateModuleTlsForThread(wibo::ModuleInfo &module, TEB *tib) { if (!tib) { return true; } @@ -314,7 +314,7 @@ bool allocateModuleTlsForThread(wibo::ModuleInfo &module, TIB *tib) { return true; } -void freeModuleTlsForThread(wibo::ModuleInfo &module, TIB *tib) { +void freeModuleTlsForThread(wibo::ModuleInfo &module, TEB *tib) { if (!tib) { return; } @@ -346,7 +346,7 @@ void runModuleTlsCallbacks(wibo::ModuleInfo &module, DWORD reason) { if (!module.tlsInfo.hasTls || module.tlsInfo.callbacks.empty()) { return; } - TIB *tib = wibo::getThreadTibForHost(); + TEB *tib = wibo::getThreadTibForHost(); if (!tib) { return; } @@ -590,7 +590,7 @@ BOOL callDllMain(wibo::ModuleInfo &info, DWORD reason, LPVOID reserved) { if (!wibo::tibSelector) { result = dllMain(reinterpret_cast(info.executable->imageBase), callReason, callReserved); } else { - TIB *tib = wibo::getThreadTibForHost(); + TEB *tib = wibo::getThreadTibForHost(); GUEST_CONTEXT_GUARD(tib); result = dllMain(reinterpret_cast(info.executable->imageBase), callReason, callReserved); } @@ -892,7 +892,7 @@ void addOnExitFunction(void *table, void (*func)()) { } void runPendingOnExit(ModuleInfo &info) { - TIB *tib = wibo::getThreadTibForHost(); + TEB *tib = wibo::getThreadTibForHost(); for (auto it = info.onExitFunctions.rbegin(); it != info.onExitFunctions.rend(); ++it) { auto fn = reinterpret_cast(*it); if (fn) { @@ -971,7 +971,7 @@ bool initializeModuleTls(ModuleInfo &module) { }; AllocContext ctx{&module, true}; wibo::tls::forEachTib( - [](TIB *tib, void *opaque) { + [](TEB *tib, void *opaque) { auto *context = static_cast(opaque); if (!context->success) { return; @@ -1068,7 +1068,7 @@ void notifyDllThreadAttach() { targets.push_back(info); } } - TIB *tib = wibo::getThreadTibForHost(); + TEB *tib = wibo::getThreadTibForHost(); for (wibo::ModuleInfo *info : targets) { if (info && info->tlsInfo.hasTls && tib) { if (!allocateModuleTlsForThread(*info, tib)) { @@ -1093,7 +1093,7 @@ void notifyDllThreadDetach() { targets.push_back(info); } } - TIB *tib = wibo::getThreadTibForHost(); + TEB *tib = wibo::getThreadTibForHost(); for (auto it = targets.rbegin(); it != targets.rend(); ++it) { if (*it && (*it)->tlsInfo.hasTls && tib) { runModuleTlsCallbacks(**it, TLS_THREAD_DETACH); diff --git a/src/modules.h b/src/modules.h index 4999dd1..4d9e1c0 100644 --- a/src/modules.h +++ b/src/modules.h @@ -74,7 +74,7 @@ struct ModuleTlsInfo { uint32_t characteristics = 0; size_t allocationSize = 0; std::vector callbacks; - std::unordered_map threadAllocations; + std::unordered_map threadAllocations; }; struct ModuleInfo { diff --git a/src/processes.cpp b/src/processes.cpp index 06c114e..29ea7ff 100644 --- a/src/processes.cpp +++ b/src/processes.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -262,7 +263,7 @@ static std::vector pathextValues() { static std::vector parseHostPath(const std::string &value) { std::vector paths; - const char *delims = strchr(value.c_str(), ';') ? ";" : ":"; + const char *delims = std::strchr(value.c_str(), ';') ? ";" : ":"; size_t start = 0; while (start <= value.size()) { size_t end = value.find_first_of(delims, start); @@ -411,7 +412,7 @@ static int spawnInternal(const std::vector &args, Pin ownedEnv; ownedEnv.reserve(256); for (char **e = environ; *e; ++e) { - if (strncmp(*e, "WIBO_DEBUG_INDENT=", 18) != 0) + if (std::strncmp(*e, "WIBO_DEBUG_INDENT=", 18) != 0) ownedEnv.emplace_back(*e); } ownedEnv.emplace_back("WIBO_DEBUG_INDENT=" + std::to_string(wibo::debugIndent + 1)); diff --git a/src/resources.h b/src/resources.h index 0efeee7..f0f3af5 100644 --- a/src/resources.h +++ b/src/resources.h @@ -5,7 +5,7 @@ namespace wibo { -struct Executable; +class Executable; struct ResourceIdentifier { ResourceIdentifier() : isString(false), id(0) {} diff --git a/src/strutil.cpp b/src/strutil.cpp index 843498a..b78849e 100644 --- a/src/strutil.cpp +++ b/src/strutil.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -223,7 +224,7 @@ std::vector stringToWideString(const char *src, size_t length) { if (!src) { return std::vector{0}; } - size_t len = length == static_cast(-1) ? strlen(src) : length; + size_t len = length == static_cast(-1) ? std::strlen(src) : length; std::vector res(len + 1); for (size_t i = 0; i < len; ++i) { res[i] = static_cast(static_cast(src[i])); diff --git a/src/tls.cpp b/src/tls.cpp index 292abd9..8aac0ef 100644 --- a/src/tls.cpp +++ b/src/tls.cpp @@ -15,7 +15,7 @@ constexpr size_t kMaxExpansionSlots = wibo::tls::kTlsMaxSlotCount - kTlsSlotCoun std::mutex g_tlsMutex; std::array g_slotUsed{}; -std::vector g_activeTibs; +std::vector g_activeTibs; size_t g_expansionCapacity = 0; struct TlsArray { @@ -23,8 +23,8 @@ struct TlsArray { void *slots[]; }; -std::unordered_map g_moduleArrays; -std::unordered_map> g_moduleGarbage; +std::unordered_map g_moduleArrays; +std::unordered_map> g_moduleGarbage; size_t g_moduleArrayCapacity = 0; TlsArray *allocateTlsArray(size_t capacity) { @@ -45,18 +45,18 @@ inline TlsArray *arrayFromSlots(void *slots) { : nullptr; } -TlsArray *getExpansionArray(TIB *tib) { +TlsArray *getExpansionArray(TEB *tib) { if (!tib) { return nullptr; } - return arrayFromSlots(tib->tlsExpansionSlots); + return arrayFromSlots(tib->TlsExpansionSlots); } -void setExpansionArray(TIB *tib, TlsArray *arr) { +void setExpansionArray(TEB *tib, TlsArray *arr) { if (!tib) { return; } - tib->tlsExpansionSlots = arr ? arr->slots : nullptr; + tib->TlsExpansionSlots = arr ? arr->slots : nullptr; } size_t chooseCapacity(size_t current, size_t required) { @@ -88,7 +88,7 @@ size_t chooseCapacity(size_t current, size_t required) { } struct PendingResize { - TIB *tib; + TEB *tib; TlsArray *oldArr; TlsArray *newArr; }; @@ -106,7 +106,7 @@ bool ensureGlobalExpansionCapacityLocked(size_t required) { } std::vector pending; pending.reserve(g_activeTibs.size()); - for (TIB *tib : g_activeTibs) { + for (TEB *tib : g_activeTibs) { auto *currArr = getExpansionArray(tib); size_t currentCapacity = currArr ? currArr->capacity : 0; if (currentCapacity >= target) { @@ -136,7 +136,7 @@ bool ensureGlobalExpansionCapacityLocked(size_t required) { return true; } -TlsArray *getModuleArray(TIB *tib) { +TlsArray *getModuleArray(TEB *tib) { if (!tib) { return nullptr; } @@ -144,14 +144,14 @@ TlsArray *getModuleArray(TIB *tib) { if (it != g_moduleArrays.end()) { return it->second; } - auto *array = arrayFromSlots(tib->threadLocalStoragePointer); + auto *array = arrayFromSlots(tib->ThreadLocalStoragePointer); if (array) { g_moduleArrays.emplace(tib, array); } return array; } -void queueOldModuleArray(TIB *tib, TlsArray *array) { +void queueOldModuleArray(TEB *tib, TlsArray *array) { if (!tib || !array) { return; } @@ -159,7 +159,7 @@ void queueOldModuleArray(TIB *tib, TlsArray *array) { } struct ModulePendingResize { - TIB *tib; + TEB *tib; TlsArray *oldArray; TlsArray *newArray; }; @@ -182,7 +182,7 @@ bool ensureModuleArrayCapacityLocked(size_t required) { } std::vector pending; pending.reserve(g_activeTibs.size()); - for (TIB *tib : g_activeTibs) { + for (TEB *tib : g_activeTibs) { auto *current = getModuleArray(tib); size_t currentCapacity = current ? current->capacity : 0; if (currentCapacity >= target) { @@ -202,7 +202,7 @@ bool ensureModuleArrayCapacityLocked(size_t required) { } for (auto &entry : pending) { g_moduleArrays[entry.tib] = entry.newArray; - entry.tib->threadLocalStoragePointer = entry.newArray->slots; + entry.tib->ThreadLocalStoragePointer = entry.newArray->slots; if (entry.oldArray) { queueOldModuleArray(entry.tib, entry.oldArray); } @@ -213,13 +213,13 @@ bool ensureModuleArrayCapacityLocked(size_t required) { void zeroSlotForAllTibs(size_t index) { if (index < kTlsSlotCount) { - for (TIB *tib : g_activeTibs) { - tib->tlsSlots[index] = nullptr; + for (TEB *tib : g_activeTibs) { + tib->TlsSlots[index] = nullptr; } return; } size_t expansionIndex = index - kTlsSlotCount; - for (TIB *tib : g_activeTibs) { + for (TEB *tib : g_activeTibs) { auto *arr = getExpansionArray(tib); if (!arr || expansionIndex >= arr->capacity) { continue; @@ -232,7 +232,7 @@ void zeroSlotForAllTibs(size_t index) { namespace wibo::tls { -void initializeTib(TIB *tib) { +void initializeTib(TEB *tib) { if (!tib) { return; } @@ -253,7 +253,7 @@ void initializeTib(TIB *tib) { } } -void cleanupTib(TIB *tib) { +void cleanupTib(TEB *tib) { if (!tib) { return; } @@ -272,7 +272,7 @@ void cleanupTib(TIB *tib) { } g_moduleGarbage.erase(garbageIt); } - tib->threadLocalStoragePointer = nullptr; + tib->ThreadLocalStoragePointer = nullptr; auto it = std::find(g_activeTibs.begin(), g_activeTibs.end(), tib); if (it != g_activeTibs.end()) { g_activeTibs.erase(it); @@ -316,12 +316,12 @@ bool isSlotAllocated(DWORD index) { return index < wibo::tls::kTlsMaxSlotCount && g_slotUsed[index]; } -void *getValue(TIB *tib, DWORD index) { +void *getValue(TEB *tib, DWORD index) { if (!tib || index >= static_cast(wibo::tls::kTlsMaxSlotCount)) { return nullptr; } if (index < static_cast(kTlsSlotCount)) { - return tib->tlsSlots[index]; + return tib->TlsSlots[index]; } std::lock_guard lock(g_tlsMutex); auto *arr = getExpansionArray(tib); @@ -335,12 +335,12 @@ void *getValue(TIB *tib, DWORD index) { return arr->slots[expansionIndex]; } -bool setValue(TIB *tib, DWORD index, void *value) { +bool setValue(TEB *tib, DWORD index, void *value) { if (!tib || index >= static_cast(wibo::tls::kTlsMaxSlotCount)) { return false; } if (index < static_cast(kTlsSlotCount)) { - tib->tlsSlots[index] = value; + tib->TlsSlots[index] = value; return true; } std::lock_guard lock(g_tlsMutex); @@ -361,16 +361,16 @@ void *getValue(DWORD index) { return getValue(getThreadTibForHost(), index); } bool setValue(DWORD index, void *value) { return setValue(getThreadTibForHost(), index, value); } -void forEachTib(void (*callback)(TIB *, void *), void *context) { +void forEachTib(void (*callback)(TEB *, void *), void *context) { if (!callback) { return; } - std::vector tibs; + std::vector tibs; { std::lock_guard lock(g_tlsMutex); tibs = g_activeTibs; } - for (TIB *tib : tibs) { + for (TEB *tib : tibs) { callback(tib, context); } } @@ -380,7 +380,7 @@ bool ensureModulePointerCapacity(size_t capacity) { return ensureModuleArrayCapacityLocked(capacity); } -bool setModulePointer(TIB *tib, size_t index, void *value) { +bool setModulePointer(TEB *tib, size_t index, void *value) { if (!tib) { return false; } @@ -393,11 +393,11 @@ bool setModulePointer(TIB *tib, size_t index, void *value) { return false; } array->slots[index] = value; - tib->threadLocalStoragePointer = array->slots; + tib->ThreadLocalStoragePointer = array->slots; return true; } -void clearModulePointer(TIB *tib, size_t index) { +void clearModulePointer(TEB *tib, size_t index) { if (!tib) { return; } diff --git a/src/tls.h b/src/tls.h index 98a7103..2b0479f 100644 --- a/src/tls.h +++ b/src/tls.h @@ -7,21 +7,21 @@ namespace wibo::tls { constexpr DWORD kInvalidTlsIndex = 0xFFFFFFFFu; constexpr size_t kTlsMaxSlotCount = 1088; -void initializeTib(TIB *tib); -void cleanupTib(TIB *tib); +void initializeTib(TEB *tib); +void cleanupTib(TEB *tib); -void forEachTib(void (*callback)(TIB *, void *), void *context); +void forEachTib(void (*callback)(TEB *, void *), void *context); bool ensureModulePointerCapacity(size_t capacity); -bool setModulePointer(TIB *tib, size_t index, void *value); -void clearModulePointer(TIB *tib, size_t index); +bool setModulePointer(TEB *tib, size_t index, void *value); +void clearModulePointer(TEB *tib, size_t index); DWORD reserveSlot(); bool releaseSlot(DWORD index); bool isSlotAllocated(DWORD index); -void *getValue(TIB *tib, DWORD index); -bool setValue(TIB *tib, DWORD index, void *value); +void *getValue(TEB *tib, DWORD index); +bool setValue(TEB *tib, DWORD index, void *value); void *getValue(DWORD index); bool setValue(DWORD index, void *value); diff --git a/src/types.h b/src/types.h new file mode 100644 index 0000000..0e98503 --- /dev/null +++ b/src/types.h @@ -0,0 +1,405 @@ +#pragma once + +#ifndef va_list +#define va_list __builtin_va_list +#endif + +// On Windows, the incoming stack is aligned to a 4 byte boundary. +// force_align_arg_pointer will realign the stack to match GCC's 16 byte alignment. +#define WIN_ENTRY __attribute__((cdecl, force_align_arg_pointer)) +#define WIN_FUNC __attribute__((stdcall, force_align_arg_pointer)) + +// Annotation macros for code generation +#ifdef WIBO_CODEGEN +#define WIBO_ANNOTATE(x) __attribute__((annotate(x))) +#else +#define WIBO_ANNOTATE(x) +#endif + +// SAL-style directionality +#define _In_ WIBO_ANNOTATE("SAL:in") +#define _Out_ WIBO_ANNOTATE("SAL:out") +#define _Inout_ WIBO_ANNOTATE("SAL:inout") +#define _In_opt_ WIBO_ANNOTATE("SAL:in_opt") +#define _Out_opt_ WIBO_ANNOTATE("SAL:out_opt") + +// Byte-counted buffers +#define _In_reads_bytes_(n) WIBO_ANNOTATE("SAL:in_bcount(" #n ")") +#define _Out_writes_bytes_(n) WIBO_ANNOTATE("SAL:out_bcount(" #n ")") + +// Codegen annotation for calling convention +#define _CC_STDCALL WIBO_ANNOTATE("CC:stdcall") + +// Instructs codegen to convert stdcall to fastcall +#define WINAPI _CC_STDCALL __attribute__((fastcall)) + +using VOID = void; +using HANDLE = VOID *; +using HMODULE = VOID *; +using HGLOBAL = HANDLE; +using HLOCAL = HANDLE; +using HRSRC = HANDLE; +using LPHANDLE = HANDLE *; +using PHANDLE = HANDLE *; +using HKL = HANDLE; +using PVOID = VOID *; +using LPVOID = VOID *; +using LPCVOID = const VOID *; +using FARPROC = VOID *; +using WORD = unsigned short; +using LPWORD = WORD *; +using LANGID = WORD; +using ATOM = WORD; +using DWORD = unsigned int; +using PDWORD = DWORD *; +using LPDWORD = DWORD *; +using LONG = int; +using PLONG = LONG *; +using ULONG = unsigned int; +using PULONG = ULONG *; +using LARGE_INTEGER = long long; +using PLARGE_INTEGER = LARGE_INTEGER *; +using ULARGE_INTEGER = unsigned long long; +using PULARGE_INTEGER = ULARGE_INTEGER *; +using ULONG_PTR = unsigned long; +using UINT_PTR = unsigned long; +static_assert(sizeof(ULONG_PTR) == sizeof(void *), "ULONG_PTR must be pointer-sized"); +static_assert(sizeof(UINT_PTR) == sizeof(void *), "UINT_PTR must be pointer-sized"); +using DWORD_PTR = ULONG_PTR; +using PDWORD_PTR = DWORD_PTR *; +using SHORT = short; +using USHORT = unsigned short; +using CHAR = char; +using LPSTR = CHAR *; +using LPCSTR = const char *; +using LPCCH = const char *; +using WCHAR = unsigned short; +using LPWSTR = WCHAR *; +using LPCWSTR = const WCHAR *; +using LPCWCH = const WCHAR *; +using LPCH = CHAR *; +using LPWCH = WCHAR *; +using BOOL = int; +using PBOOL = BOOL *; +using LPBOOL = BOOL *; +using UCHAR = unsigned char; +using PUCHAR = UCHAR *; +using SIZE_T = ULONG_PTR; +using PSIZE_T = SIZE_T *; +using BYTE = unsigned char; +using BOOLEAN = unsigned char; +using UINT = unsigned int; +using HKEY = VOID *; +using PHKEY = HKEY *; +using PSID = VOID *; +using REGSAM = DWORD; +using LSTATUS = LONG; +using LCID = DWORD; +using LCTYPE = DWORD; +using HWINSTA = HANDLE; +using HWND = HANDLE; +using PBYTE = BYTE *; +using LPBYTE = BYTE *; +using PWSTR = WCHAR *; + +using NTSTATUS = LONG; +using HRESULT = LONG; + +struct GUID { + DWORD Data1; + WORD Data2; + WORD Data3; + BYTE Data4[8]; +}; +struct LUID { + DWORD LowPart; + LONG HighPart; +}; +using PLUID = LUID *; +using LPLUID = LUID *; + +constexpr BOOL TRUE = 1; +constexpr BOOL FALSE = 0; + +constexpr DWORD STILL_ACTIVE = 259; + +constexpr DWORD FILE_FLAG_BACKUP_SEMANTICS = 0x02000000; +constexpr DWORD FILE_FLAG_DELETE_ON_CLOSE = 0x04000000; +constexpr DWORD FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000; +constexpr DWORD FILE_FLAG_NO_BUFFERING = 0x20000000; +constexpr DWORD FILE_FLAG_OVERLAPPED = 0x40000000; +constexpr DWORD FILE_FLAG_WRITE_THROUGH = 0x80000000; + +constexpr DWORD STD_INPUT_HANDLE = ((DWORD)-10); +constexpr DWORD STD_OUTPUT_HANDLE = ((DWORD)-11); +constexpr DWORD STD_ERROR_HANDLE = ((DWORD)-12); + +constexpr DWORD FILE_READ_DATA = 0x00000001; +constexpr DWORD FILE_LIST_DIRECTORY = 0x00000001; +constexpr DWORD FILE_WRITE_DATA = 0x00000002; +constexpr DWORD FILE_ADD_FILE = 0x00000002; +constexpr DWORD FILE_APPEND_DATA = 0x00000004; +constexpr DWORD FILE_ADD_SUBDIRECTORY = 0x00000004; +constexpr DWORD FILE_CREATE_PIPE_INSTANCE = 0x00000004; +constexpr DWORD FILE_READ_EA = 0x00000008; +constexpr DWORD FILE_WRITE_EA = 0x00000010; +constexpr DWORD FILE_EXECUTE = 0x00000020; +constexpr DWORD FILE_TRAVERSE = 0x00000020; +constexpr DWORD FILE_DELETE_CHILD = 0x00000040; +constexpr DWORD FILE_READ_ATTRIBUTES = 0x00000080; +constexpr DWORD FILE_WRITE_ATTRIBUTES = 0x00000100; + +constexpr DWORD SYNCHRONIZE = 0x00100000; +constexpr DWORD DELETE = 0x00010000; +constexpr DWORD WRITE_DAC = 0x00040000; +constexpr DWORD WRITE_OWNER = 0x00080000; +constexpr DWORD ACCESS_SYSTEM_SECURITY = 0x01000000; + +constexpr DWORD STANDARD_RIGHTS_READ = 0x00020000; +constexpr DWORD STANDARD_RIGHTS_WRITE = 0x00020000; +constexpr DWORD STANDARD_RIGHTS_EXECUTE = 0x00020000; +constexpr DWORD STANDARD_RIGHTS_REQUIRED = 0x000f0000; +constexpr DWORD STANDARD_RIGHTS_ALL = 0x001f0000; + +constexpr DWORD FILE_GENERIC_READ = + STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE; +constexpr DWORD FILE_GENERIC_WRITE = + STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE; +constexpr DWORD FILE_GENERIC_EXECUTE = STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE; +constexpr DWORD FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF; + +constexpr DWORD EVENT_ALL_ACCESS = 0x1F0003; +constexpr DWORD MUTEX_ALL_ACCESS = 0x1F0001; +constexpr DWORD SEMAPHORE_ALL_ACCESS = 0x1F0003; + +constexpr DWORD GENERIC_READ = 0x80000000; +constexpr DWORD GENERIC_WRITE = 0x40000000; +constexpr DWORD GENERIC_EXECUTE = 0x20000000; +constexpr DWORD GENERIC_ALL = 0x10000000; + +// Page protection constants +constexpr DWORD PAGE_NOACCESS = 0x01; +constexpr DWORD PAGE_READONLY = 0x02; +constexpr DWORD PAGE_READWRITE = 0x04; +constexpr DWORD PAGE_WRITECOPY = 0x08; +constexpr DWORD PAGE_EXECUTE = 0x10; +constexpr DWORD PAGE_EXECUTE_READ = 0x20; +constexpr DWORD PAGE_EXECUTE_READWRITE = 0x40; +constexpr DWORD PAGE_EXECUTE_WRITECOPY = 0x80; +constexpr DWORD PAGE_GUARD = 0x100; +constexpr DWORD PAGE_NOCACHE = 0x200; +constexpr DWORD PAGE_WRITECOMBINE = 0x400; + +// Allocation type and memory state constants +constexpr DWORD MEM_COMMIT = 0x00001000; +constexpr DWORD MEM_RESERVE = 0x00002000; +constexpr DWORD MEM_DECOMMIT = 0x00004000; +constexpr DWORD MEM_RELEASE = 0x00008000; +constexpr DWORD MEM_FREE = 0x00010000; +constexpr DWORD MEM_PRIVATE = 0x00020000; +constexpr DWORD MEM_MAPPED = 0x00040000; +constexpr DWORD MEM_RESET = 0x00080000; +constexpr DWORD MEM_TOP_DOWN = 0x00100000; +constexpr DWORD MEM_WRITE_WATCH = 0x00200000; +constexpr DWORD MEM_PHYSICAL = 0x00400000; +constexpr DWORD MEM_RESET_UNDO = 0x01000000; +constexpr DWORD MEM_LARGE_PAGES = 0x20000000; +constexpr DWORD MEM_COALESCE_PLACEHOLDERS = 0x00000001; +constexpr DWORD MEM_PRESERVE_PLACEHOLDER = 0x00000002; +constexpr DWORD MEM_IMAGE = 0x01000000; + +// File mapping access flags +constexpr DWORD FILE_MAP_COPY = 0x00000001; +constexpr DWORD FILE_MAP_WRITE = 0x00000002; +constexpr DWORD FILE_MAP_READ = 0x00000004; +constexpr DWORD FILE_MAP_EXECUTE = 0x00000020; +constexpr DWORD FILE_MAP_ALL_ACCESS = 0x000f001f; + +// File share modes +constexpr DWORD FILE_SHARE_READ = 0x00000001; +constexpr DWORD FILE_SHARE_WRITE = 0x00000002; +constexpr DWORD FILE_SHARE_DELETE = 0x00000004; + +constexpr DWORD PIPE_ACCESS_INBOUND = 0x00000001; +constexpr DWORD PIPE_ACCESS_OUTBOUND = 0x00000002; +constexpr DWORD PIPE_ACCESS_DUPLEX = 0x00000003; + +constexpr DWORD PIPE_TYPE_BYTE = 0x00000000; +constexpr DWORD PIPE_TYPE_MESSAGE = 0x00000004; +constexpr DWORD PIPE_READMODE_BYTE = 0x00000000; +constexpr DWORD PIPE_READMODE_MESSAGE = 0x00000002; +constexpr DWORD PIPE_WAIT = 0x00000000; +constexpr DWORD PIPE_NOWAIT = 0x00000001; +constexpr DWORD PIPE_ACCEPT_REMOTE_CLIENTS = 0x00000000; +constexpr DWORD PIPE_REJECT_REMOTE_CLIENTS = 0x00000008; +constexpr DWORD PIPE_UNLIMITED_INSTANCES = 255; + +constexpr SIZE_T kTlsSlotCount = 64; + +typedef struct _UNICODE_STRING { + USHORT Length; + USHORT MaximumLength; + PWSTR Buffer; +} UNICODE_STRING, *PUNICODE_STRING; + +typedef struct _RTL_USER_PROCESS_PARAMETERS { + BYTE Reserved1[16]; + PVOID Reserved2[10]; + UNICODE_STRING ImagePathName; + UNICODE_STRING CommandLine; +} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS; + +typedef struct _LIST_ENTRY { + struct _LIST_ENTRY *Flink; + struct _LIST_ENTRY *Blink; +} LIST_ENTRY, *PLIST_ENTRY, PRLIST_ENTRY; + +typedef struct _PEB_LDR_DATA { + BYTE Reserved1[8]; + PVOID Reserved2[3]; + LIST_ENTRY InMemoryOrderModuleList; +} PEB_LDR_DATA, *PPEB_LDR_DATA; + +using PS_POST_PROCESS_INIT_ROUTINE = void(WIN_FUNC *)(void); +using PPS_POST_PROCESS_INIT_ROUTINE = PS_POST_PROCESS_INIT_ROUTINE *; + +typedef struct _PEB { + BYTE Reserved1[2]; + BYTE BeingDebugged; + BYTE Reserved2[1]; + PVOID Reserved3[2]; + PPEB_LDR_DATA Ldr; + PRTL_USER_PROCESS_PARAMETERS ProcessParameters; + PVOID Reserved4[3]; + PVOID AtlThunkSListPtr; + PVOID Reserved5; + ULONG Reserved6; + PVOID Reserved7; + ULONG Reserved8; + ULONG AtlThunkSListPtr32; + PVOID Reserved9[45]; + BYTE Reserved10[96]; + PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine; + BYTE Reserved11[128]; + PVOID Reserved12[1]; + ULONG SessionId; +} PEB, *PPEB; + +struct CLIENT_ID { + HANDLE UniqueProcess; + HANDLE UniqueThread; +}; + +struct _ACTIVATION_CONTEXT; + +typedef struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME { + struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME *Previous; + _ACTIVATION_CONTEXT *ActivationContext; + ULONG Flags; +} RTL_ACTIVATION_CONTEXT_STACK_FRAME, *PRTL_ACTIVATION_CONTEXT_STACK_FRAME; + +typedef struct _ACTIVATION_CONTEXT_STACK { + PRTL_ACTIVATION_CONTEXT_STACK_FRAME ActiveFrame; + LIST_ENTRY FrameListCache; + ULONG Flags; + ULONG NextCookieSequenceNumber; + ULONG StackId; +} ACTIVATION_CONTEXT_STACK, *PACTIVATION_CONTEXT_STACK; + +#define GDI_BATCH_BUFFER_SIZE 0x136 +typedef struct _GDI_TEB_BATCH { + ULONG Offset; + HANDLE HDC; + ULONG Buffer[GDI_BATCH_BUFFER_SIZE]; +} GDI_TEB_BATCH, *PGDI_TEB_BATCH; + +typedef struct _NT_TIB { + struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; + PVOID StackBase; + PVOID StackLimit; + PVOID SubSystemTib; + union { + PVOID FiberData; + DWORD Version; + } DUMMYUNIONNAME; + PVOID ArbitraryUserPointer; + struct _NT_TIB *Self; +} NT_TIB, *PNT_TIB; + +typedef struct _TEB { + NT_TIB Tib; /* 000 */ + PVOID EnvironmentPointer; /* 01c */ + CLIENT_ID ClientId; /* 020 */ + PVOID ActiveRpcHandle; /* 028 */ + PVOID ThreadLocalStoragePointer; /* 02c */ + PPEB Peb; /* 030 */ + ULONG LastErrorValue; /* 034 */ + ULONG CountOfOwnedCriticalSections; /* 038 */ + PVOID CsrClientThread; /* 03c */ + PVOID Win32ThreadInfo; /* 040 */ + ULONG Win32ClientInfo[31]; /* 044 used for user32 private data in Wine */ + PVOID WOW32Reserved; /* 0c0 */ + ULONG CurrentLocale; /* 0c4 */ + ULONG FpSoftwareStatusRegister; /* 0c8 */ + PVOID SystemReserved1[54]; /* 0cc used for kernel32 private data in Wine */ + PVOID Spare1; /* 1a4 */ + LONG ExceptionCode; /* 1a8 */ + PVOID ActivationContextStackPointer; /* 1a8/02c8 */ + BYTE SpareBytes1[36]; /* 1ac */ + PVOID SystemReserved2[10]; /* 1d4 used for ntdll private data in Wine */ + GDI_TEB_BATCH GdiTebBatch; /* 1fc */ + ULONG gdiRgn; /* 6dc */ + ULONG gdiPen; /* 6e0 */ + ULONG gdiBrush; /* 6e4 */ + CLIENT_ID RealClientId; /* 6e8 */ + HANDLE GdiCachedProcessHandle; /* 6f0 */ + ULONG GdiClientPID; /* 6f4 */ + ULONG GdiClientTID; /* 6f8 */ + PVOID GdiThreadLocaleInfo; /* 6fc */ + PVOID UserReserved[5]; /* 700 */ + PVOID glDispatchTable[280]; /* 714 */ + ULONG glReserved1[26]; /* b74 */ + PVOID glReserved2; /* bdc */ + PVOID glSectionInfo; /* be0 */ + PVOID glSection; /* be4 */ + PVOID glTable; /* be8 */ + PVOID glCurrentRC; /* bec */ + PVOID glContext; /* bf0 */ + ULONG LastStatusValue; /* bf4 */ + UNICODE_STRING StaticUnicodeString; /* bf8 used by advapi32 */ + WCHAR StaticUnicodeBuffer[261]; /* c00 used by advapi32 */ + PVOID DeallocationStack; /* e0c */ + PVOID TlsSlots[64]; /* e10 */ + LIST_ENTRY TlsLinks; /* f10 */ + PVOID Vdm; /* f18 */ + PVOID ReservedForNtRpc; /* f1c */ + PVOID DbgSsReserved[2]; /* f20 */ + ULONG HardErrorDisabled; /* f28 */ + PVOID Instrumentation[16]; /* f2c */ + PVOID WinSockData; /* f6c */ + ULONG GdiBatchCount; /* f70 */ + ULONG Spare2; /* f74 */ + ULONG Spare3; /* f78 */ + ULONG Spare4; /* f7c */ + PVOID ReservedForOle; /* f80 */ + ULONG WaitingOnLoaderLock; /* f84 */ + PVOID Reserved5[3]; /* f88 */ + PVOID *TlsExpansionSlots; /* f94 */ + // Custom + unsigned short hostFsSelector; + unsigned short hostGsSelector; + bool hostSegmentsValid; + unsigned char padding[3]; +} TEB, *PTEB; + +#ifndef offsetof +#define offsetof(type, member) __builtin_offsetof(type, member) +#endif + +static_assert(offsetof(NT_TIB, Self) == 0x18, "Self pointer offset mismatch"); +static_assert(offsetof(TEB, ThreadLocalStoragePointer) == 0x2C, "TLS pointer offset mismatch"); +static_assert(offsetof(TEB, Peb) == 0x30, "PEB pointer offset mismatch"); +static_assert(offsetof(TEB, LastErrorValue) == 0x34, "LastErrorValue offset mismatch"); +static_assert(offsetof(TEB, GdiTebBatch) == 0x1FC, "GdiTebBatch offset mismatch"); +static_assert(offsetof(TEB, DeallocationStack) == 0xE0C, "DeallocationStack offset mismatch"); +static_assert(offsetof(TEB, TlsSlots) == 0xE10, "TLS slots offset mismatch"); diff --git a/tools/gen_trampolines.py b/tools/gen_trampolines.py new file mode 100644 index 0000000..2a408a0 --- /dev/null +++ b/tools/gen_trampolines.py @@ -0,0 +1,248 @@ +#!/usr/bin/env -S uv run --script +# /// script +# requires-python = ">=3.10" +# dependencies = ["clang==17.0.6"] +# /// +""" +Generate Windows ABI trampolines by scanning C++ prototypes using libclang. + +This emits x86 trampolines for guest-to-host calls. +""" + +if __name__ == "__main__": + import script_venv + + script_venv.bootstrap_venv(__file__) + +import argparse +import os +import sys +import tempfile + +from clang.cindex import ( + Config, + Cursor, + CursorKind, + Index, + TranslationUnit, +) +from dataclasses import dataclass +from pathlib import Path +from typing import Iterable, List, Optional + +# Allow libclang path to be specified via environment variable +if "LIBCLANG_PATH" in os.environ: + libclang_path = os.environ["LIBCLANG_PATH"] + if os.path.isfile(libclang_path): + Config.set_library_file(libclang_path) + elif os.path.isdir(libclang_path): + Config.set_library_path(libclang_path) + else: + sys.stderr.write( + f"Warning: LIBCLANG_PATH={libclang_path} is not a file or directory\n" + ) + + +@dataclass +class FuncInfo: + qualified_ns: str + name: str + mangled: str + argc: int + stdcall: bool + + +def parse_tu( + headers: List[str], include_dirs: List[str], target: str +) -> TranslationUnit: + # Construct a tiny TU that includes the requested headers + tu_source = "\n".join([f'#include "{h}"' for h in headers]) + "\n" + with tempfile.NamedTemporaryFile("w", suffix=".cpp") as tf: + tf.write(tu_source) + tf.flush() + args = [ + "-x", + "c++", + "-std=c++17", + "-target", + target, + "-DWIBO_CODEGEN=1", + ] + [arg for inc in include_dirs for arg in ("-I", inc)] + + index = Index.create() + tu = index.parse( + tf.name, args=args, options=TranslationUnit.PARSE_SKIP_FUNCTION_BODIES + ) + for d in tu.diagnostics: + if d.severity >= d.Warning: + sys.stderr.write(str(d) + "\n") + return tu + + +def _cursor_namespace(cursor: Cursor) -> List[str]: + ns: List[str] = [] + c = cursor + while c is not None and c.kind != CursorKind.TRANSLATION_UNIT: + if c.kind == CursorKind.NAMESPACE and c.spelling: + ns.append(c.spelling) + c = c.semantic_parent + return list(reversed(ns)) + + +def _has_stdcall_annotation(func: Cursor) -> bool: + for child in func.get_children(): + if child.kind == CursorKind.ANNOTATE_ATTR and child.spelling == "CC:stdcall": + return True + return False + + +def _arg_count(func: Cursor) -> int: + return sum(1 for _ in func.type.argument_types()) + + +def collect_functions(tu: TranslationUnit, ns_filter: Optional[str]) -> List[FuncInfo]: + want_ns = ns_filter.split("::") if ns_filter else None + out: dict[str, FuncInfo] = {} + + def visit(node: Cursor) -> None: + if node.kind == CursorKind.FUNCTION_DECL: + ns_parts = _cursor_namespace(node) + if want_ns is not None and ns_parts != want_ns: + return + name = node.spelling or "" + mangled = getattr(node, "mangled_name", None) or "" + if not name or not mangled: + return + out[name] = FuncInfo( + qualified_ns="::".join(ns_parts), + name=name, + mangled=mangled, + argc=_arg_count(node), + stdcall=_has_stdcall_annotation(node), + ) + # Recurse into children where it makes sense + if node.kind in (CursorKind.TRANSLATION_UNIT, CursorKind.NAMESPACE): + for c in node.get_children(): + visit(c) + + visit(tu.cursor) + return sorted(out.values(), key=lambda f: f.name) + + +def emit_x86_asm_trampolines(dll: str, funcs: Iterable[FuncInfo]) -> str: + lines: List[str] = [] + lines.append("#\tAuto-generated trampolines; DO NOT EDIT.") + lines.append(".section .note.GNU-stack, \"\", @progbits") + lines.append(".text") + for f in funcs: + name = f.name + mangled = f.mangled + # Ensure ms_abi is encoded for stdcall function-pointer types to match GCC + # mangled = mangled.replace("U7stdcall", "U7stdcallU6ms_abi") + tramp = f"thunk_{dll}_{name}" + lines.append("") + lines.append(f".globl {tramp}") + lines.append(f".type {tramp}, @function") + lines.append(f"{tramp}:") + argc = int(f.argc or 0) + # Calculate number of stack args (fastcall uses ECX/EDX for first 2) + stack_argc = max(0, argc - 2) + stack_bytes = stack_argc * 4 + # Use frame pointer for clean alignment and argument access + lines.append("\tpush %ebp") + lines.append("\tmovl %esp, %ebp") + # Align stack: we want ESP = 16n before the call, + # so that after call pushes return address, callee sees ESP = 16n - 4 + # After pushing stack_bytes worth of args, we need ESP = 16n + stack_bytes + if stack_bytes > 0: + lines.append(f"\tleal -{stack_bytes}(%ebp), %esp") + lines.append("\tandl $0xFFFFFFF0, %esp") + lines.append(f"\taddl ${stack_bytes}, %esp") + else: + # No stack args, just align to 16n for the call + lines.append("\tandl $0xFFFFFFF0, %esp") + # Move first two args into ECX/EDX for fastcall + if argc >= 1: + lines.append("\tmovl 8(%ebp), %ecx") + if argc >= 2: + lines.append("\tmovl 12(%ebp), %edx") + # Push remaining args (from last down to the 3rd) so layout matches fastcall + for i in range(argc, 2, -1): + off = 4 * (i + 1) # +1 because EBP offset includes pushed EBP + lines.append(f"\tpushl {off}(%ebp)") + # Call into fastcall stub + lines.append(f"\tcall {mangled}") + # Restore stack and frame pointer + lines.append("\tleave") + # Return to guest + argb = argc * 4 + if f.stdcall and argb: + lines.append(f"\tret ${argb}") + else: + lines.append("\tret") + lines.append(f".size {tramp}, . - {tramp}") + return "\n".join(lines) + "\n" + + +def emit_header_mapping(dll: str, funcs: Iterable[FuncInfo]) -> str: + guard = f"WIBO_GEN_{dll.upper()}_TRAMPOLINES_H" + lines: List[str] = [] + lines.append("/* Auto-generated; DO NOT EDIT. */") + lines.append(f"#ifndef {guard}") + lines.append(f"#define {guard}") + lines.append("#include ") + lines.append("#include ") + lines.append('#ifdef __cplusplus\nextern "C" {\n#endif') + for f in funcs: + tramp = f"thunk_{dll}_{f.name}" + lines.append(f"void {tramp}(void);") + lines.append("#ifdef __cplusplus\n}\n#endif") + lines.append("") + # name->address helper for resolveByName + lines.append("static inline void *%s_trampoline_by_name(const char *name) {" % dll) + for f in funcs: + lines.append( + f'\tif (strcmp(name, "{f.name}") == 0) return (void*)&thunk_{dll}_{f.name};' + ) + lines.append("\treturn NULL;") + lines.append("}") + lines.append(f"#endif /* {guard} */\n") + return "\n".join(lines) + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--dll", required=True, help="DLL name, e.g. kernel32") + ap.add_argument("--headers", nargs="+", required=True, help="Header files to scan") + ap.add_argument( + "--namespace", dest="ns", default=None, help="Namespace filter, e.g. kernel32" + ) + ap.add_argument("--arch", choices=["x86"], default="x86") + ap.add_argument( + "--out-asm", type=Path, required=True, help="Output assembly file (.S)" + ) + ap.add_argument( + "--out-hdr", type=Path, required=True, help="Output header file (.h)" + ) + ap.add_argument("-I", dest="incs", action="append", default=[]) + args = ap.parse_args() + + target = "i686-pc-linux-gnu" if args.arch == "x86" else "x86_64-pc-linux-gnu" + tu = parse_tu(args.headers, args.incs, target) + funcs = collect_functions(tu, args.ns) + if not funcs: + sys.stderr.write("No functions found for generation.\n") + return 1 + + asm = emit_x86_asm_trampolines(args.dll, funcs) + hdr = emit_header_mapping(args.dll, funcs) + + args.out_asm.parent.mkdir(parents=True, exist_ok=True) + args.out_hdr.parent.mkdir(parents=True, exist_ok=True) + args.out_asm.write_text(asm) + args.out_hdr.write_text(hdr) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/script_venv.py b/tools/script_venv.py new file mode 100644 index 0000000..3d35bd1 --- /dev/null +++ b/tools/script_venv.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python3 +""" +Reusable venv management for PEP 723 inline script dependencies. + +This module provides utilities to: +1. Parse PEP 723 inline script metadata blocks +2. Create and manage virtual environments +3. Track dependencies and reinstall when they change +""" + +import hashlib +import json +import os +import re +import subprocess +import sys +import venv +from pathlib import Path + + +SCRIPT_BLOCK_RE = re.compile(r"(?m)^# /// script$\s(?P(^#(| .*)$\s)+)^# ///$") + + +def _load_toml(text: str) -> dict: + """Load TOML using stdlib tomllib or third-party tomli as a fallback.""" + try: + import tomllib # type: ignore[attr-defined] + except Exception: + try: + import tomli as tomllib # type: ignore[no-redef] + except Exception as exc: # pragma: no cover - import error path + raise SystemExit( + "Missing TOML parser. Install 'tomli' or use Python >= 3.11." + ) from exc + return tomllib.loads(text) + + +def read_pep723_metadata(script_path: Path) -> dict: + """ + Parse PEP 723 inline script metadata from a Python file. + + Returns the parsed TOML data as a dict, or empty dict if no block found. + """ + text = script_path.read_text(encoding="utf-8") + m = SCRIPT_BLOCK_RE.search(text) + if not m: + return {} + content = m.group("content") + toml_lines: list[str] = [] + for line in content.splitlines(): + if not line.startswith("#"): + continue + # Strip the leading comment marker and a single optional space + if line.startswith("# "): + toml_lines.append(line[2:]) + else: + toml_lines.append(line[1:]) + + toml_text = "\n".join(toml_lines) + return _load_toml(toml_text) + + +def deps_digest(deps: list[str]) -> str: + """Compute a stable hash of the dependency list.""" + return hashlib.sha256(json.dumps(sorted(deps)).encode()).hexdigest() + + +def in_venv() -> bool: + """ + Check if we're currently running inside a virtual environment. + """ + return sys.prefix != sys.base_prefix + + +def _parse_version_tuple(v: str) -> tuple[int, int, int]: + """Parse a version like '3.12.1' into a 3-tuple, ignoring any suffixes.""" + parts = re.findall(r"\d+", v) + nums = [int(p) for p in parts[:3]] + while len(nums) < 3: + nums.append(0) + return tuple(nums) # type: ignore[return-value] + + +def _satisfies_requires_python( + spec: str, current: tuple[int, int, int] | None = None +) -> bool: + """ + Minimal evaluator for PEP 440-like specifiers in requires-python. + + Supports common operators: >=, >, <=, <, ==, != and wildcard '==3.12.*'. + Combines multiple comma-separated specifiers with logical AND. + """ + cur = current or ( + sys.version_info.major, + sys.version_info.minor, + sys.version_info.micro, + ) + + def cmp(a: tuple[int, int, int], b: tuple[int, int, int]) -> int: + return (a > b) - (a < b) + + for raw in spec.split(","): + s = raw.strip() + if not s: + continue + op = None + for candidate in (">=", "<=", "==", "!=", ">", "<"): + if s.startswith(candidate): + op = candidate + ver = s[len(candidate) :].strip() + break + if op is None: + # Treat bare version as ==version (prefix match compatible with '==3.12.*') + op, ver = "==", s + wildcard = op in {"==", "!="} and ver.endswith(".*") + if wildcard: + ver = ver[:-2] + tgt = _parse_version_tuple(ver) + c = cmp(cur, tgt) + if op == ">=": + if c < 0: + return False + elif op == ">": + if c <= 0: + return False + elif op == "<=": + if c > 0: + return False + elif op == "<": + if c >= 0: + return False + elif op == "==": + if wildcard: + # Prefix equality: compare only provided components + prefix = _parse_version_tuple(ver) # already trimmed + plen = 2 if ver.count(".") == 1 else 3 + if tuple(cur[:plen]) != tuple(prefix[:plen]): + return False + else: + if c != 0: + return False + elif op == "!=": + if wildcard: + prefix = _parse_version_tuple(ver) + plen = 2 if ver.count(".") == 1 else 3 + if tuple(cur[:plen]) == tuple(prefix[:plen]): + return False + else: + if c == 0: + return False + else: + return False + return True + + +def is_venv_managed(venv_dir: Path) -> bool: + """Check if a venv was created by this script manager.""" + marker = venv_dir / ".script-managed" + return marker.exists() + + +def get_venv_digest(venv_dir: Path) -> str | None: + """Get the stored dependency digest from a managed venv.""" + marker = venv_dir / ".script-managed" + if not marker.exists(): + return None + return marker.read_text().strip() + + +def set_venv_digest(venv_dir: Path, digest: str) -> None: + """Store the dependency digest in a managed venv.""" + marker = venv_dir / ".script-managed" + marker.write_text(digest) + + +def create_venv(venv_dir: Path) -> Path: + """Create a new virtual environment and return the path to its Python binary.""" + python_bin = venv_dir / ("Scripts/python.exe" if os.name == "nt" else "bin/python") + if not python_bin.exists(): + venv.create(venv_dir, with_pip=True) + return python_bin + + +def install_deps(python_bin: Path, deps: list[str]) -> None: + """Install dependencies into a virtual environment.""" + if not deps: + return + subprocess.check_call([str(python_bin), "-m", "pip", "install", *deps]) + + +def bootstrap_venv(script_file: str) -> None: + """ + Bootstrap the script with its venv if not already running in one. + + If script_path is None, uses __file__ from the calling context. + This function will re-exec the script with the venv's Python if needed. + """ + # Allow users to opt out entirely + if os.environ.get("AUTOVENV", "1").lower() in {"0", "false", "no"}: + return + + script_path = Path(script_file).resolve() + + # Read PEP 723 metadata + meta = read_pep723_metadata(script_path) + # Enforce requires-python if declared + requires = meta.get("requires-python") + if isinstance(requires, str) and not _satisfies_requires_python(requires): + msg = ( + f"Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro} " + f"does not satisfy requires-python: {requires}" + ) + raise SystemExit(msg) + deps = meta.get("dependencies", []) + current_digest = deps_digest(deps) + + if in_venv(): + # Already in a venv, use it + venv_dir = Path(sys.prefix) + python_bin = Path(sys.executable) + managed = is_venv_managed(venv_dir) + else: + # Create a new managed venv + venv_dir = script_path.parent / ".venv" + python_bin = create_venv(venv_dir) + managed = True + + stored_digest = get_venv_digest(venv_dir) + if managed and stored_digest != current_digest: + # Managed venv and deps changed, reinstall + install_deps(python_bin, deps) + set_venv_digest(venv_dir, current_digest) + + if venv_dir != Path(sys.prefix): + # Re-exec with venv Python + os.execv(str(python_bin), [str(python_bin), str(script_path), *sys.argv[1:]])