Initial guest-to-host trampoline generation

This commit is contained in:
2025-10-30 02:23:09 -06:00
parent 9367f003c5
commit 55a62a27c9
85 changed files with 1750 additions and 1807 deletions

View File

@@ -1,5 +1,11 @@
.idea/
.cache/ .cache/
.git/ .git/
.vscode/ .vscode/
build/ build/
tmp/ tmp/
tools/.venv/
tools/__pycache__/
tools/*.pyc
tools/*.pyo
tools/*.pyd

11
.gitignore vendored
View File

@@ -3,8 +3,19 @@ build/
*.o *.o
.vscode/ .vscode/
# CLion # CLion
.idea/ .idea/
cmake-build-*/ cmake-build-*/
# clangd # clangd
.cache/ .cache/
# Python
__pycache__/
.venv/
env/
venv/
*.pyc
*.pyo
*.pyd

View File

@@ -5,7 +5,7 @@ set(CMAKE_CXX_FLAGS_INIT "-m32 -fno-exceptions -fno-rtti")
set(CMAKE_EXE_LINKER_FLAGS_INIT "-m32") set(CMAKE_EXE_LINKER_FLAGS_INIT "-m32")
set(CMAKE_SHARED_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") 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") set(WIBO_VERSION_STRING "unknown")
endif() 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) set(WIBO_GENERATED_HEADER_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated)
file(MAKE_DIRECTORY ${WIBO_GENERATED_HEADER_DIR}) file(MAKE_DIRECTORY ${WIBO_GENERATED_HEADER_DIR})
configure_file( 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_definitions(wibo PRIVATE _GNU_SOURCE _FILE_OFFSET_BITS=64 _TIME_BITS=64)
target_compile_features(wibo PRIVATE cxx_std_20) 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_include_directories(wibo PRIVATE dll src ${WIBO_GENERATED_HEADER_DIR})
target_link_libraries(wibo PRIVATE mimalloc-obj) target_link_libraries(wibo PRIVATE mimalloc-obj atomic)
target_link_options(wibo PRIVATE -no-pie)
if (WIBO_ENABLE_LIBURING) if (WIBO_ENABLE_LIBURING)
target_compile_definitions(wibo PRIVATE WIBO_ENABLE_LIBURING=1) target_compile_definitions(wibo PRIVATE WIBO_ENABLE_LIBURING=1)
target_link_libraries(wibo PRIVATE liburing) target_link_libraries(wibo PRIVATE liburing)
@@ -192,6 +200,92 @@ else()
endif() endif()
install(TARGETS wibo DESTINATION bin) 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) if (WIBO_ENABLE_FIXTURE_TESTS)
include(CTest) include(CTest)

View File

@@ -5,15 +5,18 @@ FROM --platform=linux/i386 alpine:latest AS build
RUN apk add --no-cache \ RUN apk add --no-cache \
bash \ bash \
binutils \ binutils \
clang \
clang-dev \
cmake \ cmake \
coreutils \ coreutils \
g++ \
git \ git \
linux-headers \ linux-headers \
llvm-dev \
make \ make \
mingw-w64-binutils \ mingw-w64-binutils \
mingw-w64-gcc \ mingw-w64-gcc \
ninja ninja \
python3
# Copy source files # Copy source files
WORKDIR /wibo WORKDIR /wibo
@@ -31,6 +34,8 @@ ARG WIBO_VERSION
# Build static binary # Build static binary
RUN cmake -S /wibo -B /wibo/build -G Ninja \ RUN cmake -S /wibo -B /wibo/build -G Ninja \
-DCMAKE_BUILD_TYPE:STRING="$BUILD_TYPE" \ -DCMAKE_BUILD_TYPE:STRING="$BUILD_TYPE" \
-DCMAKE_C_COMPILER:STRING=clang \
-DCMAKE_CXX_COMPILER:STRING=clang++ \
-DCMAKE_C_FLAGS:STRING="-static" \ -DCMAKE_C_FLAGS:STRING="-static" \
-DCMAKE_CXX_FLAGS:STRING="-static" \ -DCMAKE_CXX_FLAGS:STRING="-static" \
-DMI_LIBC_MUSL:BOOL=ON \ -DMI_LIBC_MUSL:BOOL=ON \

View File

@@ -8,14 +8,23 @@ RUN apt-get update \
binutils \ binutils \
binutils-mingw-w64-i686 \ binutils-mingw-w64-i686 \
ca-certificates \ ca-certificates \
clang \
cmake \ cmake \
file \ file \
g++-multilib \
gcc-mingw-w64-i686 \ gcc-mingw-w64-i686 \
gdb \ gdb \
git \ git \
lib32gcc-13-dev \
lib32stdc++-13-dev \
libc6-dev-i386 \
libclang-dev \
linux-libc-dev-i386-cross \
llvm \
make \ make \
ninja-build \ ninja-build \
python3 \
python3-pip \
python3-venv \
unzip \ unzip \
wget \ wget \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
@@ -34,11 +43,13 @@ ARG ENABLE_LTO=AUTO
ARG WIBO_VERSION ARG WIBO_VERSION
RUN cmake -S /wibo -B /wibo/build -G Ninja \ 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" \ -DCMAKE_BUILD_TYPE:STRING="$BUILD_TYPE" \
-DWIBO_ENABLE_LIBURING:BOOL=ON \ -DWIBO_ENABLE_LIBURING:BOOL=ON \
-DWIBO_ENABLE_LTO:STRING="$ENABLE_LTO" \ -DWIBO_ENABLE_LTO:STRING="$ENABLE_LTO" \
-DWIBO_VERSION:STRING="$WIBO_VERSION" \ -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 ) && ( [ "$BUILD_TYPE" != "Release" ] || strip -g /wibo/build/wibo )
# Export binary (usage: docker build -f Dockerfile.ubuntu --target export --output dist .) # Export binary (usage: docker build -f Dockerfile.ubuntu --target export --output dist .)

View File

@@ -1,116 +1,12 @@
#include "modules.h" #include "modules.h"
#include "advapi32/processthreadsapi.h" #include "advapi32_trampolines.h"
#include "advapi32/securitybaseapi.h"
#include "advapi32/winbase.h"
#include "advapi32/wincrypt.h"
#include "advapi32/winreg.h"
#include <cstring>
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
extern const wibo::ModuleStub lib_advapi32 = { extern const wibo::ModuleStub lib_advapi32 = {
(const char *[]){ (const char *[]){
"advapi32", "advapi32",
nullptr, nullptr,
}, },
resolveByName, advapi32_trampoline_by_name,
nullptr, nullptr,
}; };

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
namespace advapi32 { namespace advapi32 {

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
struct ACL { struct ACL {
BYTE AclRevision; BYTE AclRevision;

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
enum SID_NAME_USE : DWORD { enum SID_NAME_USE : DWORD {
SidTypeUser = 1, SidTypeUser = 1,

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
using ALG_ID = DWORD; using ALG_ID = DWORD;
using HCRYPTPROV = ULONG_PTR; using HCRYPTPROV = ULONG_PTR;

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
struct FILETIME; struct FILETIME;

View File

@@ -1,15 +1,16 @@
#include "bcrypt.h"
#include "common.h" #include "common.h"
#include "context.h" #include "context.h"
#include "errors.h" #include "errors.h"
#include "modules.h" #include "modules.h"
#include <cstring>
#include <sys/random.h> #include <sys/random.h>
#include <vector> #include <vector>
namespace { namespace {
typedef PVOID BCRYPT_ALG_HANDLE;
constexpr ULONG BCRYPT_RNG_USE_ENTROPY_IN_BUFFER = 0x00000001; constexpr ULONG BCRYPT_RNG_USE_ENTROPY_IN_BUFFER = 0x00000001;
constexpr ULONG BCRYPT_USE_SYSTEM_PREFERRED_RNG = 0x00000002; constexpr ULONG BCRYPT_USE_SYSTEM_PREFERRED_RNG = 0x00000002;
@@ -33,7 +34,7 @@ bool fillWithSystemRandom(PUCHAR buffer, size_t length) {
namespace bcrypt { 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("BCryptGenRandom(%p, %p, %lu, %lu)\n", hAlgorithm, pbBuffer, cbBuffer, dwFlags); DEBUG_LOG("BCryptGenRandom(%p, %p, %lu, %lu)\n", hAlgorithm, pbBuffer, cbBuffer, dwFlags);
if (pbBuffer == nullptr && cbBuffer != 0) if (pbBuffer == nullptr && cbBuffer != 0)
@@ -66,7 +67,7 @@ NTSTATUS WIN_FUNC BCryptGenRandom(BCRYPT_ALG_HANDLE hAlgorithm, PUCHAR pbBuffer,
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
BOOL WIN_FUNC ProcessPrng(PBYTE pbData, SIZE_T cbData) { BOOL WINAPI ProcessPrng(PBYTE pbData, SIZE_T cbData) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("ProcessPrng(%p, %lu)\n", pbData, cbData); DEBUG_LOG("ProcessPrng(%p, %lu)\n", pbData, cbData);
if (pbData == nullptr && cbData != 0) if (pbData == nullptr && cbData != 0)
@@ -76,13 +77,7 @@ BOOL WIN_FUNC ProcessPrng(PBYTE pbData, SIZE_T cbData) {
} // namespace bcrypt } // namespace bcrypt
static void *resolveByName(const char *name) { #include "bcrypt_trampolines.h"
if (strcmp(name, "BCryptGenRandom") == 0)
return (void *)bcrypt::BCryptGenRandom;
if (strcmp(name, "ProcessPrng") == 0)
return (void *)bcrypt::ProcessPrng;
return nullptr;
}
extern const wibo::ModuleStub lib_bcrypt = { extern const wibo::ModuleStub lib_bcrypt = {
(const char *[]){ (const char *[]){
@@ -90,6 +85,6 @@ extern const wibo::ModuleStub lib_bcrypt = {
"bcryptprimitives", "bcryptprimitives",
nullptr, nullptr,
}, },
resolveByName, bcrypt_trampoline_by_name,
nullptr, nullptr,
}; };

12
dll/bcrypt.h Normal file
View File

@@ -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

View File

@@ -45,7 +45,7 @@ _invalid_parameter_handler invalidParameterHandler = nullptr;
void WIN_ENTRY _initterm(const _PVFV *ppfn, const _PVFV *end) { void WIN_ENTRY _initterm(const _PVFV *ppfn, const _PVFV *end) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("_initterm(%p, %p)\n", ppfn, end); DEBUG_LOG("_initterm(%p, %p)\n", ppfn, end);
TIB *tib = wibo::getThreadTibForHost(); auto *tib = wibo::getThreadTibForHost();
do { do {
if (_PVFV pfn = *++ppfn) { if (_PVFV pfn = *++ppfn) {
DEBUG_LOG("-> calling %p\n", pfn); 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) { int WIN_ENTRY _initterm_e(const _PIFV *ppfn, const _PIFV *end) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("_initterm_e(%p, %p)\n", ppfn, end); DEBUG_LOG("_initterm_e(%p, %p)\n", ppfn, end);
TIB *tib = wibo::getThreadTibForHost(); auto *tib = wibo::getThreadTibForHost();
do { do {
if (_PIFV pfn = *++ppfn) { if (_PIFV pfn = *++ppfn) {
DEBUG_LOG("-> calling %p\n", pfn); DEBUG_LOG("-> calling %p\n", pfn);
@@ -284,7 +284,7 @@ int WIN_ENTRY _execute_onexit_table(void *table) {
void WIN_ENTRY exit(int status) { void WIN_ENTRY exit(int status) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("exit(%i)\n", status); DEBUG_LOG("exit(%i)\n", status);
TIB *tib = wibo::getThreadTibForHost(); auto *tib = wibo::getThreadTibForHost();
for (auto it = atexitFuncs.rbegin(); it != atexitFuncs.rend(); ++it) { for (auto it = atexitFuncs.rbegin(); it != atexitFuncs.rend(); ++it) {
DEBUG_LOG("Calling atexit function %p\n", *it); DEBUG_LOG("Calling atexit function %p\n", *it);
{ {
@@ -298,7 +298,7 @@ void WIN_ENTRY exit(int status) {
void WIN_ENTRY _cexit() { void WIN_ENTRY _cexit() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("_cexit()\n"); DEBUG_LOG("_cexit()\n");
TIB *tib = wibo::getThreadTibForHost(); auto *tib = wibo::getThreadTibForHost();
for (auto it = atexitFuncs.rbegin(); it != atexitFuncs.rend(); ++it) { for (auto it = atexitFuncs.rbegin(); it != atexitFuncs.rend(); ++it) {
DEBUG_LOG("Calling atexit function %p\n", *it); DEBUG_LOG("Calling atexit function %p\n", *it);
{ {

View File

@@ -1,618 +1,12 @@
#include "modules.h" #include "modules.h"
#include "kernel32/debugapi.h" #include "kernel32_trampolines.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
extern const wibo::ModuleStub lib_kernel32 = { extern const wibo::ModuleStub lib_kernel32 = {
(const char *[]){ (const char *[]){
"kernel32", "kernel32",
nullptr, nullptr,
}, },
resolveByName, kernel32_trampoline_by_name,
nullptr, nullptr,
}; };

View File

@@ -5,7 +5,7 @@
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC IsDebuggerPresent() { BOOL WINAPI IsDebuggerPresent() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: IsDebuggerPresent()\n"); DEBUG_LOG("STUB: IsDebuggerPresent()\n");
return FALSE; return FALSE;

View File

@@ -1,9 +1,9 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC IsDebuggerPresent(); BOOL WINAPI IsDebuggerPresent();
} // namespace kernel32 } // namespace kernel32

View File

@@ -14,13 +14,13 @@ UINT g_processErrorMode = 0;
namespace kernel32 { 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)); } void setLastErrorFromErrno() { setLastError(wibo::winErrorFromErrno(errno)); }
DWORD WIN_FUNC GetLastError() { DWORD WINAPI GetLastError() {
#ifndef NDEBUG #ifndef NDEBUG
{ {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
@@ -29,11 +29,11 @@ DWORD WIN_FUNC GetLastError() {
#endif #endif
// In guest context, fetch via TIB // In guest context, fetch via TIB
DWORD err; 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; return err;
} }
void WIN_FUNC SetLastError(DWORD dwErrCode) { void WINAPI SetLastError(DWORD dwErrCode) {
#ifndef NDEBUG #ifndef NDEBUG
{ {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
@@ -41,10 +41,10 @@ void WIN_FUNC SetLastError(DWORD dwErrCode) {
} }
#endif #endif
// In guest context, store via TIB // 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, void WINAPI RaiseException(DWORD dwExceptionCode, DWORD dwExceptionFlags, DWORD nNumberOfArguments,
const ULONG_PTR *lpArguments) { const ULONG_PTR *lpArguments) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("RaiseException(0x%x, 0x%x, %u, %p)\n", dwExceptionCode, dwExceptionFlags, nNumberOfArguments, DEBUG_LOG("RaiseException(0x%x, 0x%x, %u, %p)\n", dwExceptionCode, dwExceptionFlags, nNumberOfArguments,
@@ -55,13 +55,13 @@ void WIN_FUNC RaiseException(DWORD dwExceptionCode, DWORD dwExceptionFlags, DWOR
exitInternal(dwExceptionCode); exitInternal(dwExceptionCode);
} }
PVOID WIN_FUNC AddVectoredExceptionHandler(ULONG First, PVECTORED_EXCEPTION_HANDLER Handler) { PVOID WINAPI AddVectoredExceptionHandler(ULONG First, PVECTORED_EXCEPTION_HANDLER Handler) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: AddVectoredExceptionHandler(%u, %p)\n", First, Handler); DEBUG_LOG("STUB: AddVectoredExceptionHandler(%u, %p)\n", First, Handler);
return reinterpret_cast<PVOID>(Handler); return reinterpret_cast<PVOID>(Handler);
} }
LPTOP_LEVEL_EXCEPTION_FILTER WIN_FUNC LPTOP_LEVEL_EXCEPTION_FILTER WINAPI
SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) { SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: SetUnhandledExceptionFilter(%p)\n", lpTopLevelExceptionFilter); DEBUG_LOG("STUB: SetUnhandledExceptionFilter(%p)\n", lpTopLevelExceptionFilter);
@@ -70,13 +70,13 @@ SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilt
return previous; return previous;
} }
LONG WIN_FUNC UnhandledExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo) { LONG WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: UnhandledExceptionFilter(%p)\n", ExceptionInfo); DEBUG_LOG("STUB: UnhandledExceptionFilter(%p)\n", ExceptionInfo);
return EXCEPTION_EXECUTE_HANDLER; return EXCEPTION_EXECUTE_HANDLER;
} }
UINT WIN_FUNC SetErrorMode(UINT uMode) { UINT WINAPI SetErrorMode(UINT uMode) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: SetErrorMode(%u)\n", uMode); DEBUG_LOG("STUB: SetErrorMode(%u)\n", uMode);
UINT previous = g_processErrorMode; UINT previous = g_processErrorMode;

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
constexpr DWORD EXCEPTION_MAXIMUM_PARAMETERS = 15; constexpr DWORD EXCEPTION_MAXIMUM_PARAMETERS = 15;
@@ -31,14 +31,13 @@ constexpr LONG EXCEPTION_EXECUTE_HANDLER = 1;
namespace kernel32 { namespace kernel32 {
DWORD WIN_FUNC GetLastError(); DWORD WINAPI GetLastError();
void WIN_FUNC SetLastError(DWORD dwErrCode); void WINAPI SetLastError(DWORD dwErrCode);
void WIN_FUNC RaiseException(DWORD dwExceptionCode, DWORD dwExceptionFlags, DWORD nNumberOfArguments, void WINAPI RaiseException(DWORD dwExceptionCode, DWORD dwExceptionFlags, DWORD nNumberOfArguments,
const ULONG_PTR *lpArguments); const ULONG_PTR *lpArguments);
PVOID WIN_FUNC AddVectoredExceptionHandler(ULONG First, PVECTORED_EXCEPTION_HANDLER Handler); PVOID WINAPI AddVectoredExceptionHandler(ULONG First, PVECTORED_EXCEPTION_HANDLER Handler);
LPTOP_LEVEL_EXCEPTION_FILTER WIN_FUNC LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);
SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); LONG WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo);
LONG WIN_FUNC UnhandledExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo); UINT WINAPI SetErrorMode(UINT uMode);
UINT WIN_FUNC SetErrorMode(UINT uMode);
} // namespace kernel32 } // namespace kernel32

View File

@@ -15,7 +15,7 @@ LPVOID g_flsValues[kMaxFlsValues] = {nullptr};
namespace kernel32 { namespace kernel32 {
DWORD WIN_FUNC FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback) { DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FlsAlloc(%p)", lpCallback); DEBUG_LOG("FlsAlloc(%p)", lpCallback);
// If the function succeeds, the return value is an FLS index initialized to zero. // 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; return FLS_OUT_OF_INDEXES;
} }
BOOL WIN_FUNC FlsFree(DWORD dwFlsIndex) { BOOL WINAPI FlsFree(DWORD dwFlsIndex) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FlsFree(%u)\n", dwFlsIndex); DEBUG_LOG("FlsFree(%u)\n", dwFlsIndex);
if (dwFlsIndex < kMaxFlsValues && g_flsValuesUsed[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(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("FlsGetValue(%u)\n", dwFlsIndex); VERBOSE_LOG("FlsGetValue(%u)\n", dwFlsIndex);
PVOID result = nullptr; PVOID result = nullptr;
@@ -59,7 +59,7 @@ PVOID WIN_FUNC FlsGetValue(DWORD dwFlsIndex) {
return result; return result;
} }
BOOL WIN_FUNC FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData) { BOOL WINAPI FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("FlsSetValue(%u, %p)\n", dwFlsIndex, lpFlsData); VERBOSE_LOG("FlsSetValue(%u, %p)\n", dwFlsIndex, lpFlsData);
if (dwFlsIndex < kMaxFlsValues && g_flsValuesUsed[dwFlsIndex]) { if (dwFlsIndex < kMaxFlsValues && g_flsValuesUsed[dwFlsIndex]) {

View File

@@ -1,15 +1,15 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
using PFLS_CALLBACK_FUNCTION = void (*)(void *); using PFLS_CALLBACK_FUNCTION = void (*)(void *);
constexpr DWORD FLS_OUT_OF_INDEXES = 0xFFFFFFFF; constexpr DWORD FLS_OUT_OF_INDEXES = 0xFFFFFFFF;
namespace kernel32 { namespace kernel32 {
DWORD WIN_FUNC FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback); DWORD WINAPI FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback);
BOOL WIN_FUNC FlsFree(DWORD dwFlsIndex); BOOL WINAPI FlsFree(DWORD dwFlsIndex);
PVOID WIN_FUNC FlsGetValue(DWORD dwFlsIndex); PVOID WINAPI FlsGetValue(DWORD dwFlsIndex);
BOOL WIN_FUNC FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData); BOOL WINAPI FlsSetValue(DWORD dwFlsIndex, PVOID lpFlsData);
} // namespace kernel32 } // namespace kernel32

View File

@@ -551,7 +551,7 @@ bool tryOpenConsoleDevice(DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCrea
namespace kernel32 { namespace kernel32 {
DWORD WIN_FUNC GetFileAttributesA(LPCSTR lpFileName) { DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
if (!lpFileName) { if (!lpFileName) {
setLastError(ERROR_INVALID_PARAMETER); 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetFileAttributesW -> "); DEBUG_LOG("GetFileAttributesW -> ");
if (!lpFileName) { if (!lpFileName) {
@@ -598,21 +598,21 @@ DWORD WIN_FUNC GetFileAttributesW(LPCWSTR lpFileName) {
return GetFileAttributesA(str.c_str()); return GetFileAttributesA(str.c_str());
} }
UINT WIN_FUNC GetDriveTypeA(LPCSTR lpRootPathName) { UINT WINAPI GetDriveTypeA(LPCSTR lpRootPathName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: GetDriveTypeA(%s)\n", lpRootPathName ? lpRootPathName : "(null)"); DEBUG_LOG("STUB: GetDriveTypeA(%s)\n", lpRootPathName ? lpRootPathName : "(null)");
(void)lpRootPathName; (void)lpRootPathName;
return DRIVE_FIXED; return DRIVE_FIXED;
} }
UINT WIN_FUNC GetDriveTypeW(LPCWSTR lpRootPathName) { UINT WINAPI GetDriveTypeW(LPCWSTR lpRootPathName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: GetDriveTypeW(%p)\n", lpRootPathName); DEBUG_LOG("STUB: GetDriveTypeW(%p)\n", lpRootPathName);
(void)lpRootPathName; (void)lpRootPathName;
return DRIVE_FIXED; 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 lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags, LPSTR lpFileSystemNameBuffer, LPDWORD lpFileSystemFlags, LPSTR lpFileSystemNameBuffer,
DWORD nFileSystemNameSize) { DWORD nFileSystemNameSize) {
@@ -641,7 +641,7 @@ BOOL WIN_FUNC GetVolumeInformationA(LPCSTR lpRootPathName, LPSTR lpVolumeNameBuf
return TRUE; 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 lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags, LPWSTR lpFileSystemNameBuffer, LPDWORD lpFileSystemFlags, LPWSTR lpFileSystemNameBuffer,
DWORD nFileSystemNameSize) { DWORD nFileSystemNameSize) {
@@ -672,7 +672,7 @@ BOOL WIN_FUNC GetVolumeInformationW(LPCWSTR lpRootPathName, LPWSTR lpVolumeNameB
return TRUE; return TRUE;
} }
LONG WIN_FUNC CompareFileTime(const FILETIME *lpFileTime1, const FILETIME *lpFileTime2) { LONG WINAPI CompareFileTime(const FILETIME *lpFileTime1, const FILETIME *lpFileTime2) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("CompareFileTime(%p, %p)\n", lpFileTime1, lpFileTime2); DEBUG_LOG("CompareFileTime(%p, %p)\n", lpFileTime1, lpFileTime2);
auto toInt64 = [](const FILETIME *ft) -> int64_t { auto toInt64 = [](const FILETIME *ft) -> int64_t {
@@ -693,7 +693,7 @@ LONG WIN_FUNC CompareFileTime(const FILETIME *lpFileTime1, const FILETIME *lpFil
return 0; 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) { LPOVERLAPPED lpOverlapped) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("WriteFile(%p, %p, %u, %p, %p)\n", hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, 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; return io.unixError == 0;
} }
BOOL WIN_FUNC FlushFileBuffers(HANDLE hFile) { BOOL WINAPI FlushFileBuffers(HANDLE hFile) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FlushFileBuffers(%p)\n", hFile); DEBUG_LOG("FlushFileBuffers(%p)\n", hFile);
auto file = wibo::handles().getAs<FileObject>(hFile); auto file = wibo::handles().getAs<FileObject>(hFile);
@@ -788,7 +788,7 @@ BOOL WIN_FUNC FlushFileBuffers(HANDLE hFile) {
return TRUE; 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) { LPOVERLAPPED lpOverlapped) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("ReadFile(%p, %p, %u, %p, %p)\n", hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, 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; 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, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
@@ -1103,7 +1103,7 @@ HANDLE WIN_FUNC CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwSh
return handle; 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, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
@@ -1117,7 +1117,7 @@ HANDLE WIN_FUNC CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwS
dwFlagsAndAttributes, hTemplateFile); dwFlagsAndAttributes, hTemplateFile);
} }
BOOL WIN_FUNC DeleteFileA(LPCSTR lpFileName) { BOOL WINAPI DeleteFileA(LPCSTR lpFileName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
if (!lpFileName) { if (!lpFileName) {
setLastError(ERROR_INVALID_PARAMETER); setLastError(ERROR_INVALID_PARAMETER);
@@ -1133,7 +1133,7 @@ BOOL WIN_FUNC DeleteFileA(LPCSTR lpFileName) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC DeleteFileW(LPCWSTR lpFileName) { BOOL WINAPI DeleteFileW(LPCWSTR lpFileName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("DeleteFileW -> "); DEBUG_LOG("DeleteFileW -> ");
if (!lpFileName) { if (!lpFileName) {
@@ -1144,7 +1144,7 @@ BOOL WIN_FUNC DeleteFileW(LPCWSTR lpFileName) {
return DeleteFileA(name.c_str()); return DeleteFileA(name.c_str());
} }
BOOL WIN_FUNC MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName) { BOOL WINAPI MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("MoveFileA(%s, %s)\n", lpExistingFileName ? lpExistingFileName : "(null)", DEBUG_LOG("MoveFileA(%s, %s)\n", lpExistingFileName ? lpExistingFileName : "(null)",
lpNewFileName ? lpNewFileName : "(null)"); lpNewFileName ? lpNewFileName : "(null)");
@@ -1171,7 +1171,7 @@ BOOL WIN_FUNC MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC MoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName) { BOOL WINAPI MoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("MoveFileW -> "); DEBUG_LOG("MoveFileW -> ");
if (!lpExistingFileName || !lpNewFileName) { if (!lpExistingFileName || !lpNewFileName) {
@@ -1183,7 +1183,7 @@ BOOL WIN_FUNC MoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName) {
return MoveFileA(from.c_str(), to.c_str()); 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetFilePointer(%p, %ld, %p, %u)\n", hFile, static_cast<long>(lDistanceToMove), lpDistanceToMoveHigh, DEBUG_LOG("SetFilePointer(%p, %ld, %p, %u)\n", hFile, static_cast<long>(lDistanceToMove), lpDistanceToMoveHigh,
dwMoveMethod); dwMoveMethod);
@@ -1223,7 +1223,7 @@ DWORD WIN_FUNC SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistan
return static_cast<DWORD>(static_cast<uint64_t>(position) & 0xFFFFFFFFu); return static_cast<DWORD>(static_cast<uint64_t>(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) { DWORD dwMoveMethod) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
if (hFile == nullptr) { if (hFile == nullptr) {
@@ -1270,7 +1270,7 @@ BOOL WIN_FUNC SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLA
return TRUE; return TRUE;
} }
BOOL WIN_FUNC SetEndOfFile(HANDLE hFile) { BOOL WINAPI SetEndOfFile(HANDLE hFile) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetEndOfFile(%p)\n", hFile); DEBUG_LOG("SetEndOfFile(%p)\n", hFile);
HandleMeta meta{}; HandleMeta meta{};
@@ -1292,7 +1292,7 @@ BOOL WIN_FUNC SetEndOfFile(HANDLE hFile) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) { BOOL WINAPI CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
(void)lpSecurityAttributes; (void)lpSecurityAttributes;
if (!lpPathName) { if (!lpPathName) {
@@ -1308,7 +1308,7 @@ BOOL WIN_FUNC CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecuri
return TRUE; return TRUE;
} }
BOOL WIN_FUNC RemoveDirectoryA(LPCSTR lpPathName) { BOOL WINAPI RemoveDirectoryA(LPCSTR lpPathName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
if (!lpPathName) { if (!lpPathName) {
setLastError(ERROR_INVALID_PARAMETER); setLastError(ERROR_INVALID_PARAMETER);
@@ -1323,7 +1323,7 @@ BOOL WIN_FUNC RemoveDirectoryA(LPCSTR lpPathName) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes) { BOOL WINAPI SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
(void)dwFileAttributes; (void)dwFileAttributes;
if (!lpFileName) { if (!lpFileName) {
@@ -1334,7 +1334,7 @@ BOOL WIN_FUNC SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes) {
return TRUE; return TRUE;
} }
DWORD WIN_FUNC GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) { DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetFileSize(%p, %p) ", hFile, lpFileSizeHigh); DEBUG_LOG("GetFileSize(%p, %p) ", hFile, lpFileSizeHigh);
// TODO access check // TODO access check
@@ -1360,7 +1360,7 @@ DWORD WIN_FUNC GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) {
return static_cast<DWORD>(uSize & 0xFFFFFFFFu); return static_cast<DWORD>(uSize & 0xFFFFFFFFu);
} }
BOOL WIN_FUNC GetFileTime(HANDLE hFile, LPFILETIME lpCreationTime, LPFILETIME lpLastAccessTime, BOOL WINAPI GetFileTime(HANDLE hFile, LPFILETIME lpCreationTime, LPFILETIME lpLastAccessTime,
LPFILETIME lpLastWriteTime) { LPFILETIME lpLastWriteTime) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetFileTime(%p, %p, %p, %p)\n", hFile, lpCreationTime, lpLastAccessTime, lpLastWriteTime); 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; 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) { const FILETIME *lpLastWriteTime) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetFileTime(%p, %p, %p, %p)\n", hFile, lpCreationTime, lpLastAccessTime, lpLastWriteTime); 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; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetFileInformationByHandle(%p, %p)\n", hFile, lpFileInformation); DEBUG_LOG("GetFileInformationByHandle(%p, %p)\n", hFile, lpFileInformation);
if (!lpFileInformation) { if (!lpFileInformation) {
@@ -1510,7 +1510,7 @@ BOOL WIN_FUNC GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMAT
return TRUE; return TRUE;
} }
DWORD WIN_FUNC GetFileType(HANDLE hFile) { DWORD WINAPI GetFileType(HANDLE hFile) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetFileType(%p) ", hFile); DEBUG_LOG("GetFileType(%p) ", hFile);
auto file = wibo::handles().getAs<FileObject>(hFile); auto file = wibo::handles().getAs<FileObject>(hFile);
@@ -1539,7 +1539,7 @@ DWORD WIN_FUNC GetFileType(HANDLE hFile) {
return type; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetFullPathNameA(%s, %u)\n", lpFileName ? lpFileName : "(null)", nBufferLength); 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<DWORD>(pathLen); return static_cast<DWORD>(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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetFullPathNameW(%p, %u)\n", lpFileName, nBufferLength); DEBUG_LOG("GetFullPathNameW(%p, %u)\n", lpFileName, nBufferLength);
@@ -1644,7 +1644,7 @@ DWORD WIN_FUNC GetFullPathNameW(LPCWSTR lpFileName, DWORD nBufferLength, LPWSTR
return static_cast<DWORD>(wideLen - 1); return static_cast<DWORD>(wideLen - 1);
} }
DWORD WIN_FUNC GetShortPathNameA(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD cchBuffer) { DWORD WINAPI GetShortPathNameA(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD cchBuffer) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetShortPathNameA(%s)\n", lpszLongPath ? lpszLongPath : "(null)"); DEBUG_LOG("GetShortPathNameA(%s)\n", lpszLongPath ? lpszLongPath : "(null)");
if (!lpszLongPath || !lpszShortPath) { if (!lpszLongPath || !lpszShortPath) {
@@ -1664,7 +1664,7 @@ DWORD WIN_FUNC GetShortPathNameA(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD
return required - 1; 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(); HOST_CONTEXT_GUARD();
if (!lpszLongPath || !lpszShortPath) { if (!lpszLongPath || !lpszShortPath) {
setLastError(ERROR_INVALID_PARAMETER); setLastError(ERROR_INVALID_PARAMETER);
@@ -1685,7 +1685,7 @@ DWORD WIN_FUNC GetShortPathNameW(LPCWSTR lpszLongPath, LPWSTR lpszShortPath, DWO
return static_cast<DWORD>(len); return static_cast<DWORD>(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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetTempFileNameA(%s, %s, %u)\n", lpPathName ? lpPathName : "(null)", DEBUG_LOG("GetTempFileNameA(%s, %s, %u)\n", lpPathName ? lpPathName : "(null)",
lpPrefixString ? lpPrefixString : "(null)", uUnique); lpPrefixString ? lpPrefixString : "(null)", uUnique);
@@ -1727,7 +1727,7 @@ UINT WIN_FUNC GetTempFileNameA(LPCSTR lpPathName, LPCSTR lpPrefixString, UINT uU
return uUnique; return uUnique;
} }
DWORD WIN_FUNC GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer) { DWORD WINAPI GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetTempPathA(%u, %p)\n", nBufferLength, lpBuffer); DEBUG_LOG("GetTempPathA(%u, %p)\n", nBufferLength, lpBuffer);
@@ -1754,7 +1754,7 @@ DWORD WIN_FUNC GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer) {
return static_cast<DWORD>(len); return static_cast<DWORD>(len);
} }
HANDLE WIN_FUNC FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData) { HANDLE WINAPI FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FindFirstFileA(%s, %p)", lpFileName ? lpFileName : "(null)", lpFindFileData); DEBUG_LOG("FindFirstFileA(%s, %p)", lpFileName ? lpFileName : "(null)", lpFindFileData);
if (!lpFindFileData) { if (!lpFindFileData) {
@@ -1773,7 +1773,7 @@ HANDLE WIN_FUNC FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileD
return handle; return handle;
} }
HANDLE WIN_FUNC FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData) { HANDLE WINAPI FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FindFirstFileW(%p, %p)", lpFileName, lpFindFileData); DEBUG_LOG("FindFirstFileW(%p, %p)", lpFileName, lpFindFileData);
if (!lpFindFileData) { if (!lpFindFileData) {
@@ -1793,7 +1793,7 @@ HANDLE WIN_FUNC FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFile
return handle; 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) { FINDEX_SEARCH_OPS fSearchOp, LPVOID lpSearchFilter, DWORD dwAdditionalFlags) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FindFirstFileExA(%s, %d, %p, %d, %p, 0x%x)", lpFileName ? lpFileName : "(null)", fInfoLevelId, 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); 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FindNextFileA(%p, %p)\n", hFindFile, lpFindFileData); DEBUG_LOG("FindNextFileA(%p, %p)\n", hFindFile, lpFindFileData);
if (!lpFindFileData) { if (!lpFindFileData) {
@@ -1858,7 +1858,7 @@ BOOL WIN_FUNC FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData)
return TRUE; return TRUE;
} }
BOOL WIN_FUNC FindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData) { BOOL WINAPI FindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FindNextFileW(%p, %p)\n", hFindFile, lpFindFileData); DEBUG_LOG("FindNextFileW(%p, %p)\n", hFindFile, lpFindFileData);
if (!lpFindFileData) { if (!lpFindFileData) {
@@ -1882,7 +1882,7 @@ BOOL WIN_FUNC FindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData)
return TRUE; return TRUE;
} }
BOOL WIN_FUNC FindClose(HANDLE hFindFile) { BOOL WINAPI FindClose(HANDLE hFindFile) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FindClose(%p)\n", hFindFile); DEBUG_LOG("FindClose(%p)\n", hFindFile);
if (hFindFile == nullptr) { if (hFindFile == nullptr) {

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
#include "minwinbase.h" #include "minwinbase.h"
struct BY_HANDLE_FILE_INFORMATION { struct BY_HANDLE_FILE_INFORMATION {
@@ -56,57 +56,57 @@ constexpr DWORD INVALID_FILE_SIZE = 0xFFFFFFFF;
namespace kernel32 { namespace kernel32 {
DWORD WIN_FUNC GetFullPathNameA(LPCSTR lpFileName, DWORD nBufferLength, LPSTR lpBuffer, LPSTR *lpFilePart); DWORD WINAPI GetFullPathNameA(LPCSTR lpFileName, DWORD nBufferLength, LPSTR lpBuffer, LPSTR *lpFilePart);
DWORD WIN_FUNC GetFullPathNameW(LPCWSTR lpFileName, DWORD nBufferLength, LPWSTR lpBuffer, LPWSTR *lpFilePart); DWORD WINAPI GetFullPathNameW(LPCWSTR lpFileName, DWORD nBufferLength, LPWSTR lpBuffer, LPWSTR *lpFilePart);
DWORD WIN_FUNC GetShortPathNameA(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD cchBuffer); DWORD WINAPI GetShortPathNameA(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD cchBuffer);
DWORD WIN_FUNC GetShortPathNameW(LPCWSTR lpszLongPath, LPWSTR lpszShortPath, DWORD cchBuffer); DWORD WINAPI GetShortPathNameW(LPCWSTR lpszLongPath, LPWSTR lpszShortPath, DWORD cchBuffer);
UINT WIN_FUNC GetTempFileNameA(LPCSTR lpPathName, LPCSTR lpPrefixString, UINT uUnique, LPSTR lpTempFileName); UINT WINAPI GetTempFileNameA(LPCSTR lpPathName, LPCSTR lpPrefixString, UINT uUnique, LPSTR lpTempFileName);
DWORD WIN_FUNC GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer); DWORD WINAPI GetTempPathA(DWORD nBufferLength, LPSTR lpBuffer);
HANDLE WIN_FUNC FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData); HANDLE WINAPI FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData);
HANDLE WIN_FUNC FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData); HANDLE WINAPI FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData);
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); FINDEX_SEARCH_OPS fSearchOp, LPVOID lpSearchFilter, DWORD dwAdditionalFlags);
BOOL WIN_FUNC FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData); BOOL WINAPI FindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData);
BOOL WIN_FUNC FindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData); BOOL WINAPI FindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData);
BOOL WIN_FUNC FindClose(HANDLE hFindFile); BOOL WINAPI FindClose(HANDLE hFindFile);
DWORD WIN_FUNC GetFileAttributesA(LPCSTR lpFileName); DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName);
DWORD WIN_FUNC GetFileAttributesW(LPCWSTR lpFileName); DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName);
UINT WIN_FUNC GetDriveTypeA(LPCSTR lpRootPathName); UINT WINAPI GetDriveTypeA(LPCSTR lpRootPathName);
UINT WIN_FUNC GetDriveTypeW(LPCWSTR lpRootPathName); UINT WINAPI GetDriveTypeW(LPCWSTR lpRootPathName);
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); 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); LPOVERLAPPED lpOverlapped);
BOOL WIN_FUNC FlushFileBuffers(HANDLE hFile); BOOL WINAPI FlushFileBuffers(HANDLE hFile);
HANDLE WIN_FUNC CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, HANDLE WINAPI CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); 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, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
BOOL WIN_FUNC DeleteFileA(LPCSTR lpFileName); BOOL WINAPI DeleteFileA(LPCSTR lpFileName);
BOOL WIN_FUNC DeleteFileW(LPCWSTR lpFileName); BOOL WINAPI DeleteFileW(LPCWSTR lpFileName);
BOOL WIN_FUNC MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName); BOOL WINAPI MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName);
BOOL WIN_FUNC MoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName); BOOL WINAPI MoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName);
DWORD WIN_FUNC SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod); DWORD WINAPI SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);
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); DWORD dwMoveMethod);
BOOL WIN_FUNC SetEndOfFile(HANDLE hFile); BOOL WINAPI SetEndOfFile(HANDLE hFile);
BOOL WIN_FUNC CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes); BOOL WINAPI CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
BOOL WIN_FUNC RemoveDirectoryA(LPCSTR lpPathName); BOOL WINAPI RemoveDirectoryA(LPCSTR lpPathName);
BOOL WIN_FUNC SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes); BOOL WINAPI SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes);
DWORD WIN_FUNC GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh); DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);
BOOL WIN_FUNC GetFileTime(HANDLE hFile, LPFILETIME lpCreationTime, LPFILETIME lpLastAccessTime, BOOL WINAPI GetFileTime(HANDLE hFile, LPFILETIME lpCreationTime, LPFILETIME lpLastAccessTime,
LPFILETIME lpLastWriteTime); 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); const FILETIME *lpLastWriteTime);
BOOL WIN_FUNC GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation); BOOL WINAPI GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation);
DWORD WIN_FUNC GetFileType(HANDLE hFile); DWORD WINAPI GetFileType(HANDLE hFile);
LONG WIN_FUNC CompareFileTime(const FILETIME *lpFileTime1, const FILETIME *lpFileTime2); LONG WINAPI CompareFileTime(const FILETIME *lpFileTime1, const FILETIME *lpFileTime2);
BOOL WIN_FUNC GetVolumeInformationA(LPCSTR lpRootPathName, LPSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, BOOL WINAPI GetVolumeInformationA(LPCSTR lpRootPathName, LPSTR lpVolumeNameBuffer, DWORD nVolumeNameSize,
LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags, LPSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize); 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 lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags, LPWSTR lpFileSystemNameBuffer, LPDWORD lpFileSystemFlags, LPWSTR lpFileSystemNameBuffer,
DWORD nFileSystemNameSize); DWORD nFileSystemNameSize);

View File

@@ -10,7 +10,7 @@
namespace kernel32 { 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) { LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("DuplicateHandle(%p, %p, %p, %p, %x, %d, %x)\n", hSourceProcessHandle, hSourceHandle, 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; return TRUE;
} }
BOOL WIN_FUNC CloseHandle(HANDLE hObject) { BOOL WINAPI CloseHandle(HANDLE hObject) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("CloseHandle(%p)\n", hObject); DEBUG_LOG("CloseHandle(%p)\n", hObject);
if (!wibo::handles().release(hObject)) { if (!wibo::handles().release(hObject)) {

View File

@@ -1,11 +1,11 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC CloseHandle(HANDLE hObject); BOOL WINAPI CloseHandle(HANDLE hObject);
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); LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOptions);
} // namespace kernel32 } // namespace kernel32

View File

@@ -7,6 +7,7 @@
#include "internal.h" #include "internal.h"
#include <algorithm> #include <algorithm>
#include <cstring>
#include <mimalloc.h> #include <mimalloc.h>
#include <mutex> #include <mutex>
#include <sys/mman.h> #include <sys/mman.h>
@@ -75,7 +76,7 @@ HeapObject::~HeapObject() {
namespace kernel32 { 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("HeapCreate(%u, %zu, %zu)\n", flOptions, dwInitialSize, dwMaximumSize); DEBUG_LOG("HeapCreate(%u, %zu, %zu)\n", flOptions, dwInitialSize, dwMaximumSize);
if (dwMaximumSize != 0 && 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); return wibo::handles().alloc(std::move(record), 0, 0);
} }
BOOL WIN_FUNC HeapDestroy(HANDLE hHeap) { BOOL WINAPI HeapDestroy(HANDLE hHeap) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("HeapDestroy(%p)\n", hHeap); DEBUG_LOG("HeapDestroy(%p)\n", hHeap);
auto record = wibo::handles().getAs<HeapObject>(hHeap); auto record = wibo::handles().getAs<HeapObject>(hHeap);
@@ -110,14 +111,14 @@ BOOL WIN_FUNC HeapDestroy(HANDLE hHeap) {
return TRUE; return TRUE;
} }
HANDLE WIN_FUNC GetProcessHeap() { HANDLE WINAPI GetProcessHeap() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
ensureProcessHeapInitialized(); ensureProcessHeapInitialized();
DEBUG_LOG("GetProcessHeap() -> %p\n", g_processHeapHandle); DEBUG_LOG("GetProcessHeap() -> %p\n", g_processHeapHandle);
return g_processHeapHandle; return g_processHeapHandle;
} }
BOOL WIN_FUNC HeapSetInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, PVOID HeapInformation, BOOL WINAPI HeapSetInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, PVOID HeapInformation,
SIZE_T HeapInformationLength) { SIZE_T HeapInformationLength) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("HeapSetInformation(%p, %d, %p, %zu)\n", HeapHandle, static_cast<int>(HeapInformationClass), DEBUG_LOG("HeapSetInformation(%p, %d, %p, %zu)\n", HeapHandle, static_cast<int>(HeapInformationClass),
@@ -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(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("HeapAlloc(%p, 0x%x, %zu) ", hHeap, dwFlags, dwBytes); VERBOSE_LOG("HeapAlloc(%p, 0x%x, %zu) ", hHeap, dwFlags, dwBytes);
auto record = wibo::handles().getAs<HeapObject>(hHeap); auto record = wibo::handles().getAs<HeapObject>(hHeap);
@@ -161,7 +162,7 @@ LPVOID WIN_FUNC HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes) {
return mem; 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(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("HeapReAlloc(%p, 0x%x, %p, %zu) ", hHeap, dwFlags, lpMem, dwBytes); VERBOSE_LOG("HeapReAlloc(%p, 0x%x, %p, %zu) ", hHeap, dwFlags, lpMem, dwBytes);
auto record = wibo::handles().getAs<HeapObject>(hHeap); auto record = wibo::handles().getAs<HeapObject>(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); size_t newUsable = mi_usable_size(ret);
if (newUsable > oldSize) { if (newUsable > oldSize) {
size_t zeroLen = std::min<SIZE_T>(newUsable, requestSize) - oldSize; size_t zeroLen = std::min<SIZE_T>(newUsable, requestSize) - oldSize;
memset(static_cast<char *>(ret) + oldSize, 0, zeroLen); std::memset(static_cast<char *>(ret) + oldSize, 0, zeroLen);
} }
} }
if (isExecutableHeap(record.get())) { if (isExecutableHeap(record.get())) {
@@ -229,7 +230,7 @@ LPVOID WIN_FUNC HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, SIZE_T dw
return ret; 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(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("HeapSize(%p, 0x%x, %p)\n", hHeap, dwFlags, lpMem); VERBOSE_LOG("HeapSize(%p, 0x%x, %p)\n", hHeap, dwFlags, lpMem);
(void)dwFlags; (void)dwFlags;
@@ -253,7 +254,7 @@ SIZE_T WIN_FUNC HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem) {
return static_cast<SIZE_T>(size); return static_cast<SIZE_T>(size);
} }
BOOL WIN_FUNC HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) { BOOL WINAPI HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("HeapFree(%p, 0x%x, %p)\n", hHeap, dwFlags, lpMem); VERBOSE_LOG("HeapFree(%p, 0x%x, %p)\n", hHeap, dwFlags, lpMem);
(void)dwFlags; (void)dwFlags;

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
constexpr DWORD HEAP_NO_SERIALIZE = 0x00000001; constexpr DWORD HEAP_NO_SERIALIZE = 0x00000001;
constexpr DWORD HEAP_GENERATE_EXCEPTIONS = 0x00000004; constexpr DWORD HEAP_GENERATE_EXCEPTIONS = 0x00000004;
@@ -16,14 +16,14 @@ enum HEAP_INFORMATION_CLASS {
namespace kernel32 { 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);
BOOL WIN_FUNC HeapDestroy(HANDLE hHeap); BOOL WINAPI HeapDestroy(HANDLE hHeap);
HANDLE WIN_FUNC GetProcessHeap(); HANDLE WINAPI GetProcessHeap();
BOOL WIN_FUNC HeapSetInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, PVOID HeapInformation, BOOL WINAPI HeapSetInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, PVOID HeapInformation,
SIZE_T HeapInformationLength); SIZE_T HeapInformationLength);
LPVOID WIN_FUNC HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes); LPVOID WINAPI HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);
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);
SIZE_T WIN_FUNC HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem); SIZE_T WINAPI HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem);
BOOL WIN_FUNC HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem); BOOL WINAPI HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem);
} // namespace kernel32 } // namespace kernel32

View File

@@ -8,28 +8,28 @@
namespace kernel32 { namespace kernel32 {
LONG WIN_FUNC InterlockedIncrement(LONG volatile *Addend) { LONG WINAPI InterlockedIncrement(LONG volatile *Addend) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("InterlockedIncrement(%p)\n", Addend); VERBOSE_LOG("InterlockedIncrement(%p)\n", Addend);
std::atomic_ref<LONG> a(*const_cast<LONG *>(Addend)); std::atomic_ref<LONG> a(*const_cast<LONG *>(Addend));
return a.fetch_add(1, std::memory_order_seq_cst) + 1; 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(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("InterlockedDecrement(%p)\n", Addend); VERBOSE_LOG("InterlockedDecrement(%p)\n", Addend);
std::atomic_ref<LONG> a(*const_cast<LONG *>(Addend)); std::atomic_ref<LONG> a(*const_cast<LONG *>(Addend));
return a.fetch_sub(1, std::memory_order_seq_cst) - 1; 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(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("InterlockedExchange(%p, %ld)\n", Target, static_cast<long>(Value)); VERBOSE_LOG("InterlockedExchange(%p, %ld)\n", Target, static_cast<long>(Value));
std::atomic_ref<LONG> a(*const_cast<LONG *>(Target)); std::atomic_ref<LONG> a(*const_cast<LONG *>(Target));
return a.exchange(Value, std::memory_order_seq_cst); 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(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("InterlockedCompareExchange(%p, %ld, %ld)\n", Destination, static_cast<long>(Exchange), VERBOSE_LOG("InterlockedCompareExchange(%p, %ld, %ld)\n", Destination, static_cast<long>(Exchange),
static_cast<long>(Comperand)); static_cast<long>(Comperand));
@@ -40,7 +40,7 @@ LONG WIN_FUNC InterlockedCompareExchange(LONG volatile *Destination, LONG Exchan
return expected; return expected;
} }
void WIN_FUNC InitializeSListHead(PSLIST_HEADER ListHead) { void WINAPI InitializeSListHead(PSLIST_HEADER ListHead) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("InitializeSListHead(%p)\n", ListHead); DEBUG_LOG("InitializeSListHead(%p)\n", ListHead);
if (!ListHead) { if (!ListHead) {

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
namespace kernel32 { namespace kernel32 {
@@ -18,10 +18,10 @@ struct SLIST_HEADER {
using PSLIST_HEADER = SLIST_HEADER *; using PSLIST_HEADER = SLIST_HEADER *;
LONG WIN_FUNC InterlockedIncrement(LONG volatile *Addend); LONG WINAPI InterlockedIncrement(LONG volatile *Addend);
LONG WIN_FUNC InterlockedDecrement(LONG volatile *Addend); LONG WINAPI InterlockedDecrement(LONG volatile *Addend);
LONG WIN_FUNC InterlockedExchange(LONG volatile *Target, LONG Value); LONG WINAPI InterlockedExchange(LONG volatile *Target, LONG Value);
LONG WIN_FUNC InterlockedCompareExchange(LONG volatile *Destination, LONG Exchange, LONG Comperand); LONG WINAPI InterlockedCompareExchange(LONG volatile *Destination, LONG Exchange, LONG Comperand);
void WIN_FUNC InitializeSListHead(PSLIST_HEADER ListHead); void WINAPI InitializeSListHead(PSLIST_HEADER ListHead);
} // namespace kernel32 } // namespace kernel32

View File

@@ -3,6 +3,7 @@
#include "common.h" #include "common.h"
#include "handles.h" #include "handles.h"
#include "mimalloc.h" #include "mimalloc.h"
#include "types.h"
#include <condition_variable> #include <condition_variable>
#include <pthread.h> #include <pthread.h>
@@ -80,7 +81,7 @@ struct ThreadObject final : WaitableObject {
pthread_t thread; pthread_t thread;
DWORD exitCode = STILL_ACTIVE; DWORD exitCode = STILL_ACTIVE;
unsigned int suspendCount = 0; unsigned int suspendCount = 0;
TIB *tib = nullptr; TEB *tib = nullptr;
explicit ThreadObject(pthread_t thread) : WaitableObject(kType), thread(thread) {} explicit ThreadObject(pthread_t thread) : WaitableObject(kType), thread(thread) {}

View File

@@ -10,7 +10,7 @@
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, BOOL WINAPI GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred,
BOOL bWait) { BOOL bWait) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetOverlappedResult(%p, %p, %p, %d)\n", hFile, lpOverlapped, lpNumberOfBytesTransferred, bWait); DEBUG_LOG("GetOverlappedResult(%p, %p, %p, %d)\n", hFile, lpOverlapped, lpNumberOfBytesTransferred, bWait);

View File

@@ -1,11 +1,11 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
#include "minwinbase.h" #include "minwinbase.h"
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, BOOL WINAPI GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred,
BOOL bWait); BOOL bWait);
} // namespace kernel32 } // namespace kernel32

View File

@@ -9,6 +9,7 @@
#include <algorithm> #include <algorithm>
#include <cassert> #include <cassert>
#include <cstring>
#include <optional> #include <optional>
#include <string> #include <string>
@@ -32,7 +33,7 @@ HRSRC findResourceInternal(HMODULE hModule, const wibo::ResourceIdentifier &type
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC DisableThreadLibraryCalls(HMODULE hLibModule) { BOOL WINAPI DisableThreadLibraryCalls(HMODULE hLibModule) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("DisableThreadLibraryCalls(%p)\n", hLibModule); DEBUG_LOG("DisableThreadLibraryCalls(%p)\n", hLibModule);
if (!hLibModule) { if (!hLibModule) {
@@ -51,7 +52,7 @@ BOOL WIN_FUNC DisableThreadLibraryCalls(HMODULE hLibModule) {
return TRUE; return TRUE;
} }
HMODULE WIN_FUNC GetModuleHandleA(LPCSTR lpModuleName) { HMODULE WINAPI GetModuleHandleA(LPCSTR lpModuleName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetModuleHandleA(%s)\n", lpModuleName); DEBUG_LOG("GetModuleHandleA(%s)\n", lpModuleName);
const auto *module = wibo::findLoadedModule(lpModuleName); const auto *module = wibo::findLoadedModule(lpModuleName);
@@ -62,7 +63,7 @@ HMODULE WIN_FUNC GetModuleHandleA(LPCSTR lpModuleName) {
return module->handle; return module->handle;
} }
HMODULE WIN_FUNC GetModuleHandleW(LPCWSTR lpModuleName) { HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetModuleHandleW -> "); DEBUG_LOG("GetModuleHandleW -> ");
if (lpModuleName) { if (lpModuleName) {
@@ -72,7 +73,7 @@ HMODULE WIN_FUNC GetModuleHandleW(LPCWSTR lpModuleName) {
return GetModuleHandleA(nullptr); 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetModuleFileNameA(%p, %p, %u)\n", hModule, lpFilename, nSize); DEBUG_LOG("GetModuleFileNameA(%p, %p, %u)\n", hModule, lpFilename, nSize);
if (!lpFilename) { if (!lpFilename) {
@@ -108,7 +109,7 @@ DWORD WIN_FUNC GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize
return static_cast<DWORD>(copyLen); return static_cast<DWORD>(copyLen);
} }
DWORD WIN_FUNC GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSize) { DWORD WINAPI GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetModuleFileNameW(%p, %s, %u)\n", hModule, wideStringToString(lpFilename).c_str(), nSize); DEBUG_LOG("GetModuleFileNameW(%p, %s, %u)\n", hModule, wideStringToString(lpFilename).c_str(), nSize);
if (!lpFilename) { if (!lpFilename) {
@@ -149,7 +150,7 @@ DWORD WIN_FUNC GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSiz
return static_cast<DWORD>(copyLen); return static_cast<DWORD>(copyLen);
} }
HRSRC WIN_FUNC FindResourceA(HMODULE hModule, LPCSTR lpName, LPCSTR lpType) { HRSRC WINAPI FindResourceA(HMODULE hModule, LPCSTR lpName, LPCSTR lpType) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FindResourceA %p %p %p\n", hModule, lpName, lpType); DEBUG_LOG("FindResourceA %p %p %p\n", hModule, lpName, lpType);
auto type = wibo::resourceIdentifierFromAnsi(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); 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FindResourceExA %p %p %p %u\n", hModule, lpName, lpType, wLanguage); DEBUG_LOG("FindResourceExA %p %p %p %u\n", hModule, lpName, lpType, wLanguage);
auto type = wibo::resourceIdentifierFromAnsi(lpType); 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); 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FindResourceW %p\n", hModule); DEBUG_LOG("FindResourceW %p\n", hModule);
auto type = wibo::resourceIdentifierFromWide(lpType); 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); 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FindResourceExW %p %u\n", hModule, wLanguage); DEBUG_LOG("FindResourceExW %p %u\n", hModule, wLanguage);
auto type = wibo::resourceIdentifierFromWide(lpType); 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); return findResourceInternal(hModule, type, name, wLanguage);
} }
HGLOBAL WIN_FUNC LoadResource(HMODULE hModule, HRSRC hResInfo) { HGLOBAL WINAPI LoadResource(HMODULE hModule, HRSRC hResInfo) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("LoadResource %p %p\n", hModule, hResInfo); DEBUG_LOG("LoadResource %p %p\n", hModule, hResInfo);
if (!hResInfo) { if (!hResInfo) {
@@ -201,13 +202,13 @@ HGLOBAL WIN_FUNC LoadResource(HMODULE hModule, HRSRC hResInfo) {
return const_cast<void *>(exe->fromRVA<const void>(entry->offsetToData)); return const_cast<void *>(exe->fromRVA<const void>(entry->offsetToData));
} }
LPVOID WIN_FUNC LockResource(HGLOBAL hResData) { LPVOID WINAPI LockResource(HGLOBAL hResData) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("LockResource(%p)\n", hResData); DEBUG_LOG("LockResource(%p)\n", hResData);
return hResData; return hResData;
} }
DWORD WIN_FUNC SizeofResource(HMODULE hModule, HRSRC hResInfo) { DWORD WINAPI SizeofResource(HMODULE hModule, HRSRC hResInfo) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SizeofResource(%p, %p)\n", hModule, hResInfo); DEBUG_LOG("SizeofResource(%p, %p)\n", hModule, hResInfo);
if (!hResInfo) { if (!hResInfo) {
@@ -227,7 +228,7 @@ DWORD WIN_FUNC SizeofResource(HMODULE hModule, HRSRC hResInfo) {
return entry->size; return entry->size;
} }
HMODULE WIN_FUNC LoadLibraryA(LPCSTR lpLibFileName) { HMODULE WINAPI LoadLibraryA(LPCSTR lpLibFileName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("LoadLibraryA(%s)\n", lpLibFileName); DEBUG_LOG("LoadLibraryA(%s)\n", lpLibFileName);
const auto *info = wibo::loadModule(lpLibFileName); const auto *info = wibo::loadModule(lpLibFileName);
@@ -238,7 +239,7 @@ HMODULE WIN_FUNC LoadLibraryA(LPCSTR lpLibFileName) {
return info->handle; return info->handle;
} }
HMODULE WIN_FUNC LoadLibraryW(LPCWSTR lpLibFileName) { HMODULE WINAPI LoadLibraryW(LPCWSTR lpLibFileName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
if (!lpLibFileName) { if (!lpLibFileName) {
return nullptr; return nullptr;
@@ -248,7 +249,7 @@ HMODULE WIN_FUNC LoadLibraryW(LPCWSTR lpLibFileName) {
return LoadLibraryA(filename.c_str()); 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(); HOST_CONTEXT_GUARD();
(void)hFile; (void)hFile;
// TOOD: handle dwFlags properly // TOOD: handle dwFlags properly
@@ -257,7 +258,7 @@ HMODULE WIN_FUNC LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFla
return LoadLibraryA(filename.c_str()); return LoadLibraryA(filename.c_str());
} }
BOOL WIN_FUNC FreeLibrary(HMODULE hLibModule) { BOOL WINAPI FreeLibrary(HMODULE hLibModule) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FreeLibrary(%p)\n", hLibModule); DEBUG_LOG("FreeLibrary(%p)\n", hLibModule);
auto *info = wibo::moduleInfoFromHandle(hLibModule); auto *info = wibo::moduleInfoFromHandle(hLibModule);
@@ -269,7 +270,7 @@ BOOL WIN_FUNC FreeLibrary(HMODULE hLibModule) {
return TRUE; return TRUE;
} }
FARPROC WIN_FUNC GetProcAddress(HMODULE hModule, LPCSTR lpProcName) { FARPROC WINAPI GetProcAddress(HMODULE hModule, LPCSTR lpProcName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
FARPROC result; FARPROC result;
const auto info = wibo::moduleInfoFromHandle(hModule); const auto info = wibo::moduleInfoFromHandle(hModule);

View File

@@ -1,25 +1,25 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC DisableThreadLibraryCalls(HMODULE hLibModule); BOOL WINAPI DisableThreadLibraryCalls(HMODULE hLibModule);
HMODULE WIN_FUNC GetModuleHandleA(LPCSTR lpModuleName); HMODULE WINAPI GetModuleHandleA(LPCSTR lpModuleName);
HMODULE WIN_FUNC GetModuleHandleW(LPCWSTR lpModuleName); HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName);
DWORD WIN_FUNC GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize); DWORD WINAPI GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize);
DWORD WIN_FUNC GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSize); DWORD WINAPI GetModuleFileNameW(HMODULE hModule, LPWSTR lpFilename, DWORD nSize);
HRSRC WIN_FUNC FindResourceA(HMODULE hModule, LPCSTR lpName, LPCSTR lpType); HRSRC WINAPI FindResourceA(HMODULE hModule, LPCSTR lpName, LPCSTR lpType);
HRSRC WIN_FUNC FindResourceExA(HMODULE hModule, LPCSTR lpType, LPCSTR lpName, WORD wLanguage); HRSRC WINAPI FindResourceExA(HMODULE hModule, LPCSTR lpType, LPCSTR lpName, WORD wLanguage);
HRSRC WIN_FUNC FindResourceW(HMODULE hModule, LPCWSTR lpName, LPCWSTR lpType); HRSRC WINAPI FindResourceW(HMODULE hModule, LPCWSTR lpName, LPCWSTR lpType);
HRSRC WIN_FUNC FindResourceExW(HMODULE hModule, LPCWSTR lpType, LPCWSTR lpName, WORD wLanguage); HRSRC WINAPI FindResourceExW(HMODULE hModule, LPCWSTR lpType, LPCWSTR lpName, WORD wLanguage);
HGLOBAL WIN_FUNC LoadResource(HMODULE hModule, HRSRC hResInfo); HGLOBAL WINAPI LoadResource(HMODULE hModule, HRSRC hResInfo);
LPVOID WIN_FUNC LockResource(HGLOBAL hResData); LPVOID WINAPI LockResource(HGLOBAL hResData);
DWORD WIN_FUNC SizeofResource(HMODULE hModule, HRSRC hResInfo); DWORD WINAPI SizeofResource(HMODULE hModule, HRSRC hResInfo);
HMODULE WIN_FUNC LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI LoadLibraryA(LPCSTR lpLibFileName);
HMODULE WIN_FUNC LoadLibraryW(LPCWSTR lpLibFileName); HMODULE WINAPI LoadLibraryW(LPCWSTR lpLibFileName);
HMODULE WIN_FUNC LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); HMODULE WINAPI LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);
BOOL WIN_FUNC FreeLibrary(HMODULE hLibModule); BOOL WINAPI FreeLibrary(HMODULE hLibModule);
FARPROC WIN_FUNC GetProcAddress(HMODULE hModule, LPCSTR lpProcName); FARPROC WINAPI GetProcAddress(HMODULE hModule, LPCSTR lpProcName);
} // namespace kernel32 } // namespace kernel32

View File

@@ -9,6 +9,7 @@
#include "strutil.h" #include "strutil.h"
#include <cerrno> #include <cerrno>
#include <cstring>
#include <fcntl.h> #include <fcntl.h>
#include <iterator> #include <iterator>
#include <limits> #include <limits>
@@ -462,7 +463,7 @@ int translateProtect(DWORD flProtect) {
namespace kernel32 { 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) { DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("CreateFileMappingA(%p, %p, %u, %u, %u, %s)\n", hFile, lpFileMappingAttributes, flProtect, 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); 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) { DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCWSTR lpName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("CreateFileMappingW -> "); DEBUG_LOG("CreateFileMappingW -> ");
@@ -659,7 +660,7 @@ static LPVOID mapViewOfFileInternal(Pin<MappingObject> mapping, DWORD dwDesiredA
return viewPtr; 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) { DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("MapViewOfFile(%p, 0x%x, %u, %u, %zu)\n", hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, 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); 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) { DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap, LPVOID lpBaseAddress) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("MapViewOfFileEx(%p, 0x%x, %u, %u, %zu, %p)\n", hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, 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); return mapViewOfFileInternal(std::move(mapping), dwDesiredAccess, offset, dwNumberOfBytesToMap, lpBaseAddress);
} }
BOOL WIN_FUNC UnmapViewOfFile(LPCVOID lpBaseAddress) { BOOL WINAPI UnmapViewOfFile(LPCVOID lpBaseAddress) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("UnmapViewOfFile(%p)\n", lpBaseAddress); DEBUG_LOG("UnmapViewOfFile(%p)\n", lpBaseAddress);
std::unique_lock lk(g_viewInfoMutex); std::unique_lock lk(g_viewInfoMutex);
@@ -708,7 +709,7 @@ BOOL WIN_FUNC UnmapViewOfFile(LPCVOID lpBaseAddress) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC FlushViewOfFile(LPCVOID lpBaseAddress, SIZE_T dwNumberOfBytesToFlush) { BOOL WINAPI FlushViewOfFile(LPCVOID lpBaseAddress, SIZE_T dwNumberOfBytesToFlush) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FlushViewOfFile(%p, %zu)\n", lpBaseAddress, dwNumberOfBytesToFlush); DEBUG_LOG("FlushViewOfFile(%p, %zu)\n", lpBaseAddress, dwNumberOfBytesToFlush);
@@ -783,7 +784,7 @@ BOOL WIN_FUNC FlushViewOfFile(LPCVOID lpBaseAddress, SIZE_T dwNumberOfBytesToFlu
return TRUE; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("VirtualAlloc(%p, %zu, %u, %u)\n", lpAddress, dwSize, flAllocationType, flProtect); 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<LPVOID>(start); return reinterpret_cast<LPVOID>(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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("VirtualFree(%p, %zu, %u)\n", lpAddress, dwSize, dwFreeType); DEBUG_LOG("VirtualFree(%p, %zu, %u)\n", lpAddress, dwSize, dwFreeType);
if (!lpAddress) { if (!lpAddress) {
@@ -1061,7 +1062,7 @@ BOOL WIN_FUNC VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) {
return TRUE; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("VirtualProtect(%p, %zu, %u)\n", lpAddress, dwSize, flNewProtect); DEBUG_LOG("VirtualProtect(%p, %zu, %u)\n", lpAddress, dwSize, flNewProtect);
if (!lpAddress || dwSize == 0) { if (!lpAddress || dwSize == 0) {
@@ -1120,7 +1121,7 @@ BOOL WIN_FUNC VirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect
return TRUE; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("VirtualQuery(%p, %p, %zu)\n", lpAddress, lpBuffer, dwLength); DEBUG_LOG("VirtualQuery(%p, %p, %zu)\n", lpAddress, lpBuffer, dwLength);
if (!lpBuffer || dwLength < sizeof(MEMORY_BASIC_INFORMATION)) { if (!lpBuffer || dwLength < sizeof(MEMORY_BASIC_INFORMATION)) {
@@ -1158,7 +1159,7 @@ SIZE_T WIN_FUNC VirtualQuery(LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuff
return 0; return 0;
} }
BOOL WIN_FUNC GetProcessWorkingSetSize(HANDLE hProcess, PSIZE_T lpMinimumWorkingSetSize, BOOL WINAPI GetProcessWorkingSetSize(HANDLE hProcess, PSIZE_T lpMinimumWorkingSetSize,
PSIZE_T lpMaximumWorkingSetSize) { PSIZE_T lpMaximumWorkingSetSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetProcessWorkingSetSize(%p, %p, %p)\n", hProcess, lpMinimumWorkingSetSize, lpMaximumWorkingSetSize); 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; return TRUE;
} }
BOOL WIN_FUNC SetProcessWorkingSetSize(HANDLE hProcess, SIZE_T dwMinimumWorkingSetSize, BOOL WINAPI SetProcessWorkingSetSize(HANDLE hProcess, SIZE_T dwMinimumWorkingSetSize,
SIZE_T dwMaximumWorkingSetSize) { SIZE_T dwMaximumWorkingSetSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetProcessWorkingSetSize(%p, %zu, %zu)\n", hProcess, dwMinimumWorkingSetSize, dwMaximumWorkingSetSize); DEBUG_LOG("SetProcessWorkingSetSize(%p, %zu, %zu)\n", hProcess, dwMinimumWorkingSetSize, dwMaximumWorkingSetSize);

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
#include "minwinbase.h" #include "minwinbase.h"
struct MEMORY_BASIC_INFORMATION { struct MEMORY_BASIC_INFORMATION {
@@ -17,23 +17,23 @@ using PMEMORY_BASIC_INFORMATION = MEMORY_BASIC_INFORMATION *;
namespace kernel32 { 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); 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); 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); 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); DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap, LPVOID lpBaseAddress);
BOOL WIN_FUNC UnmapViewOfFile(LPCVOID lpBaseAddress); BOOL WINAPI UnmapViewOfFile(LPCVOID lpBaseAddress);
BOOL WIN_FUNC FlushViewOfFile(LPCVOID lpBaseAddress, SIZE_T dwNumberOfBytesToFlush); BOOL WINAPI FlushViewOfFile(LPCVOID lpBaseAddress, SIZE_T dwNumberOfBytesToFlush);
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);
BOOL WIN_FUNC VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType); BOOL WINAPI VirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);
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);
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);
BOOL WIN_FUNC GetProcessWorkingSetSize(HANDLE hProcess, PSIZE_T lpMinimumWorkingSetSize, BOOL WINAPI GetProcessWorkingSetSize(HANDLE hProcess, PSIZE_T lpMinimumWorkingSetSize,
PSIZE_T lpMaximumWorkingSetSize); 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 } // namespace kernel32

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
struct SECURITY_ATTRIBUTES { struct SECURITY_ATTRIBUTES {
DWORD nLength; DWORD nLength;
@@ -56,8 +56,8 @@ struct WIN32_FIND_DATAA {
DWORD nFileSizeLow; DWORD nFileSizeLow;
DWORD dwReserved0; DWORD dwReserved0;
DWORD dwReserved1; DWORD dwReserved1;
char cFileName[MAX_PATH]; CHAR cFileName[MAX_PATH];
char cAlternateFileName[14]; CHAR cAlternateFileName[14];
}; };
struct WIN32_FIND_DATAW { struct WIN32_FIND_DATAW {

View File

@@ -348,7 +348,7 @@ bool tryCreateFileNamedPipeA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwS
return true; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("CreatePipe(%p, %p, %p, %u)\n", hReadPipe, hWritePipe, lpPipeAttributes, nSize); DEBUG_LOG("CreatePipe(%p, %p, %p, %u)\n", hReadPipe, hWritePipe, lpPipeAttributes, nSize);
if (!hReadPipe || !hWritePipe) { if (!hReadPipe || !hWritePipe) {
@@ -383,7 +383,7 @@ BOOL WIN_FUNC CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe, LPSECURITY_ATTRI
return TRUE; 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, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut,
LPSECURITY_ATTRIBUTES lpSecurityAttributes) { LPSECURITY_ATTRIBUTES lpSecurityAttributes) {
HOST_CONTEXT_GUARD(); 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); 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("ConnectNamedPipe(%p, %p)\n", hNamedPipe, lpOverlapped); DEBUG_LOG("ConnectNamedPipe(%p, %p)\n", hNamedPipe, lpOverlapped);

View File

@@ -1,15 +1,15 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
#include "minwinbase.h" #include "minwinbase.h"
namespace kernel32 { namespace kernel32 {
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);
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, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut,
LPSECURITY_ATTRIBUTES lpSecurityAttributes); 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, bool tryCreateFileNamedPipeA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, HANDLE &outHandle); DWORD dwFlagsAndAttributes, HANDLE &outHandle);

View File

@@ -41,31 +41,31 @@ std::string convertEnvValueToHost(const std::string &name, const char *rawValue)
namespace kernel32 { namespace kernel32 {
LPSTR WIN_FUNC GetCommandLineA() { LPSTR WINAPI GetCommandLineA() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetCommandLineA() -> %s\n", wibo::commandLine.c_str()); DEBUG_LOG("GetCommandLineA() -> %s\n", wibo::commandLine.c_str());
return const_cast<LPSTR>(wibo::commandLine.c_str()); return const_cast<LPSTR>(wibo::commandLine.c_str());
} }
LPWSTR WIN_FUNC GetCommandLineW() { LPWSTR WINAPI GetCommandLineW() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetCommandLineW() -> %s\n", wideStringToString(wibo::commandLineW.data()).c_str()); DEBUG_LOG("GetCommandLineW() -> %s\n", wideStringToString(wibo::commandLineW.data()).c_str());
return wibo::commandLineW.data(); return wibo::commandLineW.data();
} }
HANDLE WIN_FUNC GetStdHandle(DWORD nStdHandle) { HANDLE WINAPI GetStdHandle(DWORD nStdHandle) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetStdHandle(%d)\n", nStdHandle); DEBUG_LOG("GetStdHandle(%d)\n", nStdHandle);
return files::getStdHandle(nStdHandle); return files::getStdHandle(nStdHandle);
} }
BOOL WIN_FUNC SetStdHandle(DWORD nStdHandle, HANDLE hHandle) { BOOL WINAPI SetStdHandle(DWORD nStdHandle, HANDLE hHandle) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetStdHandle(%d, %p)\n", nStdHandle, hHandle); DEBUG_LOG("SetStdHandle(%d, %p)\n", nStdHandle, hHandle);
return files::setStdHandle(nStdHandle, hHandle); return files::setStdHandle(nStdHandle, hHandle);
} }
LPCH WIN_FUNC GetEnvironmentStrings() { LPCH WINAPI GetEnvironmentStrings() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetEnvironmentStrings()\n"); DEBUG_LOG("GetEnvironmentStrings()\n");
@@ -98,7 +98,7 @@ LPCH WIN_FUNC GetEnvironmentStrings() {
return buffer; return buffer;
} }
LPWCH WIN_FUNC GetEnvironmentStringsW() { LPWCH WINAPI GetEnvironmentStringsW() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetEnvironmentStringsW()\n"); DEBUG_LOG("GetEnvironmentStringsW()\n");
@@ -133,7 +133,7 @@ LPWCH WIN_FUNC GetEnvironmentStringsW() {
return buffer; return buffer;
} }
BOOL WIN_FUNC FreeEnvironmentStringsA(LPCH penv) { BOOL WINAPI FreeEnvironmentStringsA(LPCH penv) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FreeEnvironmentStringsA(%p)\n", penv); DEBUG_LOG("FreeEnvironmentStringsA(%p)\n", penv);
if (!penv) { if (!penv) {
@@ -144,7 +144,7 @@ BOOL WIN_FUNC FreeEnvironmentStringsA(LPCH penv) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC FreeEnvironmentStringsW(LPWCH penv) { BOOL WINAPI FreeEnvironmentStringsW(LPWCH penv) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FreeEnvironmentStringsW(%p)\n", penv); DEBUG_LOG("FreeEnvironmentStringsW(%p)\n", penv);
if (!penv) { if (!penv) {
@@ -155,7 +155,7 @@ BOOL WIN_FUNC FreeEnvironmentStringsW(LPWCH penv) {
return TRUE; return TRUE;
} }
DWORD WIN_FUNC GetEnvironmentVariableA(LPCSTR lpName, LPSTR lpBuffer, DWORD nSize) { DWORD WINAPI GetEnvironmentVariableA(LPCSTR lpName, LPSTR lpBuffer, DWORD nSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetEnvironmentVariableA(%s, %p, %u)\n", lpName ? lpName : "(null)", lpBuffer, nSize); DEBUG_LOG("GetEnvironmentVariableA(%s, %p, %u)\n", lpName ? lpName : "(null)", lpBuffer, nSize);
if (!lpName) { if (!lpName) {
@@ -184,7 +184,7 @@ DWORD WIN_FUNC GetEnvironmentVariableA(LPCSTR lpName, LPSTR lpBuffer, DWORD nSiz
return len; return len;
} }
DWORD WIN_FUNC GetEnvironmentVariableW(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize) { DWORD WINAPI GetEnvironmentVariableW(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
std::string name = lpName ? wideStringToString(lpName) : std::string(); std::string name = lpName ? wideStringToString(lpName) : std::string();
DEBUG_LOG("GetEnvironmentVariableW(%s, %p, %u)\n", name.c_str(), lpBuffer, nSize); 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; return required - 1;
} }
BOOL WIN_FUNC SetEnvironmentVariableA(LPCSTR lpName, LPCSTR lpValue) { BOOL WINAPI SetEnvironmentVariableA(LPCSTR lpName, LPCSTR lpValue) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetEnvironmentVariableA(%s, %s)\n", lpName ? lpName : "(null)", lpValue ? lpValue : "(null)"); DEBUG_LOG("SetEnvironmentVariableA(%s, %s)\n", lpName ? lpName : "(null)", lpValue ? lpValue : "(null)");
if (!lpName || std::strchr(lpName, '=')) { if (!lpName || std::strchr(lpName, '=')) {
@@ -241,7 +241,7 @@ BOOL WIN_FUNC SetEnvironmentVariableA(LPCSTR lpName, LPCSTR lpValue) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC SetEnvironmentVariableW(LPCWSTR lpName, LPCWSTR lpValue) { BOOL WINAPI SetEnvironmentVariableW(LPCWSTR lpName, LPCWSTR lpValue) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetEnvironmentVariableW -> "); DEBUG_LOG("SetEnvironmentVariableW -> ");
if (!lpName) { if (!lpName) {

View File

@@ -1,20 +1,20 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
namespace kernel32 { namespace kernel32 {
LPSTR WIN_FUNC GetCommandLineA(); LPSTR WINAPI GetCommandLineA();
LPWSTR WIN_FUNC GetCommandLineW(); LPWSTR WINAPI GetCommandLineW();
HANDLE WIN_FUNC GetStdHandle(DWORD nStdHandle); HANDLE WINAPI GetStdHandle(DWORD nStdHandle);
BOOL WIN_FUNC SetStdHandle(DWORD nStdHandle, HANDLE hHandle); BOOL WINAPI SetStdHandle(DWORD nStdHandle, HANDLE hHandle);
LPCH WIN_FUNC GetEnvironmentStrings(); LPCH WINAPI GetEnvironmentStrings();
LPWCH WIN_FUNC GetEnvironmentStringsW(); LPWCH WINAPI GetEnvironmentStringsW();
BOOL WIN_FUNC FreeEnvironmentStringsA(LPCH penv); BOOL WINAPI FreeEnvironmentStringsA(LPCH penv);
BOOL WIN_FUNC FreeEnvironmentStringsW(LPWCH penv); BOOL WINAPI FreeEnvironmentStringsW(LPWCH penv);
DWORD WIN_FUNC GetEnvironmentVariableA(LPCSTR lpName, LPSTR lpBuffer, DWORD nSize); DWORD WINAPI GetEnvironmentVariableA(LPCSTR lpName, LPSTR lpBuffer, DWORD nSize);
DWORD WIN_FUNC GetEnvironmentVariableW(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize); DWORD WINAPI GetEnvironmentVariableW(LPCWSTR lpName, LPWSTR lpBuffer, DWORD nSize);
BOOL WIN_FUNC SetEnvironmentVariableA(LPCSTR lpName, LPCSTR lpValue); BOOL WINAPI SetEnvironmentVariableA(LPCSTR lpName, LPCSTR lpValue);
BOOL WIN_FUNC SetEnvironmentVariableW(LPCWSTR lpName, LPCWSTR lpValue); BOOL WINAPI SetEnvironmentVariableW(LPCWSTR lpName, LPCWSTR lpValue);
} // namespace kernel32 } // namespace kernel32

View File

@@ -124,7 +124,7 @@ void *threadTrampoline(void *param) {
g_currentThreadObject = data.obj; g_currentThreadObject = data.obj;
// Install TIB // Install TIB
TIB *threadTib = nullptr; TEB *threadTib = nullptr;
uint16_t previousFs = 0; uint16_t previousFs = 0;
uint16_t previousGs = 0; uint16_t previousGs = 0;
if (wibo::tibSelector) { if (wibo::tibSelector) {
@@ -176,7 +176,7 @@ void *threadTrampoline(void *param) {
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC IsProcessorFeaturePresent(DWORD ProcessorFeature) { BOOL WINAPI IsProcessorFeaturePresent(DWORD ProcessorFeature) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("IsProcessorFeaturePresent(%u)\n", ProcessorFeature); DEBUG_LOG("IsProcessorFeaturePresent(%u)\n", ProcessorFeature);
if (ProcessorFeature == 0) { // PF_FLOATING_POINT_PRECISION_ERRATA if (ProcessorFeature == 0) { // PF_FLOATING_POINT_PRECISION_ERRATA
@@ -192,20 +192,20 @@ BOOL WIN_FUNC IsProcessorFeaturePresent(DWORD ProcessorFeature) {
return TRUE; return TRUE;
} }
HANDLE WIN_FUNC GetCurrentProcess() { HANDLE WINAPI GetCurrentProcess() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetCurrentProcess() -> %p\n", reinterpret_cast<void *>(static_cast<uintptr_t>(-1))); DEBUG_LOG("GetCurrentProcess() -> %p\n", reinterpret_cast<void *>(static_cast<uintptr_t>(-1)));
return reinterpret_cast<HANDLE>(static_cast<uintptr_t>(-1)); return reinterpret_cast<HANDLE>(static_cast<uintptr_t>(-1));
} }
DWORD WIN_FUNC GetCurrentProcessId() { DWORD WINAPI GetCurrentProcessId() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DWORD pid = static_cast<DWORD>(getpid()); DWORD pid = static_cast<DWORD>(getpid());
DEBUG_LOG("GetCurrentProcessId() -> %u\n", pid); DEBUG_LOG("GetCurrentProcessId() -> %u\n", pid);
return pid; return pid;
} }
DWORD WIN_FUNC GetCurrentThreadId() { DWORD WINAPI GetCurrentThreadId() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
pthread_t thread = pthread_self(); pthread_t thread = pthread_self();
const auto threadId = static_cast<DWORD>(thread); const auto threadId = static_cast<DWORD>(thread);
@@ -213,14 +213,14 @@ DWORD WIN_FUNC GetCurrentThreadId() {
return threadId; return threadId;
} }
HANDLE WIN_FUNC GetCurrentThread() { HANDLE WINAPI GetCurrentThread() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
HANDLE pseudoHandle = reinterpret_cast<HANDLE>(kPseudoCurrentThreadHandleValue); HANDLE pseudoHandle = reinterpret_cast<HANDLE>(kPseudoCurrentThreadHandleValue);
DEBUG_LOG("GetCurrentThread() -> %p\n", pseudoHandle); DEBUG_LOG("GetCurrentThread() -> %p\n", pseudoHandle);
return pseudoHandle; return pseudoHandle;
} }
BOOL WIN_FUNC GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR lpProcessAffinityMask, BOOL WINAPI GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR lpProcessAffinityMask,
PDWORD_PTR lpSystemAffinityMask) { PDWORD_PTR lpSystemAffinityMask) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetProcessAffinityMask(%p, %p, %p)\n", hProcess, lpProcessAffinityMask, lpSystemAffinityMask); 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; return TRUE;
} }
BOOL WIN_FUNC SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask) { BOOL WINAPI SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetProcessAffinityMask(%p, 0x%lx)\n", hProcess, static_cast<unsigned long>(dwProcessAffinityMask)); DEBUG_LOG("SetProcessAffinityMask(%p, 0x%lx)\n", hProcess, static_cast<unsigned long>(dwProcessAffinityMask));
if (dwProcessAffinityMask == 0) { if (dwProcessAffinityMask == 0) {
@@ -279,7 +279,7 @@ BOOL WIN_FUNC SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinit
return TRUE; return TRUE;
} }
DWORD_PTR WIN_FUNC SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask) { DWORD_PTR WINAPI SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetThreadAffinityMask(%p, 0x%lx)\n", hThread, static_cast<unsigned long>(dwThreadAffinityMask)); DEBUG_LOG("SetThreadAffinityMask(%p, 0x%lx)\n", hThread, static_cast<unsigned long>(dwThreadAffinityMask));
if (dwThreadAffinityMask == 0) { if (dwThreadAffinityMask == 0) {
@@ -314,13 +314,13 @@ DWORD_PTR WIN_FUNC SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffin
_exit(static_cast<int>(exitCode)); _exit(static_cast<int>(exitCode));
} }
void WIN_FUNC ExitProcess(UINT uExitCode) { void WINAPI ExitProcess(UINT uExitCode) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("ExitProcess(%u)\n", uExitCode); DEBUG_LOG("ExitProcess(%u)\n", uExitCode);
exitInternal(uExitCode); exitInternal(uExitCode);
} }
BOOL WIN_FUNC TerminateProcess(HANDLE hProcess, UINT uExitCode) { BOOL WINAPI TerminateProcess(HANDLE hProcess, UINT uExitCode) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("TerminateProcess(%p, %u)\n", hProcess, uExitCode); DEBUG_LOG("TerminateProcess(%p, %u)\n", hProcess, uExitCode);
if (isPseudoCurrentProcessHandle(hProcess)) { if (isPseudoCurrentProcessHandle(hProcess)) {
@@ -354,7 +354,7 @@ BOOL WIN_FUNC TerminateProcess(HANDLE hProcess, UINT uExitCode) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode) { BOOL WINAPI GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetExitCodeProcess(%p, %p)\n", hProcess, lpExitCode); DEBUG_LOG("GetExitCodeProcess(%p, %p)\n", hProcess, lpExitCode);
if (!lpExitCode) { if (!lpExitCode) {
@@ -379,7 +379,7 @@ BOOL WIN_FUNC GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode) {
return TRUE; return TRUE;
} }
DWORD WIN_FUNC TlsAlloc() { DWORD WINAPI TlsAlloc() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("TlsAlloc()\n"); VERBOSE_LOG("TlsAlloc()\n");
DWORD index = wibo::tls::reserveSlot(); DWORD index = wibo::tls::reserveSlot();
@@ -391,7 +391,7 @@ DWORD WIN_FUNC TlsAlloc() {
return index; return index;
} }
BOOL WIN_FUNC TlsFree(DWORD dwTlsIndex) { BOOL WINAPI TlsFree(DWORD dwTlsIndex) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("TlsFree(%u)\n", dwTlsIndex); VERBOSE_LOG("TlsFree(%u)\n", dwTlsIndex);
if (!wibo::tls::releaseSlot(dwTlsIndex)) { if (!wibo::tls::releaseSlot(dwTlsIndex)) {
@@ -402,7 +402,7 @@ BOOL WIN_FUNC TlsFree(DWORD dwTlsIndex) {
return TRUE; return TRUE;
} }
LPVOID WIN_FUNC TlsGetValue(DWORD dwTlsIndex) { LPVOID WINAPI TlsGetValue(DWORD dwTlsIndex) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("TlsGetValue(%u)\n", dwTlsIndex); VERBOSE_LOG("TlsGetValue(%u)\n", dwTlsIndex);
if (!wibo::tls::isSlotAllocated(dwTlsIndex)) { if (!wibo::tls::isSlotAllocated(dwTlsIndex)) {
@@ -414,7 +414,7 @@ LPVOID WIN_FUNC TlsGetValue(DWORD dwTlsIndex) {
return result; return result;
} }
BOOL WIN_FUNC TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) { BOOL WINAPI TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("TlsSetValue(%u, %p)\n", dwTlsIndex, lpTlsValue); VERBOSE_LOG("TlsSetValue(%u, %p)\n", dwTlsIndex, lpTlsValue);
if (!wibo::tls::isSlotAllocated(dwTlsIndex)) { if (!wibo::tls::isSlotAllocated(dwTlsIndex)) {
@@ -429,7 +429,7 @@ BOOL WIN_FUNC TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) {
return TRUE; return TRUE;
} }
DWORD WIN_FUNC ResumeThread(HANDLE hThread) { DWORD WINAPI ResumeThread(HANDLE hThread) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("ResumeThread(%p)\n", hThread); DEBUG_LOG("ResumeThread(%p)\n", hThread);
// TODO: behavior with current thread handle? // TODO: behavior with current thread handle?
@@ -456,7 +456,7 @@ DWORD WIN_FUNC ResumeThread(HANDLE hThread) {
return previous; return previous;
} }
HRESULT WIN_FUNC SetThreadDescription(HANDLE hThread, LPCWSTR lpThreadDescription) { HRESULT WINAPI SetThreadDescription(HANDLE hThread, LPCWSTR lpThreadDescription) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: SetThreadDescription(%p, %p)\n", hThread, lpThreadDescription); DEBUG_LOG("STUB: SetThreadDescription(%p, %p)\n", hThread, lpThreadDescription);
(void)hThread; (void)hThread;
@@ -464,7 +464,7 @@ HRESULT WIN_FUNC SetThreadDescription(HANDLE hThread, LPCWSTR lpThreadDescriptio
return S_OK; 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, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags,
LPDWORD lpThreadId) { LPDWORD lpThreadId) {
HOST_CONTEXT_GUARD(); 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); 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("ExitThread(%u)\n", dwExitCode); DEBUG_LOG("ExitThread(%u)\n", dwExitCode);
ThreadObject *obj = g_currentThreadObject; ThreadObject *obj = g_currentThreadObject;
@@ -530,7 +530,7 @@ HANDLE WIN_FUNC CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dw
pthread_exit(nullptr); pthread_exit(nullptr);
} }
BOOL WIN_FUNC GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode) { BOOL WINAPI GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetExitCodeThread(%p, %p)\n", hThread, lpExitCode); DEBUG_LOG("GetExitCodeThread(%p, %p)\n", hThread, lpExitCode);
if (!lpExitCode) { if (!lpExitCode) {
@@ -551,7 +551,7 @@ BOOL WIN_FUNC GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC SetThreadPriority(HANDLE hThread, int nPriority) { BOOL WINAPI SetThreadPriority(HANDLE hThread, int nPriority) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: SetThreadPriority(%p, %d)\n", hThread, nPriority); DEBUG_LOG("STUB: SetThreadPriority(%p, %d)\n", hThread, nPriority);
(void)hThread; (void)hThread;
@@ -559,21 +559,21 @@ BOOL WIN_FUNC SetThreadPriority(HANDLE hThread, int nPriority) {
return TRUE; return TRUE;
} }
int WIN_FUNC GetThreadPriority(HANDLE hThread) { int WINAPI GetThreadPriority(HANDLE hThread) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: GetThreadPriority(%p)\n", hThread); DEBUG_LOG("STUB: GetThreadPriority(%p)\n", hThread);
(void)hThread; (void)hThread;
return 0; return 0;
} }
DWORD WIN_FUNC GetPriorityClass(HANDLE hProcess) { DWORD WINAPI GetPriorityClass(HANDLE hProcess) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetPriorityClass(%p)\n", hProcess); DEBUG_LOG("GetPriorityClass(%p)\n", hProcess);
(void)hProcess; (void)hProcess;
return NORMAL_PRIORITY_CLASS; 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) { FILETIME *lpUserTime) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetThreadTimes(%p, %p, %p, %p, %p)\n", hThread, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime); 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; 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, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags,
LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation) { LPPROCESS_INFORMATION lpProcessInformation) {
@@ -671,7 +671,7 @@ BOOL WIN_FUNC CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSE
return TRUE; 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, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags,
LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation) { LPPROCESS_INFORMATION lpProcessInformation) {
@@ -706,19 +706,19 @@ BOOL WIN_FUNC CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LP
lpProcessInformation); lpProcessInformation);
} }
void WIN_FUNC GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo) { void WINAPI GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetStartupInfoA(%p)\n", lpStartupInfo); DEBUG_LOG("GetStartupInfoA(%p)\n", lpStartupInfo);
populateStartupInfo(lpStartupInfo); populateStartupInfo(lpStartupInfo);
} }
void WIN_FUNC GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo) { void WINAPI GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetStartupInfoW(%p)\n", lpStartupInfo); DEBUG_LOG("GetStartupInfoW(%p)\n", lpStartupInfo);
populateStartupInfo(lpStartupInfo); populateStartupInfo(lpStartupInfo);
} }
BOOL WIN_FUNC SetThreadStackGuarantee(PULONG StackSizeInBytes) { BOOL WINAPI SetThreadStackGuarantee(PULONG StackSizeInBytes) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: SetThreadStackGuarantee(%p)\n", StackSizeInBytes); DEBUG_LOG("STUB: SetThreadStackGuarantee(%p)\n", StackSizeInBytes);
(void)StackSizeInBytes; (void)StackSizeInBytes;

View File

@@ -1,8 +1,7 @@
#pragma once #pragma once
#include "common.h"
#include "errors.h"
#include "minwinbase.h" #include "minwinbase.h"
#include "types.h"
struct PROCESS_INFORMATION { struct PROCESS_INFORMATION {
HANDLE hProcess; HANDLE hProcess;
@@ -29,7 +28,7 @@ struct STARTUPINFOA {
DWORD dwFlags; DWORD dwFlags;
WORD wShowWindow; WORD wShowWindow;
WORD cbReserved2; WORD cbReserved2;
unsigned char *lpReserved2; LPBYTE lpReserved2;
HANDLE hStdInput; HANDLE hStdInput;
HANDLE hStdOutput; HANDLE hStdOutput;
HANDLE hStdError; HANDLE hStdError;
@@ -52,7 +51,7 @@ struct STARTUPINFOW {
DWORD dwFlags; DWORD dwFlags;
WORD wShowWindow; WORD wShowWindow;
WORD cbReserved2; WORD cbReserved2;
unsigned char *lpReserved2; LPBYTE lpReserved2;
HANDLE hStdInput; HANDLE hStdInput;
HANDLE hStdOutput; HANDLE hStdOutput;
HANDLE hStdError; HANDLE hStdError;
@@ -67,44 +66,43 @@ typedef DWORD(WIN_FUNC *LPTHREAD_START_ROUTINE)(LPVOID);
namespace kernel32 { namespace kernel32 {
HANDLE WIN_FUNC GetCurrentProcess(); HANDLE WINAPI GetCurrentProcess();
DWORD WIN_FUNC GetCurrentProcessId(); DWORD WINAPI GetCurrentProcessId();
DWORD WIN_FUNC GetCurrentThreadId(); DWORD WINAPI GetCurrentThreadId();
HANDLE WIN_FUNC GetCurrentThread(); HANDLE WINAPI GetCurrentThread();
BOOL WIN_FUNC IsProcessorFeaturePresent(DWORD ProcessorFeature); BOOL WINAPI IsProcessorFeaturePresent(DWORD ProcessorFeature);
BOOL WIN_FUNC GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR lpProcessAffinityMask, BOOL WINAPI GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR lpProcessAffinityMask, PDWORD_PTR lpSystemAffinityMask);
PDWORD_PTR lpSystemAffinityMask); BOOL WINAPI SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask);
BOOL WIN_FUNC SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask); DWORD_PTR WINAPI SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask);
DWORD_PTR WIN_FUNC SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask); DWORD WINAPI ResumeThread(HANDLE hThread);
DWORD WIN_FUNC ResumeThread(HANDLE hThread); HRESULT WINAPI SetThreadDescription(HANDLE hThread, LPCWSTR lpThreadDescription);
HRESULT WIN_FUNC SetThreadDescription(HANDLE hThread, LPCWSTR lpThreadDescription); void WINAPI ExitProcess(UINT uExitCode);
void WIN_FUNC ExitProcess(UINT uExitCode); BOOL WINAPI TerminateProcess(HANDLE hProcess, UINT uExitCode);
BOOL WIN_FUNC TerminateProcess(HANDLE hProcess, UINT uExitCode); BOOL WINAPI GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode);
BOOL WIN_FUNC GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode); DWORD WINAPI TlsAlloc();
DWORD WIN_FUNC TlsAlloc(); BOOL WINAPI TlsFree(DWORD dwTlsIndex);
BOOL WIN_FUNC TlsFree(DWORD dwTlsIndex); LPVOID WINAPI TlsGetValue(DWORD dwTlsIndex);
LPVOID WIN_FUNC TlsGetValue(DWORD dwTlsIndex); BOOL WINAPI TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue);
BOOL WIN_FUNC TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue); HANDLE WINAPI CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize,
HANDLE WIN_FUNC CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags,
LPDWORD lpThreadId); LPDWORD lpThreadId);
[[noreturn]] void WIN_FUNC ExitThread(DWORD dwExitCode); [[noreturn]] void WINAPI ExitThread(DWORD dwExitCode);
BOOL WIN_FUNC GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode); BOOL WINAPI GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode);
BOOL WIN_FUNC SetThreadPriority(HANDLE hThread, int nPriority); BOOL WINAPI SetThreadPriority(HANDLE hThread, int nPriority);
int WIN_FUNC GetThreadPriority(HANDLE hThread); int WINAPI GetThreadPriority(HANDLE hThread);
DWORD WIN_FUNC GetPriorityClass(HANDLE hProcess); DWORD WINAPI GetPriorityClass(HANDLE hProcess);
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); FILETIME *lpUserTime);
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, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags,
LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation); LPPROCESS_INFORMATION lpProcessInformation);
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, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags,
LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation); LPPROCESS_INFORMATION lpProcessInformation);
void WIN_FUNC GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo); void WINAPI GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo);
void WIN_FUNC GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo); void WINAPI GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo);
BOOL WIN_FUNC SetThreadStackGuarantee(PULONG StackSizeInBytes); BOOL WINAPI SetThreadStackGuarantee(PULONG StackSizeInBytes);
} // namespace kernel32 } // namespace kernel32

View File

@@ -7,7 +7,7 @@
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) { BOOL WINAPI QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("STUB: QueryPerformanceCounter(%p)\n", lpPerformanceCount); VERBOSE_LOG("STUB: QueryPerformanceCounter(%p)\n", lpPerformanceCount);
if (!lpPerformanceCount) { if (!lpPerformanceCount) {
@@ -18,7 +18,7 @@ BOOL WIN_FUNC QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) { BOOL WINAPI QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("STUB: QueryPerformanceFrequency(%p)\n", lpFrequency); VERBOSE_LOG("STUB: QueryPerformanceFrequency(%p)\n", lpFrequency);
if (!lpFrequency) { if (!lpFrequency) {

View File

@@ -1,10 +1,10 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount); BOOL WINAPI QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);
BOOL WIN_FUNC QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency); BOOL WINAPI QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
} // namespace kernel32 } // namespace kernel32

View File

@@ -13,7 +13,7 @@
namespace kernel32 { 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) { LPSTR lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("WideCharToMultiByte(%u, %u, %p, %d, %p, %d, %p, %p)\n", CodePage, dwFlags, lpWideCharStr, cchWideChar, 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; 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) { LPWSTR lpWideCharStr, int cchWideChar) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("MultiByteToWideChar(%u, %u, %d, %d)\n", CodePage, dwFlags, cbMultiByte, cchWideChar); 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; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetStringTypeW(%u, %p, %i, %p)\n", dwInfoType, lpSrcStr, cchSrc, lpCharType); 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; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetStringTypeA(%u, %u, %p, %d, %p)\n", Locale, dwInfoType, lpSrcStr, cchSrc, lpCharType); DEBUG_LOG("GetStringTypeA(%u, %u, %p, %d, %p)\n", Locale, dwInfoType, lpSrcStr, cchSrc, lpCharType);
(void)Locale; (void)Locale;

View File

@@ -1,14 +1,14 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
namespace kernel32 { 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); 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); LPWSTR lpWideCharStr, int cchWideChar);
BOOL WIN_FUNC GetStringTypeW(DWORD dwInfoType, LPCWCH lpSrcStr, int cchSrc, LPWORD lpCharType); BOOL WINAPI 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 GetStringTypeA(LCID Locale, DWORD dwInfoType, LPCSTR lpSrcStr, int cchSrc, LPWORD lpCharType);
} // namespace kernel32 } // namespace kernel32

View File

@@ -128,13 +128,13 @@ struct WaitBlock {
namespace kernel32 { namespace kernel32 {
void WIN_FUNC Sleep(DWORD dwMilliseconds) { void WINAPI Sleep(DWORD dwMilliseconds) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("Sleep(%u)\n", dwMilliseconds); DEBUG_LOG("Sleep(%u)\n", dwMilliseconds);
usleep(static_cast<useconds_t>(dwMilliseconds) * 1000); usleep(static_cast<useconds_t>(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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("CreateMutexW(%p, %d, %s)\n", lpMutexAttributes, static_cast<int>(bInitialOwner), DEBUG_LOG("CreateMutexW(%p, %d, %s)\n", lpMutexAttributes, static_cast<int>(bInitialOwner),
wideStringToString(lpName).c_str()); wideStringToString(lpName).c_str());
@@ -165,7 +165,7 @@ HANDLE WIN_FUNC CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInit
return h; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("CreateMutexA -> "); DEBUG_LOG("CreateMutexA -> ");
std::vector<uint16_t> wideName; std::vector<uint16_t> wideName;
@@ -174,7 +174,7 @@ HANDLE WIN_FUNC CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInit
lpName ? reinterpret_cast<LPCWSTR>(wideName.data()) : nullptr); lpName ? reinterpret_cast<LPCWSTR>(wideName.data()) : nullptr);
} }
BOOL WIN_FUNC ReleaseMutex(HANDLE hMutex) { BOOL WINAPI ReleaseMutex(HANDLE hMutex) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("ReleaseMutex(%p)\n", hMutex); DEBUG_LOG("ReleaseMutex(%p)\n", hMutex);
auto mu = wibo::handles().getAs<MutexObject>(hMutex); auto mu = wibo::handles().getAs<MutexObject>(hMutex);
@@ -203,7 +203,7 @@ BOOL WIN_FUNC ReleaseMutex(HANDLE hMutex) {
return TRUE; 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) { LPCWSTR lpName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("CreateEventW(%p, %d, %d, %s)\n", lpEventAttributes, static_cast<int>(bManualReset), DEBUG_LOG("CreateEventW(%p, %d, %d, %s)\n", lpEventAttributes, static_cast<int>(bManualReset),
@@ -230,7 +230,7 @@ HANDLE WIN_FUNC CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManu
return h; 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) { LPCSTR lpName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("CreateEventA -> "); DEBUG_LOG("CreateEventA -> ");
@@ -240,7 +240,7 @@ HANDLE WIN_FUNC CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManu
lpName ? reinterpret_cast<LPCWSTR>(wideName.data()) : nullptr); lpName ? reinterpret_cast<LPCWSTR>(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) { LPCWSTR lpName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("CreateSemaphoreW(%p, %ld, %ld, %s)\n", lpSemaphoreAttributes, lInitialCount, lMaximumCount, 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; 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) { LPCSTR lpName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("CreateSemaphoreA -> "); DEBUG_LOG("CreateSemaphoreA -> ");
@@ -277,7 +277,7 @@ HANDLE WIN_FUNC CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LO
lpName ? reinterpret_cast<LPCWSTR>(wideName.data()) : nullptr); lpName ? reinterpret_cast<LPCWSTR>(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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("ReleaseSemaphore(%p, %ld, %p)\n", hSemaphore, lReleaseCount, lpPreviousCount); DEBUG_LOG("ReleaseSemaphore(%p, %ld, %p)\n", hSemaphore, lReleaseCount, lpPreviousCount);
if (lReleaseCount < 0) { if (lReleaseCount < 0) {
@@ -318,7 +318,7 @@ BOOL WIN_FUNC ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, PLONG lpPr
return TRUE; return TRUE;
} }
BOOL WIN_FUNC SetEvent(HANDLE hEvent) { BOOL WINAPI SetEvent(HANDLE hEvent) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetEvent(%p)\n", hEvent); DEBUG_LOG("SetEvent(%p)\n", hEvent);
auto ev = wibo::handles().getAs<EventObject>(hEvent); auto ev = wibo::handles().getAs<EventObject>(hEvent);
@@ -330,7 +330,7 @@ BOOL WIN_FUNC SetEvent(HANDLE hEvent) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC ResetEvent(HANDLE hEvent) { BOOL WINAPI ResetEvent(HANDLE hEvent) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("ResetEvent(%p)\n", hEvent); DEBUG_LOG("ResetEvent(%p)\n", hEvent);
auto ev = wibo::handles().getAs<EventObject>(hEvent); auto ev = wibo::handles().getAs<EventObject>(hEvent);
@@ -342,7 +342,7 @@ BOOL WIN_FUNC ResetEvent(HANDLE hEvent) {
return TRUE; return TRUE;
} }
DWORD WIN_FUNC WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) { DWORD WINAPI WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("WaitForSingleObject(%p, %u)\n", hHandle, dwMilliseconds); DEBUG_LOG("WaitForSingleObject(%p, %u)\n", hHandle, dwMilliseconds);
HandleMeta meta{}; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("WaitForMultipleObjects(%u, %p, %d, %u)\n", nCount, lpHandles, static_cast<int>(bWaitAll), DEBUG_LOG("WaitForMultipleObjects(%u, %p, %d, %u)\n", nCount, lpHandles, static_cast<int>(bWaitAll),
dwMilliseconds); dwMilliseconds);
@@ -543,7 +543,7 @@ DWORD WIN_FUNC WaitForMultipleObjects(DWORD nCount, const HANDLE *lpHandles, BOO
return waitResult; return waitResult;
} }
void WIN_FUNC InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { void WINAPI InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("STUB: InitializeCriticalSection(%p)\n", lpCriticalSection); VERBOSE_LOG("STUB: InitializeCriticalSection(%p)\n", lpCriticalSection);
if (!lpCriticalSection) { if (!lpCriticalSection) {
@@ -552,7 +552,7 @@ void WIN_FUNC InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) {
std::memset(lpCriticalSection, 0, sizeof(*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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: InitializeCriticalSectionEx(%p, %u, 0x%x)\n", lpCriticalSection, dwSpinCount, Flags); DEBUG_LOG("STUB: InitializeCriticalSectionEx(%p, %u, 0x%x)\n", lpCriticalSection, dwSpinCount, Flags);
if (!lpCriticalSection) { if (!lpCriticalSection) {
@@ -568,7 +568,7 @@ BOOL WIN_FUNC InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection,
return TRUE; return TRUE;
} }
BOOL WIN_FUNC InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount) { BOOL WINAPI InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: InitializeCriticalSectionAndSpinCount(%p, %u)\n", lpCriticalSection, dwSpinCount); DEBUG_LOG("STUB: InitializeCriticalSectionAndSpinCount(%p, %u)\n", lpCriticalSection, dwSpinCount);
if (!lpCriticalSection) { if (!lpCriticalSection) {
@@ -580,25 +580,25 @@ BOOL WIN_FUNC InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCritica
return TRUE; return TRUE;
} }
void WIN_FUNC DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { void WINAPI DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("STUB: DeleteCriticalSection(%p)\n", lpCriticalSection); VERBOSE_LOG("STUB: DeleteCriticalSection(%p)\n", lpCriticalSection);
(void)lpCriticalSection; (void)lpCriticalSection;
} }
void WIN_FUNC EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { void WINAPI EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("STUB: EnterCriticalSection(%p)\n", lpCriticalSection); VERBOSE_LOG("STUB: EnterCriticalSection(%p)\n", lpCriticalSection);
(void)lpCriticalSection; (void)lpCriticalSection;
} }
void WIN_FUNC LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("STUB: LeaveCriticalSection(%p)\n", lpCriticalSection); VERBOSE_LOG("STUB: LeaveCriticalSection(%p)\n", lpCriticalSection);
(void)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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: InitOnceBeginInitialize(%p, %u, %p, %p)\n", lpInitOnce, dwFlags, fPending, lpContext); DEBUG_LOG("STUB: InitOnceBeginInitialize(%p, %u, %p, %p)\n", lpInitOnce, dwFlags, fPending, lpContext);
if (!lpInitOnce) { if (!lpInitOnce) {
@@ -618,7 +618,7 @@ BOOL WIN_FUNC InitOnceBeginInitialize(LPINIT_ONCE lpInitOnce, DWORD dwFlags, PBO
return TRUE; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: InitOnceComplete(%p, %u, %p)\n", lpInitOnce, dwFlags, lpContext); DEBUG_LOG("STUB: InitOnceComplete(%p, %u, %p)\n", lpInitOnce, dwFlags, lpContext);
if (!lpInitOnce) { if (!lpInitOnce) {
@@ -633,31 +633,31 @@ BOOL WIN_FUNC InitOnceComplete(LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpC
return TRUE; return TRUE;
} }
void WIN_FUNC AcquireSRWLockShared(PSRWLOCK SRWLock) { void WINAPI AcquireSRWLockShared(PSRWLOCK SRWLock) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
(void)SRWLock; (void)SRWLock;
VERBOSE_LOG("STUB: AcquireSRWLockShared(%p)\n", SRWLock); VERBOSE_LOG("STUB: AcquireSRWLockShared(%p)\n", SRWLock);
} }
void WIN_FUNC ReleaseSRWLockShared(PSRWLOCK SRWLock) { void WINAPI ReleaseSRWLockShared(PSRWLOCK SRWLock) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
(void)SRWLock; (void)SRWLock;
VERBOSE_LOG("STUB: ReleaseSRWLockShared(%p)\n", SRWLock); VERBOSE_LOG("STUB: ReleaseSRWLockShared(%p)\n", SRWLock);
} }
void WIN_FUNC AcquireSRWLockExclusive(PSRWLOCK SRWLock) { void WINAPI AcquireSRWLockExclusive(PSRWLOCK SRWLock) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
(void)SRWLock; (void)SRWLock;
VERBOSE_LOG("STUB: AcquireSRWLockExclusive(%p)\n", SRWLock); VERBOSE_LOG("STUB: AcquireSRWLockExclusive(%p)\n", SRWLock);
} }
void WIN_FUNC ReleaseSRWLockExclusive(PSRWLOCK SRWLock) { void WINAPI ReleaseSRWLockExclusive(PSRWLOCK SRWLock) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
(void)SRWLock; (void)SRWLock;
VERBOSE_LOG("STUB: ReleaseSRWLockExclusive(%p)\n", SRWLock); VERBOSE_LOG("STUB: ReleaseSRWLockExclusive(%p)\n", SRWLock);
} }
BOOLEAN WIN_FUNC TryAcquireSRWLockExclusive(PSRWLOCK SRWLock) { BOOLEAN WINAPI TryAcquireSRWLockExclusive(PSRWLOCK SRWLock) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
(void)SRWLock; (void)SRWLock;
VERBOSE_LOG("STUB: TryAcquireSRWLockExclusive(%p)\n", SRWLock); VERBOSE_LOG("STUB: TryAcquireSRWLockExclusive(%p)\n", SRWLock);

View File

@@ -1,7 +1,7 @@
#pragma once #pragma once
#include "common.h"
#include "minwinbase.h" #include "minwinbase.h"
#include "types.h"
constexpr DWORD WAIT_OBJECT_0 = 0x00000000; constexpr DWORD WAIT_OBJECT_0 = 0x00000000;
constexpr DWORD WAIT_ABANDONED = 0x00000080; 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; 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;
struct RTL_CRITICAL_SECTION_DEBUG { struct RTL_CRITICAL_SECTION_DEBUG {
@@ -74,35 +69,35 @@ constexpr SRWLOCK SRWLOCK_INIT{nullptr};
namespace kernel32 { namespace kernel32 {
void WIN_FUNC Sleep(DWORD dwMilliseconds); void WINAPI Sleep(DWORD dwMilliseconds);
HANDLE WIN_FUNC CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCSTR lpName); HANDLE WINAPI CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCSTR lpName);
HANDLE WIN_FUNC CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCWSTR lpName); HANDLE WINAPI CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCWSTR lpName);
BOOL WIN_FUNC ReleaseMutex(HANDLE hMutex); BOOL WINAPI ReleaseMutex(HANDLE hMutex);
HANDLE WIN_FUNC CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, HANDLE WINAPI CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState,
LPCSTR lpName); LPCSTR lpName);
HANDLE WIN_FUNC CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, HANDLE WINAPI CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState,
LPCWSTR lpName); LPCWSTR lpName);
BOOL WIN_FUNC SetEvent(HANDLE hEvent); BOOL WINAPI SetEvent(HANDLE hEvent);
BOOL WIN_FUNC ResetEvent(HANDLE hEvent); BOOL WINAPI ResetEvent(HANDLE hEvent);
HANDLE WIN_FUNC CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, HANDLE WINAPI CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount,
LPCSTR lpName); LPCSTR lpName);
HANDLE WIN_FUNC CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, HANDLE WINAPI CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount,
LPCWSTR lpName); LPCWSTR lpName);
BOOL WIN_FUNC ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, PLONG lpPreviousCount); BOOL WINAPI ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, PLONG lpPreviousCount);
DWORD WIN_FUNC WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds); DWORD WINAPI 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);
void WIN_FUNC InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection); void WINAPI InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
BOOL WIN_FUNC InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags); BOOL WINAPI InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags);
BOOL WIN_FUNC InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount); BOOL WINAPI InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount);
void WIN_FUNC DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection); void WINAPI DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
void WIN_FUNC EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection); void WINAPI EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
void WIN_FUNC LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection); void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION 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);
BOOL WIN_FUNC InitOnceComplete(LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpContext); BOOL WINAPI InitOnceComplete(LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpContext);
void WIN_FUNC AcquireSRWLockShared(PSRWLOCK SRWLock); void WINAPI AcquireSRWLockShared(PSRWLOCK SRWLock);
void WIN_FUNC ReleaseSRWLockShared(PSRWLOCK SRWLock); void WINAPI ReleaseSRWLockShared(PSRWLOCK SRWLock);
void WIN_FUNC AcquireSRWLockExclusive(PSRWLOCK SRWLock); void WINAPI AcquireSRWLockExclusive(PSRWLOCK SRWLock);
void WIN_FUNC ReleaseSRWLockExclusive(PSRWLOCK SRWLock); void WINAPI ReleaseSRWLockExclusive(PSRWLOCK SRWLock);
BOOLEAN WIN_FUNC TryAcquireSRWLockExclusive(PSRWLOCK SRWLock); BOOLEAN WINAPI TryAcquireSRWLockExclusive(PSRWLOCK SRWLock);
} // namespace kernel32 } // namespace kernel32

View File

@@ -33,7 +33,7 @@ DWORD_PTR computeSystemProcessorMask(unsigned int cpuCount) {
namespace kernel32 { namespace kernel32 {
void WIN_FUNC GetSystemInfo(LPSYSTEM_INFO lpSystemInfo) { void WINAPI GetSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetSystemInfo(%p)\n", lpSystemInfo); DEBUG_LOG("GetSystemInfo(%p)\n", lpSystemInfo);
if (!lpSystemInfo) { if (!lpSystemInfo) {
@@ -70,7 +70,7 @@ void WIN_FUNC GetSystemInfo(LPSYSTEM_INFO lpSystemInfo) {
lpSystemInfo->dwAllocationGranularity = 0x10000; lpSystemInfo->dwAllocationGranularity = 0x10000;
} }
void WIN_FUNC GetSystemTime(LPSYSTEMTIME lpSystemTime) { void WINAPI GetSystemTime(LPSYSTEMTIME lpSystemTime) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetSystemTime(%p)\n", lpSystemTime); DEBUG_LOG("GetSystemTime(%p)\n", lpSystemTime);
if (!lpSystemTime) { if (!lpSystemTime) {
@@ -99,7 +99,7 @@ void WIN_FUNC GetSystemTime(LPSYSTEMTIME lpSystemTime) {
lpSystemTime->wMilliseconds = 0; lpSystemTime->wMilliseconds = 0;
} }
void WIN_FUNC GetLocalTime(LPSYSTEMTIME lpSystemTime) { void WINAPI GetLocalTime(LPSYSTEMTIME lpSystemTime) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetLocalTime(%p)\n", lpSystemTime); DEBUG_LOG("GetLocalTime(%p)\n", lpSystemTime);
if (!lpSystemTime) { if (!lpSystemTime) {
@@ -128,7 +128,7 @@ void WIN_FUNC GetLocalTime(LPSYSTEMTIME lpSystemTime) {
lpSystemTime->wMilliseconds = 0; lpSystemTime->wMilliseconds = 0;
} }
void WIN_FUNC GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) { void WINAPI GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetSystemTimeAsFileTime(%p)\n", lpSystemTimeAsFileTime); DEBUG_LOG("GetSystemTimeAsFileTime(%p)\n", lpSystemTimeAsFileTime);
if (!lpSystemTimeAsFileTime) { if (!lpSystemTimeAsFileTime) {
@@ -160,7 +160,7 @@ void WIN_FUNC GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) {
*lpSystemTimeAsFileTime = fallback; *lpSystemTimeAsFileTime = fallback;
} }
DWORD WIN_FUNC GetTickCount() { DWORD WINAPI GetTickCount() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetTickCount()\n"); DEBUG_LOG("GetTickCount()\n");
#if defined(CLOCK_MONOTONIC) #if defined(CLOCK_MONOTONIC)
@@ -185,13 +185,13 @@ DWORD WIN_FUNC GetTickCount() {
return 0; return 0;
} }
DWORD WIN_FUNC GetVersion() { DWORD WINAPI GetVersion() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetVersion()\n"); DEBUG_LOG("GetVersion()\n");
return kMajorVersion | (kMinorVersion << 8) | (5 << 16) | (kBuildNumber << 24); return kMajorVersion | (kMinorVersion << 8) | (5 << 16) | (kBuildNumber << 24);
} }
BOOL WIN_FUNC GetVersionExA(LPOSVERSIONINFOA lpVersionInformation) { BOOL WINAPI GetVersionExA(LPOSVERSIONINFOA lpVersionInformation) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetVersionExA(%p)\n", lpVersionInformation); DEBUG_LOG("GetVersionExA(%p)\n", lpVersionInformation);
if (!lpVersionInformation) { if (!lpVersionInformation) {

View File

@@ -1,7 +1,7 @@
#pragma once #pragma once
#include "common.h"
#include "minwinbase.h" #include "minwinbase.h"
#include "types.h"
struct SYSTEM_INFO { struct SYSTEM_INFO {
union { union {
@@ -37,12 +37,12 @@ using LPOSVERSIONINFOA = OSVERSIONINFOA *;
namespace kernel32 { namespace kernel32 {
void WIN_FUNC GetSystemInfo(LPSYSTEM_INFO lpSystemInfo); void WINAPI GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);
void WIN_FUNC GetSystemTime(LPSYSTEMTIME lpSystemTime); void WINAPI GetSystemTime(LPSYSTEMTIME lpSystemTime);
void WIN_FUNC GetLocalTime(LPSYSTEMTIME lpSystemTime); void WINAPI GetLocalTime(LPSYSTEMTIME lpSystemTime);
void WIN_FUNC GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime); void WINAPI GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime);
DWORD WIN_FUNC GetTickCount(); DWORD WINAPI GetTickCount();
DWORD WIN_FUNC GetVersion(); DWORD WINAPI GetVersion();
BOOL WIN_FUNC GetVersionExA(LPOSVERSIONINFOA lpVersionInformation); BOOL WINAPI GetVersionExA(LPOSVERSIONINFOA lpVersionInformation);
} // namespace kernel32 } // namespace kernel32

View File

@@ -11,7 +11,7 @@
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC SystemTimeToFileTime(const SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime) { BOOL WINAPI SystemTimeToFileTime(const SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SystemTimeToFileTime(%p, %p)\n", lpSystemTime, lpFileTime); DEBUG_LOG("SystemTimeToFileTime(%p, %p)\n", lpSystemTime, lpFileTime);
if (!lpSystemTime || !lpFileTime) { if (!lpSystemTime || !lpFileTime) {
@@ -37,7 +37,7 @@ BOOL WIN_FUNC SystemTimeToFileTime(const SYSTEMTIME *lpSystemTime, LPFILETIME lp
return TRUE; return TRUE;
} }
BOOL WIN_FUNC FileTimeToSystemTime(const FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime) { BOOL WINAPI FileTimeToSystemTime(const FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FileTimeToSystemTime(%p, %p)\n", lpFileTime, lpSystemTime); DEBUG_LOG("FileTimeToSystemTime(%p, %p)\n", lpFileTime, lpSystemTime);
if (!lpFileTime || !lpSystemTime) { if (!lpFileTime || !lpSystemTime) {
@@ -66,7 +66,7 @@ BOOL WIN_FUNC FileTimeToSystemTime(const FILETIME *lpFileTime, LPSYSTEMTIME lpSy
return TRUE; return TRUE;
} }
BOOL WIN_FUNC FileTimeToLocalFileTime(const FILETIME *lpFileTime, LPFILETIME lpLocalFileTime) { BOOL WINAPI FileTimeToLocalFileTime(const FILETIME *lpFileTime, LPFILETIME lpLocalFileTime) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FileTimeToLocalFileTime(%p, %p)\n", lpFileTime, lpLocalFileTime); DEBUG_LOG("FileTimeToLocalFileTime(%p, %p)\n", lpFileTime, lpLocalFileTime);
if (!lpFileTime || !lpLocalFileTime) { if (!lpFileTime || !lpLocalFileTime) {
@@ -115,7 +115,7 @@ BOOL WIN_FUNC FileTimeToLocalFileTime(const FILETIME *lpFileTime, LPFILETIME lpL
return TRUE; return TRUE;
} }
BOOL WIN_FUNC LocalFileTimeToFileTime(const FILETIME *lpLocalFileTime, LPFILETIME lpFileTime) { BOOL WINAPI LocalFileTimeToFileTime(const FILETIME *lpLocalFileTime, LPFILETIME lpFileTime) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("LocalFileTimeToFileTime(%p, %p)\n", lpLocalFileTime, lpFileTime); DEBUG_LOG("LocalFileTimeToFileTime(%p, %p)\n", lpLocalFileTime, lpFileTime);
if (!lpLocalFileTime || !lpFileTime) { if (!lpLocalFileTime || !lpFileTime) {
@@ -157,7 +157,7 @@ BOOL WIN_FUNC LocalFileTimeToFileTime(const FILETIME *lpLocalFileTime, LPFILETIM
return TRUE; return TRUE;
} }
BOOL WIN_FUNC DosDateTimeToFileTime(WORD wFatDate, WORD wFatTime, LPFILETIME lpFileTime) { BOOL WINAPI DosDateTimeToFileTime(WORD wFatDate, WORD wFatTime, LPFILETIME lpFileTime) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("DosDateTimeToFileTime(%04x, %04x, %p)\n", wFatDate, wFatTime, lpFileTime); DEBUG_LOG("DosDateTimeToFileTime(%04x, %04x, %p)\n", wFatDate, wFatTime, lpFileTime);
if (!lpFileTime) { if (!lpFileTime) {
@@ -192,7 +192,7 @@ BOOL WIN_FUNC DosDateTimeToFileTime(WORD wFatDate, WORD wFatTime, LPFILETIME lpF
return TRUE; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FileTimeToDosDateTime(%p, %p, %p)\n", lpFileTime, lpFatDate, lpFatTime); DEBUG_LOG("FileTimeToDosDateTime(%p, %p, %p)\n", lpFileTime, lpFatDate, lpFatTime);
if (!lpFileTime || !lpFatDate || !lpFatTime) { if (!lpFileTime || !lpFatDate || !lpFatTime) {
@@ -221,7 +221,7 @@ BOOL WIN_FUNC FileTimeToDosDateTime(const FILETIME *lpFileTime, LPWORD lpFatDate
return TRUE; return TRUE;
} }
DWORD WIN_FUNC GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation) { DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetTimeZoneInformation(%p)\n", lpTimeZoneInformation); DEBUG_LOG("GetTimeZoneInformation(%p)\n", lpTimeZoneInformation);
if (!lpTimeZoneInformation) { if (!lpTimeZoneInformation) {

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
#include "minwinbase.h" #include "minwinbase.h"
struct TIME_ZONE_INFORMATION { struct TIME_ZONE_INFORMATION {
@@ -22,12 +22,12 @@ constexpr DWORD TIME_ZONE_ID_INVALID = 0xFFFFFFFFu;
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC SystemTimeToFileTime(const SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime); BOOL WINAPI SystemTimeToFileTime(const SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime);
BOOL WIN_FUNC FileTimeToSystemTime(const FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime); BOOL WINAPI FileTimeToSystemTime(const FILETIME *lpFileTime, LPSYSTEMTIME lpSystemTime);
BOOL WIN_FUNC FileTimeToLocalFileTime(const FILETIME *lpFileTime, LPFILETIME lpLocalFileTime); BOOL WINAPI FileTimeToLocalFileTime(const FILETIME *lpFileTime, LPFILETIME lpLocalFileTime);
BOOL WIN_FUNC LocalFileTimeToFileTime(const FILETIME *lpLocalFileTime, LPFILETIME lpFileTime); BOOL WINAPI LocalFileTimeToFileTime(const FILETIME *lpLocalFileTime, LPFILETIME lpFileTime);
BOOL WIN_FUNC DosDateTimeToFileTime(WORD wFatDate, WORD wFatTime, LPFILETIME lpFileTime); BOOL WINAPI DosDateTimeToFileTime(WORD wFatDate, WORD wFatTime, LPFILETIME lpFileTime);
BOOL WIN_FUNC FileTimeToDosDateTime(const FILETIME *lpFileTime, LPWORD lpFatDate, LPWORD lpFatTime); BOOL WINAPI FileTimeToDosDateTime(const FILETIME *lpFileTime, LPWORD lpFatDate, LPWORD lpFatTime);
DWORD WIN_FUNC GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation); DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation);
} // namespace kernel32 } // namespace kernel32

View File

@@ -333,7 +333,7 @@ void ensureDefaultActivationContext() {
namespace kernel32 { namespace kernel32 {
ATOM WIN_FUNC AddAtomA(LPCSTR lpString) { ATOM WINAPI AddAtomA(LPCSTR lpString) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
ATOM atom = 0; ATOM atom = 0;
if (tryHandleIntegerAtomPointer(lpString, atom)) { if (tryHandleIntegerAtomPointer(lpString, atom)) {
@@ -356,7 +356,7 @@ ATOM WIN_FUNC AddAtomA(LPCSTR lpString) {
return result; return result;
} }
ATOM WIN_FUNC AddAtomW(LPCWSTR lpString) { ATOM WINAPI AddAtomW(LPCWSTR lpString) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
ATOM atom = 0; ATOM atom = 0;
if (tryHandleIntegerAtomPointer(lpString, atom)) { if (tryHandleIntegerAtomPointer(lpString, atom)) {
@@ -381,7 +381,7 @@ ATOM WIN_FUNC AddAtomW(LPCWSTR lpString) {
return result; return result;
} }
ATOM WIN_FUNC FindAtomA(LPCSTR lpString) { ATOM WINAPI FindAtomA(LPCSTR lpString) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
ATOM atom = 0; ATOM atom = 0;
if (tryHandleIntegerAtomPointer(lpString, atom)) { if (tryHandleIntegerAtomPointer(lpString, atom)) {
@@ -404,7 +404,7 @@ ATOM WIN_FUNC FindAtomA(LPCSTR lpString) {
return result; return result;
} }
ATOM WIN_FUNC FindAtomW(LPCWSTR lpString) { ATOM WINAPI FindAtomW(LPCWSTR lpString) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
ATOM atom = 0; ATOM atom = 0;
if (tryHandleIntegerAtomPointer(lpString, atom)) { if (tryHandleIntegerAtomPointer(lpString, atom)) {
@@ -429,7 +429,7 @@ ATOM WIN_FUNC FindAtomW(LPCWSTR lpString) {
return result; return result;
} }
UINT WIN_FUNC GetAtomNameA(ATOM nAtom, LPSTR lpBuffer, int nSize) { UINT WINAPI GetAtomNameA(ATOM nAtom, LPSTR lpBuffer, int nSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetAtomNameA(%u, %p, %d)\n", nAtom, lpBuffer, nSize); DEBUG_LOG("GetAtomNameA(%u, %p, %d)\n", nAtom, lpBuffer, nSize);
if (!lpBuffer || nSize <= 0) { if (!lpBuffer || nSize <= 0) {
@@ -461,7 +461,7 @@ UINT WIN_FUNC GetAtomNameA(ATOM nAtom, LPSTR lpBuffer, int nSize) {
return written; return written;
} }
UINT WIN_FUNC GetAtomNameW(ATOM nAtom, LPWSTR lpBuffer, int nSize) { UINT WINAPI GetAtomNameW(ATOM nAtom, LPWSTR lpBuffer, int nSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetAtomNameW(%u, %p, %d)\n", nAtom, lpBuffer, nSize); DEBUG_LOG("GetAtomNameW(%u, %p, %d)\n", nAtom, lpBuffer, nSize);
if (!lpBuffer || nSize <= 0) { if (!lpBuffer || nSize <= 0) {
@@ -497,14 +497,14 @@ UINT WIN_FUNC GetAtomNameW(ATOM nAtom, LPWSTR lpBuffer, int nSize) {
return written; return written;
} }
UINT WIN_FUNC SetHandleCount(UINT uNumber) { UINT WINAPI SetHandleCount(UINT uNumber) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetHandleCount(%u)\n", uNumber); DEBUG_LOG("SetHandleCount(%u)\n", uNumber);
(void)uNumber; (void)uNumber;
return 0x3FFE; return 0x3FFE;
} }
DWORD WIN_FUNC FormatMessageA(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer, DWORD WINAPI FormatMessageA(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer,
DWORD nSize, va_list *Arguments) { DWORD nSize, va_list *Arguments) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("FormatMessageA(%u, %p, %u, %u, %p, %u, %p)\n", dwFlags, lpSource, dwMessageId, dwLanguageId, lpBuffer, DEBUG_LOG("FormatMessageA(%u, %p, %u, %u, %p, %u, %p)\n", dwFlags, lpSource, dwMessageId, dwLanguageId, lpBuffer,
@@ -549,19 +549,19 @@ DWORD WIN_FUNC FormatMessageA(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId
return 0; return 0;
} }
PVOID WIN_FUNC EncodePointer(PVOID Ptr) { PVOID WINAPI EncodePointer(PVOID Ptr) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("EncodePointer(%p)\n", Ptr); DEBUG_LOG("EncodePointer(%p)\n", Ptr);
return Ptr; return Ptr;
} }
PVOID WIN_FUNC DecodePointer(PVOID Ptr) { PVOID WINAPI DecodePointer(PVOID Ptr) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("DecodePointer(%p)\n", Ptr); DEBUG_LOG("DecodePointer(%p)\n", Ptr);
return Ptr; return Ptr;
} }
BOOL WIN_FUNC SetDllDirectoryA(LPCSTR lpPathName) { BOOL WINAPI SetDllDirectoryA(LPCSTR lpPathName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetDllDirectoryA(%s)\n", lpPathName); DEBUG_LOG("SetDllDirectoryA(%s)\n", lpPathName);
if (!lpPathName || lpPathName[0] == '\0') { if (!lpPathName || lpPathName[0] == '\0') {
@@ -579,7 +579,7 @@ BOOL WIN_FUNC SetDllDirectoryA(LPCSTR lpPathName) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC FindActCtxSectionStringA(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId, BOOL WINAPI FindActCtxSectionStringA(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId,
LPCSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData) { LPCSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData) {
DEBUG_LOG("FindActCtxSectionStringA(%#x, %p, %u, %s, %p)\n", dwFlags, lpExtensionGuid, ulSectionId, DEBUG_LOG("FindActCtxSectionStringA(%#x, %p, %u, %s, %p)\n", dwFlags, lpExtensionGuid, ulSectionId,
lpStringToFind ? lpStringToFind : "<null>", ReturnedData); lpStringToFind ? lpStringToFind : "<null>", ReturnedData);
@@ -596,7 +596,7 @@ BOOL WIN_FUNC FindActCtxSectionStringA(DWORD dwFlags, const GUID *lpExtensionGui
ReturnedData); ReturnedData);
} }
BOOL WIN_FUNC FindActCtxSectionStringW(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId, BOOL WINAPI FindActCtxSectionStringW(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId,
LPCWSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData) { LPCWSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData) {
std::string lookup = lpStringToFind ? wideStringToString(lpStringToFind) : std::string(); std::string lookup = lpStringToFind ? wideStringToString(lpStringToFind) : std::string();
DEBUG_LOG("FindActCtxSectionStringW(%#x, %p, %u, %s, %p)\n", dwFlags, lpExtensionGuid, ulSectionId, lookup.c_str(), DEBUG_LOG("FindActCtxSectionStringW(%#x, %p, %u, %s, %p)\n", dwFlags, lpExtensionGuid, ulSectionId, lookup.c_str(),
@@ -682,7 +682,7 @@ void tryMarkExecutable(void *mem) {
mprotect(reinterpret_cast<void *>(alignedStart), length, PROT_READ | PROT_WRITE | PROT_EXEC); mprotect(reinterpret_cast<void *>(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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: IsBadReadPtr(ptr=%p, size=%zu)\n", lp, static_cast<size_t>(ucb)); DEBUG_LOG("STUB: IsBadReadPtr(ptr=%p, size=%zu)\n", lp, static_cast<size_t>(ucb));
if (!lp) { if (!lp) {
@@ -691,7 +691,7 @@ BOOL WIN_FUNC IsBadReadPtr(LPCVOID lp, UINT_PTR ucb) {
return FALSE; return FALSE;
} }
BOOL WIN_FUNC IsBadWritePtr(LPVOID lp, UINT_PTR ucb) { BOOL WINAPI IsBadWritePtr(LPVOID lp, UINT_PTR ucb) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: IsBadWritePtr(ptr=%p, size=%zu)\n", lp, static_cast<size_t>(ucb)); DEBUG_LOG("STUB: IsBadWritePtr(ptr=%p, size=%zu)\n", lp, static_cast<size_t>(ucb));
if (!lp && ucb != 0) { if (!lp && ucb != 0) {
@@ -700,7 +700,7 @@ BOOL WIN_FUNC IsBadWritePtr(LPVOID lp, UINT_PTR ucb) {
return FALSE; return FALSE;
} }
BOOL WIN_FUNC GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize) { BOOL WINAPI GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetComputerNameA(%p, %p)\n", lpBuffer, nSize); DEBUG_LOG("GetComputerNameA(%p, %p)\n", lpBuffer, nSize);
if (!nSize || !lpBuffer) { if (!nSize || !lpBuffer) {
@@ -722,7 +722,7 @@ BOOL WIN_FUNC GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize) { BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetComputerNameW(%p, %p)\n", lpBuffer, nSize); DEBUG_LOG("GetComputerNameW(%p, %p)\n", lpBuffer, nSize);
if (!nSize || !lpBuffer) { if (!nSize || !lpBuffer) {
@@ -744,7 +744,7 @@ BOOL WIN_FUNC GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize) {
return TRUE; return TRUE;
} }
HGLOBAL WIN_FUNC GlobalAlloc(UINT uFlags, SIZE_T dwBytes) { HGLOBAL WINAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("GlobalAlloc(%x, %zu)\n", uFlags, static_cast<size_t>(dwBytes)); VERBOSE_LOG("GlobalAlloc(%x, %zu)\n", uFlags, static_cast<size_t>(dwBytes));
if (uFlags & GMEM_MOVEABLE) { if (uFlags & GMEM_MOVEABLE) {
@@ -756,14 +756,14 @@ HGLOBAL WIN_FUNC GlobalAlloc(UINT uFlags, SIZE_T dwBytes) {
return doAlloc(static_cast<UINT>(dwBytes), zero); return doAlloc(static_cast<UINT>(dwBytes), zero);
} }
HGLOBAL WIN_FUNC GlobalFree(HGLOBAL hMem) { HGLOBAL WINAPI GlobalFree(HGLOBAL hMem) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("GlobalFree(%p)\n", hMem); VERBOSE_LOG("GlobalFree(%p)\n", hMem);
std::free(hMem); std::free(hMem);
return nullptr; 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(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("GlobalReAlloc(%p, %zu, %x)\n", hMem, static_cast<size_t>(dwBytes), uFlags); VERBOSE_LOG("GlobalReAlloc(%p, %zu, %x)\n", hMem, static_cast<size_t>(dwBytes), uFlags);
if (uFlags & GMEM_MODIFY) { if (uFlags & GMEM_MODIFY) {
@@ -774,14 +774,14 @@ HGLOBAL WIN_FUNC GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags) {
return doRealloc(hMem, static_cast<UINT>(dwBytes), zero); return doRealloc(hMem, static_cast<UINT>(dwBytes), zero);
} }
UINT WIN_FUNC GlobalFlags(HGLOBAL hMem) { UINT WINAPI GlobalFlags(HGLOBAL hMem) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("GlobalFlags(%p)\n", hMem); VERBOSE_LOG("GlobalFlags(%p)\n", hMem);
(void)hMem; (void)hMem;
return 0; return 0;
} }
HLOCAL WIN_FUNC LocalAlloc(UINT uFlags, SIZE_T uBytes) { HLOCAL WINAPI LocalAlloc(UINT uFlags, SIZE_T uBytes) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("LocalAlloc(%x, %zu)\n", uFlags, static_cast<size_t>(uBytes)); VERBOSE_LOG("LocalAlloc(%x, %zu)\n", uFlags, static_cast<size_t>(uBytes));
bool zero = (uFlags & LMEM_ZEROINIT) != 0; bool zero = (uFlags & LMEM_ZEROINIT) != 0;
@@ -799,7 +799,7 @@ HLOCAL WIN_FUNC LocalAlloc(UINT uFlags, SIZE_T uBytes) {
return result; return result;
} }
HLOCAL WIN_FUNC LocalFree(HLOCAL hMem) { HLOCAL WINAPI LocalFree(HLOCAL hMem) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("LocalFree(%p)\n", hMem); VERBOSE_LOG("LocalFree(%p)\n", hMem);
// Windows returns NULL on success. // Windows returns NULL on success.
@@ -807,7 +807,7 @@ HLOCAL WIN_FUNC LocalFree(HLOCAL hMem) {
return nullptr; 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(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("LocalReAlloc(%p, %zu, %x)\n", hMem, static_cast<size_t>(uBytes), uFlags); VERBOSE_LOG("LocalReAlloc(%p, %zu, %x)\n", hMem, static_cast<size_t>(uBytes), uFlags);
bool zero = (uFlags & LMEM_ZEROINIT) != 0; bool zero = (uFlags & LMEM_ZEROINIT) != 0;
@@ -825,32 +825,32 @@ HLOCAL WIN_FUNC LocalReAlloc(HLOCAL hMem, SIZE_T uBytes, UINT uFlags) {
return result; return result;
} }
HLOCAL WIN_FUNC LocalHandle(LPCVOID pMem) { HLOCAL WINAPI LocalHandle(LPCVOID pMem) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("LocalHandle(%p)\n", pMem); VERBOSE_LOG("LocalHandle(%p)\n", pMem);
return const_cast<LPVOID>(pMem); return const_cast<LPVOID>(pMem);
} }
LPVOID WIN_FUNC LocalLock(HLOCAL hMem) { LPVOID WINAPI LocalLock(HLOCAL hMem) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("LocalLock(%p)\n", hMem); VERBOSE_LOG("LocalLock(%p)\n", hMem);
return hMem; return hMem;
} }
BOOL WIN_FUNC LocalUnlock(HLOCAL hMem) { BOOL WINAPI LocalUnlock(HLOCAL hMem) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("LocalUnlock(%p)\n", hMem); VERBOSE_LOG("LocalUnlock(%p)\n", hMem);
(void)hMem; (void)hMem;
return TRUE; return TRUE;
} }
SIZE_T WIN_FUNC LocalSize(HLOCAL hMem) { SIZE_T WINAPI LocalSize(HLOCAL hMem) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("LocalSize(%p)\n", hMem); VERBOSE_LOG("LocalSize(%p)\n", hMem);
return hMem ? mi_usable_size(hMem) : 0; return hMem ? mi_usable_size(hMem) : 0;
} }
UINT WIN_FUNC LocalFlags(HLOCAL hMem) { UINT WINAPI LocalFlags(HLOCAL hMem) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
VERBOSE_LOG("LocalFlags(%p)\n", hMem); VERBOSE_LOG("LocalFlags(%p)\n", hMem);
(void)hMem; (void)hMem;
@@ -859,7 +859,7 @@ UINT WIN_FUNC LocalFlags(HLOCAL hMem) {
static constexpr const char *kSystemDirectoryA = "C:\\Windows\\System32"; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetSystemDirectoryA(%p, %u)\n", lpBuffer, uSize); DEBUG_LOG("GetSystemDirectoryA(%p, %u)\n", lpBuffer, uSize);
if (!lpBuffer) { if (!lpBuffer) {
@@ -874,7 +874,7 @@ UINT WIN_FUNC GetSystemDirectoryA(LPSTR lpBuffer, UINT uSize) {
return static_cast<UINT>(len); return static_cast<UINT>(len);
} }
UINT WIN_FUNC GetSystemDirectoryW(LPWSTR lpBuffer, UINT uSize) { UINT WINAPI GetSystemDirectoryW(LPWSTR lpBuffer, UINT uSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetSystemDirectoryW(%p, %u)\n", lpBuffer, uSize); DEBUG_LOG("GetSystemDirectoryW(%p, %u)\n", lpBuffer, uSize);
if (!lpBuffer) { if (!lpBuffer) {
@@ -890,7 +890,7 @@ UINT WIN_FUNC GetSystemDirectoryW(LPWSTR lpBuffer, UINT uSize) {
return length; return length;
} }
UINT WIN_FUNC GetSystemWow64DirectoryA(LPSTR lpBuffer, UINT uSize) { UINT WINAPI GetSystemWow64DirectoryA(LPSTR lpBuffer, UINT uSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetSystemWow64DirectoryA(%p, %u)\n", lpBuffer, uSize); DEBUG_LOG("GetSystemWow64DirectoryA(%p, %u)\n", lpBuffer, uSize);
(void)lpBuffer; (void)lpBuffer;
@@ -899,7 +899,7 @@ UINT WIN_FUNC GetSystemWow64DirectoryA(LPSTR lpBuffer, UINT uSize) {
return 0; return 0;
} }
UINT WIN_FUNC GetSystemWow64DirectoryW(LPWSTR lpBuffer, UINT uSize) { UINT WINAPI GetSystemWow64DirectoryW(LPWSTR lpBuffer, UINT uSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetSystemWow64DirectoryW(%p, %u)\n", lpBuffer, uSize); DEBUG_LOG("GetSystemWow64DirectoryW(%p, %u)\n", lpBuffer, uSize);
(void)lpBuffer; (void)lpBuffer;
@@ -908,7 +908,7 @@ UINT WIN_FUNC GetSystemWow64DirectoryW(LPWSTR lpBuffer, UINT uSize) {
return 0; return 0;
} }
UINT WIN_FUNC GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize) { UINT WINAPI GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetWindowsDirectoryA(%p, %u)\n", lpBuffer, uSize); DEBUG_LOG("GetWindowsDirectoryA(%p, %u)\n", lpBuffer, uSize);
if (!lpBuffer) { if (!lpBuffer) {
@@ -924,12 +924,12 @@ UINT WIN_FUNC GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize) {
return static_cast<UINT>(len); return static_cast<UINT>(len);
} }
UINT WIN_FUNC GetSystemWindowsDirectoryA(LPSTR lpBuffer, UINT uSize) { UINT WINAPI GetSystemWindowsDirectoryA(LPSTR lpBuffer, UINT uSize) {
DEBUG_LOG("GetSystemWindowsDirectoryA(%p, %u)\n", lpBuffer, uSize); DEBUG_LOG("GetSystemWindowsDirectoryA(%p, %u)\n", lpBuffer, uSize);
return GetWindowsDirectoryA(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); DEBUG_LOG("GetSystemWindowsDirectoryW(%p, %u)\n", lpBuffer, uSize);
if (!lpBuffer) { if (!lpBuffer) {
return 0; return 0;
@@ -945,7 +945,7 @@ UINT WIN_FUNC GetSystemWindowsDirectoryW(LPWSTR lpBuffer, UINT uSize) {
return length; return length;
} }
DWORD WIN_FUNC GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer) { DWORD WINAPI GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetCurrentDirectoryA(%u, %p)\n", nBufferLength, lpBuffer); DEBUG_LOG("GetCurrentDirectoryA(%u, %p)\n", nBufferLength, lpBuffer);
@@ -970,7 +970,7 @@ DWORD WIN_FUNC GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer) {
return required - 1; return required - 1;
} }
DWORD WIN_FUNC GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer) { DWORD WINAPI GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetCurrentDirectoryW(%u, %p)\n", nBufferLength, lpBuffer); DEBUG_LOG("GetCurrentDirectoryW(%u, %p)\n", nBufferLength, lpBuffer);
@@ -995,7 +995,7 @@ DWORD WIN_FUNC GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer) {
return required - 1; return required - 1;
} }
int WIN_FUNC SetCurrentDirectoryA(LPCSTR lpPathName) { int WINAPI SetCurrentDirectoryA(LPCSTR lpPathName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetCurrentDirectoryA(%s)\n", lpPathName ? lpPathName : "(null)"); DEBUG_LOG("SetCurrentDirectoryA(%s)\n", lpPathName ? lpPathName : "(null)");
if (!lpPathName) { if (!lpPathName) {
@@ -1012,7 +1012,7 @@ int WIN_FUNC SetCurrentDirectoryA(LPCSTR lpPathName) {
return 1; return 1;
} }
int WIN_FUNC SetCurrentDirectoryW(LPCWSTR lpPathName) { int WINAPI SetCurrentDirectoryW(LPCWSTR lpPathName) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("SetCurrentDirectoryW\n"); DEBUG_LOG("SetCurrentDirectoryW\n");
if (!lpPathName) { if (!lpPathName) {
@@ -1023,7 +1023,7 @@ int WIN_FUNC SetCurrentDirectoryW(LPCWSTR lpPathName) {
return SetCurrentDirectoryA(path.c_str()); 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetLongPathNameA(%s, %p, %u)\n", lpszShortPath ? lpszShortPath : "(null)", lpszLongPath, cchBuffer); DEBUG_LOG("GetLongPathNameA(%s, %p, %u)\n", lpszShortPath ? lpszShortPath : "(null)", lpszLongPath, cchBuffer);
if (!lpszShortPath) { if (!lpszShortPath) {
@@ -1053,7 +1053,7 @@ DWORD WIN_FUNC GetLongPathNameA(LPCSTR lpszShortPath, LPSTR lpszLongPath, DWORD
return required - 1; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetLongPathNameW(%p, %p, %u)\n", lpszShortPath, lpszLongPath, cchBuffer); DEBUG_LOG("GetLongPathNameW(%p, %p, %u)\n", lpszShortPath, lpszLongPath, cchBuffer);
if (!lpszShortPath) { if (!lpszShortPath) {
@@ -1082,7 +1082,7 @@ DWORD WIN_FUNC GetLongPathNameW(LPCWSTR lpszShortPath, LPWSTR lpszLongPath, DWOR
return required - 1; return required - 1;
} }
BOOL WIN_FUNC GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, BOOL WINAPI GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector,
LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) { LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetDiskFreeSpaceA(%s)\n", lpRootPathName ? lpRootPathName : "(null)"); DEBUG_LOG("GetDiskFreeSpaceA(%s)\n", lpRootPathName ? lpRootPathName : "(null)");
@@ -1133,7 +1133,7 @@ BOOL WIN_FUNC GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerClust
return TRUE; return TRUE;
} }
BOOL WIN_FUNC GetDiskFreeSpaceW(LPCWSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, BOOL WINAPI GetDiskFreeSpaceW(LPCWSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector,
LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) { LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
std::string rootPath = wideStringToString(lpRootPathName); std::string rootPath = wideStringToString(lpRootPathName);
@@ -1141,7 +1141,7 @@ BOOL WIN_FUNC GetDiskFreeSpaceW(LPCWSTR lpRootPathName, LPDWORD lpSectorsPerClus
lpNumberOfFreeClusters, lpTotalNumberOfClusters); lpNumberOfFreeClusters, lpTotalNumberOfClusters);
} }
BOOL WIN_FUNC GetDiskFreeSpaceExA(LPCSTR lpDirectoryName, uint64_t *lpFreeBytesAvailableToCaller, BOOL WINAPI GetDiskFreeSpaceExA(LPCSTR lpDirectoryName, uint64_t *lpFreeBytesAvailableToCaller,
uint64_t *lpTotalNumberOfBytes, uint64_t *lpTotalNumberOfFreeBytes) { uint64_t *lpTotalNumberOfBytes, uint64_t *lpTotalNumberOfFreeBytes) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetDiskFreeSpaceExA(%s)\n", lpDirectoryName ? lpDirectoryName : "(null)"); DEBUG_LOG("GetDiskFreeSpaceExA(%s)\n", lpDirectoryName ? lpDirectoryName : "(null)");
@@ -1176,7 +1176,7 @@ BOOL WIN_FUNC GetDiskFreeSpaceExA(LPCSTR lpDirectoryName, uint64_t *lpFreeBytesA
return TRUE; return TRUE;
} }
BOOL WIN_FUNC GetDiskFreeSpaceExW(LPCWSTR lpDirectoryName, uint64_t *lpFreeBytesAvailableToCaller, BOOL WINAPI GetDiskFreeSpaceExW(LPCWSTR lpDirectoryName, uint64_t *lpFreeBytesAvailableToCaller,
uint64_t *lpTotalNumberOfBytes, uint64_t *lpTotalNumberOfFreeBytes) { uint64_t *lpTotalNumberOfBytes, uint64_t *lpTotalNumberOfFreeBytes) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetDiskFreeSpaceExW -> "); DEBUG_LOG("GetDiskFreeSpaceExW -> ");

View File

@@ -1,8 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
#include <cstdarg>
struct GUID; struct GUID;
@@ -61,63 +59,63 @@ struct ACTIVATION_CONTEXT_DATA_DLL_REDIRECTION_PATH_SEGMENT {
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC IsBadReadPtr(LPCVOID lp, UINT_PTR ucb); BOOL WINAPI IsBadReadPtr(LPCVOID lp, UINT_PTR ucb);
BOOL WIN_FUNC IsBadWritePtr(LPVOID lp, UINT_PTR ucb); BOOL WINAPI IsBadWritePtr(LPVOID lp, UINT_PTR ucb);
ATOM WIN_FUNC FindAtomA(LPCSTR lpString); ATOM WINAPI FindAtomA(LPCSTR lpString);
ATOM WIN_FUNC FindAtomW(LPCWSTR lpString); ATOM WINAPI FindAtomW(LPCWSTR lpString);
ATOM WIN_FUNC AddAtomA(LPCSTR lpString); ATOM WINAPI AddAtomA(LPCSTR lpString);
ATOM WIN_FUNC AddAtomW(LPCWSTR lpString); ATOM WINAPI AddAtomW(LPCWSTR lpString);
UINT WIN_FUNC GetAtomNameA(ATOM nAtom, LPSTR lpBuffer, int nSize); UINT WINAPI GetAtomNameA(ATOM nAtom, LPSTR lpBuffer, int nSize);
UINT WIN_FUNC GetAtomNameW(ATOM nAtom, LPWSTR lpBuffer, int nSize); UINT WINAPI GetAtomNameW(ATOM nAtom, LPWSTR lpBuffer, int nSize);
UINT WIN_FUNC SetHandleCount(UINT uNumber); UINT WINAPI SetHandleCount(UINT uNumber);
DWORD WIN_FUNC FormatMessageA(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer, DWORD WINAPI FormatMessageA(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer,
DWORD nSize, va_list *Arguments); DWORD nSize, va_list *Arguments);
PVOID WIN_FUNC EncodePointer(PVOID Ptr); PVOID WINAPI EncodePointer(PVOID Ptr);
PVOID WIN_FUNC DecodePointer(PVOID Ptr); PVOID WINAPI DecodePointer(PVOID Ptr);
BOOL WIN_FUNC SetDllDirectoryA(LPCSTR lpPathName); BOOL WINAPI SetDllDirectoryA(LPCSTR lpPathName);
BOOL WIN_FUNC FindActCtxSectionStringA(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId, BOOL WINAPI FindActCtxSectionStringA(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId,
LPCSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData); LPCSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData);
BOOL WIN_FUNC FindActCtxSectionStringW(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId, BOOL WINAPI FindActCtxSectionStringW(DWORD dwFlags, const GUID *lpExtensionGuid, ULONG ulSectionId,
LPCWSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData); LPCWSTR lpStringToFind, PACTCTX_SECTION_KEYED_DATA ReturnedData);
BOOL WIN_FUNC GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize); BOOL WINAPI GetComputerNameA(LPSTR lpBuffer, LPDWORD nSize);
BOOL WIN_FUNC GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize); BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD nSize);
HGLOBAL WIN_FUNC GlobalAlloc(UINT uFlags, SIZE_T dwBytes); HGLOBAL WINAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes);
HGLOBAL WIN_FUNC GlobalFree(HGLOBAL hMem); HGLOBAL WINAPI GlobalFree(HGLOBAL hMem);
HGLOBAL WIN_FUNC GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags); HGLOBAL WINAPI GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags);
UINT WIN_FUNC GlobalFlags(HGLOBAL hMem); UINT WINAPI GlobalFlags(HGLOBAL hMem);
HLOCAL WIN_FUNC LocalAlloc(UINT uFlags, SIZE_T uBytes); HLOCAL WINAPI LocalAlloc(UINT uFlags, SIZE_T uBytes);
HLOCAL WIN_FUNC LocalFree(HLOCAL hMem); HLOCAL WINAPI LocalFree(HLOCAL hMem);
HLOCAL WIN_FUNC LocalReAlloc(HLOCAL hMem, SIZE_T uBytes, UINT uFlags); HLOCAL WINAPI LocalReAlloc(HLOCAL hMem, SIZE_T uBytes, UINT uFlags);
HLOCAL WIN_FUNC LocalHandle(LPCVOID pMem); HLOCAL WINAPI LocalHandle(LPCVOID pMem);
LPVOID WIN_FUNC LocalLock(HLOCAL hMem); LPVOID WINAPI LocalLock(HLOCAL hMem);
BOOL WIN_FUNC LocalUnlock(HLOCAL hMem); BOOL WINAPI LocalUnlock(HLOCAL hMem);
SIZE_T WIN_FUNC LocalSize(HLOCAL hMem); SIZE_T WINAPI LocalSize(HLOCAL hMem);
UINT WIN_FUNC LocalFlags(HLOCAL hMem); UINT WINAPI LocalFlags(HLOCAL hMem);
UINT WIN_FUNC GetSystemDirectoryA(LPSTR lpBuffer, UINT uSize); UINT WINAPI GetSystemDirectoryA(LPSTR lpBuffer, UINT uSize);
UINT WIN_FUNC GetSystemDirectoryW(LPWSTR lpBuffer, UINT uSize); UINT WINAPI GetSystemDirectoryW(LPWSTR lpBuffer, UINT uSize);
UINT WIN_FUNC GetSystemWow64DirectoryA(LPSTR lpBuffer, UINT uSize); UINT WINAPI GetSystemWow64DirectoryA(LPSTR lpBuffer, UINT uSize);
UINT WIN_FUNC GetSystemWow64DirectoryW(LPWSTR lpBuffer, UINT uSize); UINT WINAPI GetSystemWow64DirectoryW(LPWSTR lpBuffer, UINT uSize);
UINT WIN_FUNC GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize); UINT WINAPI GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize);
UINT WIN_FUNC GetSystemWindowsDirectoryA(LPSTR lpBuffer, UINT uSize); UINT WINAPI GetSystemWindowsDirectoryA(LPSTR lpBuffer, UINT uSize);
UINT WIN_FUNC GetSystemWindowsDirectoryW(LPWSTR lpBuffer, UINT uSize); UINT WINAPI GetSystemWindowsDirectoryW(LPWSTR lpBuffer, UINT uSize);
DWORD WIN_FUNC GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer); DWORD WINAPI GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer);
DWORD WIN_FUNC GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer); DWORD WINAPI GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer);
int WIN_FUNC SetCurrentDirectoryA(LPCSTR lpPathName); int WINAPI SetCurrentDirectoryA(LPCSTR lpPathName);
int WIN_FUNC SetCurrentDirectoryW(LPCWSTR lpPathName); int WINAPI SetCurrentDirectoryW(LPCWSTR lpPathName);
DWORD WIN_FUNC GetLongPathNameA(LPCSTR lpszShortPath, LPSTR lpszLongPath, DWORD cchBuffer); DWORD WINAPI GetLongPathNameA(LPCSTR lpszShortPath, LPSTR lpszLongPath, DWORD cchBuffer);
DWORD WIN_FUNC GetLongPathNameW(LPCWSTR lpszShortPath, LPWSTR lpszLongPath, DWORD cchBuffer); DWORD WINAPI GetLongPathNameW(LPCWSTR lpszShortPath, LPWSTR lpszLongPath, DWORD cchBuffer);
BOOL WIN_FUNC GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, BOOL WINAPI GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector,
LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters); LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters);
BOOL WIN_FUNC GetDiskFreeSpaceW(LPCWSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, BOOL WINAPI GetDiskFreeSpaceW(LPCWSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector,
LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters); LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters);
BOOL WIN_FUNC GetDiskFreeSpaceExA(LPCSTR lpDirectoryName, uint64_t *lpFreeBytesAvailableToCaller, BOOL WINAPI GetDiskFreeSpaceExA(LPCSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailableToCaller,
uint64_t *lpTotalNumberOfBytes, uint64_t *lpTotalNumberOfFreeBytes); PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes);
BOOL WIN_FUNC GetDiskFreeSpaceExW(LPCWSTR lpDirectoryName, uint64_t *lpFreeBytesAvailableToCaller, BOOL WINAPI GetDiskFreeSpaceExW(LPCWSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailableToCaller,
uint64_t *lpTotalNumberOfBytes, uint64_t *lpTotalNumberOfFreeBytes); PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes);
} // namespace kernel32 } // namespace kernel32

View File

@@ -8,7 +8,7 @@
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode) { BOOL WINAPI GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: GetConsoleMode(%p)\n", hConsoleHandle); DEBUG_LOG("STUB: GetConsoleMode(%p)\n", hConsoleHandle);
if (lpMode) { if (lpMode) {
@@ -17,7 +17,7 @@ BOOL WIN_FUNC GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode) { BOOL WINAPI SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: SetConsoleMode(%p, 0x%x)\n", hConsoleHandle, dwMode); DEBUG_LOG("STUB: SetConsoleMode(%p, 0x%x)\n", hConsoleHandle, dwMode);
(void)hConsoleHandle; (void)hConsoleHandle;
@@ -25,19 +25,19 @@ BOOL WIN_FUNC SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode) {
return TRUE; return TRUE;
} }
UINT WIN_FUNC GetConsoleCP() { UINT WINAPI GetConsoleCP() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: GetConsoleCP() -> 65001\n"); DEBUG_LOG("STUB: GetConsoleCP() -> 65001\n");
return 65001; // UTF-8 return 65001; // UTF-8
} }
UINT WIN_FUNC GetConsoleOutputCP() { UINT WINAPI GetConsoleOutputCP() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: GetConsoleOutputCP() -> 65001\n"); DEBUG_LOG("STUB: GetConsoleOutputCP() -> 65001\n");
return 65001; // UTF-8 return 65001; // UTF-8
} }
BOOL WIN_FUNC SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add) { BOOL WINAPI SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: SetConsoleCtrlHandler(%p, %u)\n", reinterpret_cast<const void *>(HandlerRoutine), Add); DEBUG_LOG("STUB: SetConsoleCtrlHandler(%p, %u)\n", reinterpret_cast<const void *>(HandlerRoutine), Add);
(void)HandlerRoutine; (void)HandlerRoutine;
@@ -45,7 +45,7 @@ BOOL WIN_FUNC SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add) {
return TRUE; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: GetConsoleScreenBufferInfo(%p, %p)\n", hConsoleOutput, lpConsoleScreenBufferInfo); DEBUG_LOG("STUB: GetConsoleScreenBufferInfo(%p, %p)\n", hConsoleOutput, lpConsoleScreenBufferInfo);
(void)hConsoleOutput; (void)hConsoleOutput;
@@ -61,7 +61,7 @@ BOOL WIN_FUNC GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, CONSOLE_SCREEN_B
return TRUE; 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) { LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("WriteConsoleW(%p, %p, %u, %p, %p)\n", hConsoleOutput, lpBuffer, nNumberOfCharsToWrite, 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; return FALSE;
} }
DWORD WIN_FUNC GetConsoleTitleA(LPSTR lpConsoleTitle, DWORD nSize) { DWORD WINAPI GetConsoleTitleA(LPSTR lpConsoleTitle, DWORD nSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetConsoleTitleA(%p, %u)\n", lpConsoleTitle, nSize); DEBUG_LOG("GetConsoleTitleA(%p, %u)\n", lpConsoleTitle, nSize);
if (lpConsoleTitle && nSize > 0) { if (lpConsoleTitle && nSize > 0) {
@@ -99,7 +99,7 @@ DWORD WIN_FUNC GetConsoleTitleA(LPSTR lpConsoleTitle, DWORD nSize) {
return 0; return 0;
} }
DWORD WIN_FUNC GetConsoleTitleW(LPWSTR lpConsoleTitle, DWORD nSize) { DWORD WINAPI GetConsoleTitleW(LPWSTR lpConsoleTitle, DWORD nSize) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetConsoleTitleW(%p, %u)\n", lpConsoleTitle, nSize); DEBUG_LOG("GetConsoleTitleW(%p, %u)\n", lpConsoleTitle, nSize);
if (lpConsoleTitle && nSize > 0) { if (lpConsoleTitle && nSize > 0) {
@@ -109,7 +109,7 @@ DWORD WIN_FUNC GetConsoleTitleW(LPWSTR lpConsoleTitle, DWORD nSize) {
return 0; 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) { LPDWORD lpNumberOfEventsRead) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: PeekConsoleInputA(%p, %p, %u)\n", hConsoleInput, lpBuffer, nLength); 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; 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) { LPDWORD lpNumberOfEventsRead) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: ReadConsoleInputA(%p, %p, %u)\n", hConsoleInput, lpBuffer, nLength); DEBUG_LOG("STUB: ReadConsoleInputA(%p, %p, %u)\n", hConsoleInput, lpBuffer, nLength);

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
struct COORD { struct COORD {
SHORT X; SHORT X;
@@ -28,19 +28,19 @@ using PHANDLER_ROUTINE = BOOL(WIN_FUNC *)(DWORD CtrlType);
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode); BOOL WINAPI GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode);
BOOL WIN_FUNC SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode); BOOL WINAPI SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode);
UINT WIN_FUNC GetConsoleCP(); UINT WINAPI GetConsoleCP();
UINT WIN_FUNC GetConsoleOutputCP(); UINT WINAPI GetConsoleOutputCP();
BOOL WIN_FUNC SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add); BOOL WINAPI SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add);
BOOL WIN_FUNC GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, CONSOLE_SCREEN_BUFFER_INFO *lpConsoleScreenBufferInfo); BOOL WINAPI GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, CONSOLE_SCREEN_BUFFER_INFO *lpConsoleScreenBufferInfo);
BOOL WIN_FUNC WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumberOfCharsToWrite, BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumberOfCharsToWrite,
LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved); LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved);
DWORD WIN_FUNC GetConsoleTitleA(LPSTR lpConsoleTitle, DWORD nSize); DWORD WINAPI GetConsoleTitleA(LPSTR lpConsoleTitle, DWORD nSize);
DWORD WIN_FUNC GetConsoleTitleW(LPWSTR lpConsoleTitle, DWORD nSize); DWORD WINAPI GetConsoleTitleW(LPWSTR lpConsoleTitle, DWORD nSize);
BOOL WIN_FUNC PeekConsoleInputA(HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength, BOOL WINAPI PeekConsoleInputA(HANDLE hConsoleInput, INPUT_RECORD *lpBuffer, DWORD nLength,
LPDWORD lpNumberOfEventsRead); 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); LPDWORD lpNumberOfEventsRead);
} // namespace kernel32 } // namespace kernel32

View File

@@ -83,25 +83,25 @@ std::string localeInfoString(int LCType) {
namespace kernel32 { namespace kernel32 {
UINT WIN_FUNC GetACP() { UINT WINAPI GetACP() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetACP() -> %u\n", 28591); DEBUG_LOG("GetACP() -> %u\n", 28591);
return 28591; // Latin1 (ISO/IEC 8859-1) return 28591; // Latin1 (ISO/IEC 8859-1)
} }
LANGID WIN_FUNC GetSystemDefaultLangID() { LANGID WINAPI GetSystemDefaultLangID() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: GetSystemDefaultLangID()\n"); DEBUG_LOG("STUB: GetSystemDefaultLangID()\n");
return 0; return 0;
} }
LANGID WIN_FUNC GetUserDefaultUILanguage() { LANGID WINAPI GetUserDefaultUILanguage() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: GetUserDefaultUILanguage()\n"); DEBUG_LOG("STUB: GetUserDefaultUILanguage()\n");
return 0; return 0;
} }
BOOL WIN_FUNC GetCPInfo(UINT CodePage, LPCPINFO lpCPInfo) { BOOL WINAPI GetCPInfo(UINT CodePage, LPCPINFO lpCPInfo) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetCPInfo(%u, %p)\n", CodePage, lpCPInfo); DEBUG_LOG("GetCPInfo(%u, %p)\n", CodePage, lpCPInfo);
(void)CodePage; (void)CodePage;
@@ -118,7 +118,7 @@ BOOL WIN_FUNC GetCPInfo(UINT CodePage, LPCPINFO lpCPInfo) {
return TRUE; 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) { int cchCount2) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("CompareStringA(%u, %u, %s, %d, %s, %d)\n", Locale, dwCmpFlags, lpString1 ? lpString1 : "(null)", 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); 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) { int cchCount2) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("CompareStringW(%u, %u, %p, %d, %p, %d)\n", Locale, dwCmpFlags, lpString1, cchCount1, lpString2, 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); return compareStrings(str1, str2, dwCmpFlags);
} }
BOOL WIN_FUNC IsValidCodePage(UINT CodePage) { BOOL WINAPI IsValidCodePage(UINT CodePage) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("IsValidCodePage(%u)\n", CodePage); DEBUG_LOG("IsValidCodePage(%u)\n", CodePage);
(void)CodePage; (void)CodePage;
return TRUE; return TRUE;
} }
BOOL WIN_FUNC IsValidLocale(LCID Locale, DWORD dwFlags) { BOOL WINAPI IsValidLocale(LCID Locale, DWORD dwFlags) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("IsValidLocale(%u, 0x%x)\n", Locale, dwFlags); DEBUG_LOG("IsValidLocale(%u, 0x%x)\n", Locale, dwFlags);
(void)Locale; (void)Locale;
@@ -175,7 +175,7 @@ BOOL WIN_FUNC IsValidLocale(LCID Locale, DWORD dwFlags) {
return TRUE; 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetLocaleInfoA(%u, %u, %p, %d)\n", Locale, LCType, lpLCData, cchData); DEBUG_LOG("GetLocaleInfoA(%u, %u, %p, %d)\n", Locale, LCType, lpLCData, cchData);
(void)Locale; (void)Locale;
@@ -199,7 +199,7 @@ int WIN_FUNC GetLocaleInfoA(LCID Locale, LCTYPE LCType, LPSTR lpLCData, int cchD
return static_cast<int>(required); return static_cast<int>(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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetLocaleInfoW(%u, %u, %p, %d)\n", Locale, LCType, lpLCData, cchData); DEBUG_LOG("GetLocaleInfoW(%u, %u, %p, %d)\n", Locale, LCType, lpLCData, cchData);
(void)Locale; (void)Locale;
@@ -224,7 +224,7 @@ int WIN_FUNC GetLocaleInfoW(LCID Locale, LCTYPE LCType, LPWSTR lpLCData, int cch
return static_cast<int>(required); return static_cast<int>(required);
} }
BOOL WIN_FUNC EnumSystemLocalesA(LOCALE_ENUMPROCA lpLocaleEnumProc, DWORD dwFlags) { BOOL WINAPI EnumSystemLocalesA(LOCALE_ENUMPROCA lpLocaleEnumProc, DWORD dwFlags) {
{ {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("EnumSystemLocalesA(%p, 0x%x)\n", lpLocaleEnumProc, dwFlags); 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); return lpLocaleEnumProc(localeId);
} }
LCID WIN_FUNC GetUserDefaultLCID() { LCID WINAPI GetUserDefaultLCID() {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("GetUserDefaultLCID()\n"); DEBUG_LOG("GetUserDefaultLCID()\n");
return 0x0409; // en-US return 0x0409; // en-US
} }
BOOL WIN_FUNC IsDBCSLeadByte(BYTE TestChar) { BOOL WINAPI IsDBCSLeadByte(BYTE TestChar) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("IsDBCSLeadByte(%u)\n", TestChar); DEBUG_LOG("IsDBCSLeadByte(%u)\n", TestChar);
(void)TestChar; (void)TestChar;
return FALSE; return FALSE;
} }
BOOL WIN_FUNC IsDBCSLeadByteEx(UINT CodePage, BYTE TestChar) { BOOL WINAPI IsDBCSLeadByteEx(UINT CodePage, BYTE TestChar) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("IsDBCSLeadByteEx(%u, %u)\n", CodePage, TestChar); 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("LCMapStringW(%u, 0x%x, %p, %d, %p, %d)\n", Locale, dwMapFlags, lpSrcStr, cchSrc, lpDestStr, cchDest); DEBUG_LOG("LCMapStringW(%u, 0x%x, %p, %d, %p, %d)\n", Locale, dwMapFlags, lpSrcStr, cchSrc, lpDestStr, cchDest);
(void)Locale; (void)Locale;
@@ -330,7 +330,7 @@ int WIN_FUNC LCMapStringW(LCID Locale, DWORD dwMapFlags, LPCWCH lpSrcStr, int cc
return static_cast<int>(srcLen); return static_cast<int>(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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("LCMapStringA(%u, 0x%x, %p, %d, %p, %d)\n", Locale, dwMapFlags, lpSrcStr, cchSrc, lpDestStr, cchDest); DEBUG_LOG("LCMapStringA(%u, 0x%x, %p, %d, %p, %d)\n", Locale, dwMapFlags, lpSrcStr, cchSrc, lpDestStr, cchDest);
if (!lpSrcStr) { if (!lpSrcStr) {

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
constexpr UINT MAX_DEFAULTCHAR = 2; constexpr UINT MAX_DEFAULTCHAR = 2;
constexpr UINT MAX_LEADBYTES = 12; constexpr UINT MAX_LEADBYTES = 12;
@@ -16,23 +16,23 @@ using LOCALE_ENUMPROCA = BOOL(WIN_FUNC *)(LPSTR);
namespace kernel32 { namespace kernel32 {
UINT WIN_FUNC GetACP(); UINT WINAPI GetACP();
LANGID WIN_FUNC GetSystemDefaultLangID(); LANGID WINAPI GetSystemDefaultLangID();
LANGID WIN_FUNC GetUserDefaultUILanguage(); LANGID WINAPI GetUserDefaultUILanguage();
BOOL WIN_FUNC GetCPInfo(UINT CodePage, LPCPINFO lpCPInfo); BOOL WINAPI GetCPInfo(UINT CodePage, LPCPINFO lpCPInfo);
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); 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); int cchCount2);
BOOL WIN_FUNC IsValidCodePage(UINT CodePage); BOOL WINAPI IsValidCodePage(UINT CodePage);
BOOL WIN_FUNC IsValidLocale(LCID Locale, DWORD dwFlags); BOOL WINAPI IsValidLocale(LCID Locale, DWORD dwFlags);
int WIN_FUNC GetLocaleInfoA(LCID Locale, LCTYPE LCType, LPSTR lpLCData, int cchData); int WINAPI GetLocaleInfoA(LCID Locale, LCTYPE LCType, LPSTR lpLCData, int cchData);
int WIN_FUNC GetLocaleInfoW(LCID Locale, LCTYPE LCType, LPWSTR lpLCData, int cchData); int WINAPI GetLocaleInfoW(LCID Locale, LCTYPE LCType, LPWSTR lpLCData, int cchData);
BOOL WIN_FUNC EnumSystemLocalesA(LOCALE_ENUMPROCA lpLocaleEnumProc, DWORD dwFlags); BOOL WINAPI EnumSystemLocalesA(LOCALE_ENUMPROCA lpLocaleEnumProc, DWORD dwFlags);
LCID WIN_FUNC GetUserDefaultLCID(); LCID WINAPI GetUserDefaultLCID();
BOOL WIN_FUNC IsDBCSLeadByte(BYTE TestChar); BOOL WINAPI IsDBCSLeadByte(BYTE TestChar);
BOOL WIN_FUNC IsDBCSLeadByteEx(UINT CodePage, BYTE TestChar); BOOL WINAPI 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);
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);
} // namespace kernel32 } // namespace kernel32

View File

@@ -5,7 +5,7 @@
namespace kernel32 { 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(); HOST_CONTEXT_GUARD();
DEBUG_LOG("RtlUnwind(%p, %p, %p, %p)\n", TargetFrame, TargetIp, ExceptionRecord, ReturnValue); 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"); DEBUG_LOG("WARNING: Silently returning from RtlUnwind - exception handlers and clean up code may not be run\n");

View File

@@ -1,10 +1,10 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
#include "errhandlingapi.h" #include "errhandlingapi.h"
namespace kernel32 { 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 } // namespace kernel32

View File

@@ -8,7 +8,7 @@
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC Wow64DisableWow64FsRedirection(PVOID *OldValue) { BOOL WINAPI Wow64DisableWow64FsRedirection(PVOID *OldValue) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: Wow64DisableWow64FsRedirection(%p)\n", OldValue); DEBUG_LOG("STUB: Wow64DisableWow64FsRedirection(%p)\n", OldValue);
if (OldValue) { if (OldValue) {
@@ -17,14 +17,14 @@ BOOL WIN_FUNC Wow64DisableWow64FsRedirection(PVOID *OldValue) {
return TRUE; return TRUE;
} }
BOOL WIN_FUNC Wow64RevertWow64FsRedirection(PVOID OldValue) { BOOL WINAPI Wow64RevertWow64FsRedirection(PVOID OldValue) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("STUB: Wow64RevertWow64FsRedirection(%p)\n", OldValue); DEBUG_LOG("STUB: Wow64RevertWow64FsRedirection(%p)\n", OldValue);
(void)OldValue; (void)OldValue;
return TRUE; return TRUE;
} }
BOOL WIN_FUNC IsWow64Process(HANDLE hProcess, PBOOL Wow64Process) { BOOL WINAPI IsWow64Process(HANDLE hProcess, PBOOL Wow64Process) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("IsWow64Process(%p, %p)\n", hProcess, Wow64Process); DEBUG_LOG("IsWow64Process(%p, %p)\n", hProcess, Wow64Process);
if (!Wow64Process) { if (!Wow64Process) {

View File

@@ -1,11 +1,11 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
namespace kernel32 { namespace kernel32 {
BOOL WIN_FUNC Wow64DisableWow64FsRedirection(PVOID *OldValue); BOOL WINAPI Wow64DisableWow64FsRedirection(PVOID *OldValue);
BOOL WIN_FUNC Wow64RevertWow64FsRedirection(PVOID OldValue); BOOL WINAPI Wow64RevertWow64FsRedirection(PVOID OldValue);
BOOL WIN_FUNC IsWow64Process(HANDLE hProcess, PBOOL Wow64Process); BOOL WINAPI IsWow64Process(HANDLE hProcess, PBOOL Wow64Process);
} // namespace kernel32 } // namespace kernel32

View File

@@ -3,6 +3,8 @@
#include "kernel32/internal.h" #include "kernel32/internal.h"
#include "modules.h" #include "modules.h"
#include <cstring>
namespace mscoree { namespace mscoree {
void WIN_FUNC CorExitProcess(int exitCode) { void WIN_FUNC CorExitProcess(int exitCode) {

View File

@@ -702,7 +702,7 @@ namespace msvcrt {
void WIN_ENTRY _initterm(const _PVFV *ppfn, const _PVFV* end) { void WIN_ENTRY _initterm(const _PVFV *ppfn, const _PVFV* end) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("_initterm(%p, %p)\n", ppfn, end); DEBUG_LOG("_initterm(%p, %p)\n", ppfn, end);
TIB *tib = wibo::getThreadTibForHost(); auto *tib = wibo::getThreadTibForHost();
for (; ppfn < end; ppfn++) { for (; ppfn < end; ppfn++) {
_PVFV func = *ppfn; _PVFV func = *ppfn;
if (func) { if (func) {
@@ -718,7 +718,7 @@ namespace msvcrt {
int WIN_ENTRY _initterm_e(const _PIFV *ppfn, const _PIFV *end) { int WIN_ENTRY _initterm_e(const _PIFV *ppfn, const _PIFV *end) {
HOST_CONTEXT_GUARD(); HOST_CONTEXT_GUARD();
DEBUG_LOG("_initterm_e(%p, %p)\n", ppfn, end); DEBUG_LOG("_initterm_e(%p, %p)\n", ppfn, end);
TIB *tib = wibo::getThreadTibForHost(); auto *tib = wibo::getThreadTibForHost();
for (; ppfn < end; ppfn++) { for (; ppfn < end; ppfn++) {
_PIFV func = *ppfn; _PIFV func = *ppfn;
if (func) { if (func) {

View File

@@ -10,6 +10,7 @@
#include "strutil.h" #include "strutil.h"
#include <cerrno> #include <cerrno>
#include <cstring>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>

View File

@@ -3,6 +3,8 @@
#include "errors.h" #include "errors.h"
#include "modules.h" #include "modules.h"
#include <cstring>
namespace { namespace {
constexpr HRESULT E_INVALIDARG = static_cast<HRESULT>(0x80070057); constexpr HRESULT E_INVALIDARG = static_cast<HRESULT>(0x80070057);
constexpr HRESULT CO_E_CLASSSTRING = static_cast<HRESULT>(0x800401F3); constexpr HRESULT CO_E_CLASSSTRING = static_cast<HRESULT>(0x800401F3);

View File

@@ -5,6 +5,8 @@
#include "modules.h" #include "modules.h"
#include "resources.h" #include "resources.h"
#include <cstring>
namespace user32 { namespace user32 {
constexpr uint32_t RT_STRING_ID = 6; constexpr uint32_t RT_STRING_ID = 6;

View File

@@ -2,6 +2,8 @@
#include "context.h" #include "context.h"
#include "modules.h" #include "modules.h"
#include <cstring>
namespace vcruntime { namespace vcruntime {
void *WIN_ENTRY memcpy(void *dest, const void *src, size_t count) { void *WIN_ENTRY memcpy(void *dest, const void *src, size_t count) {

View File

@@ -1,27 +1,15 @@
#pragma once #pragma once
#include "types.h"
#include <cassert> #include <cassert>
#include <cstddef>
#include <cstdint> #include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <filesystem> #include <filesystem>
#include <string> #include <string>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
#include <vector> #include <vector>
// 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(...) \ #define DEBUG_LOG(...) \
do { \ do { \
if (wibo::debugEnabled) { \ if (wibo::debugEnabled) { \
@@ -34,368 +22,6 @@
#define VERBOSE_LOG(...) ((void)0) #define VERBOSE_LOG(...) ((void)0)
#endif #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 { namespace wibo {
extern char **argv; extern char **argv;
@@ -410,12 +36,12 @@ extern uint16_t tibSelector;
extern int tibEntryNumber; extern int tibEntryNumber;
extern PEB *processPeb; extern PEB *processPeb;
TIB *allocateTib(); TEB *allocateTib();
void destroyTib(TIB *tib); void destroyTib(TEB *tib);
void initializeTibStackInfo(TIB *tib); void initializeTibStackInfo(TEB *tib);
bool installTibForCurrentThread(TIB *tib); bool installTibForCurrentThread(TEB *tib);
void setThreadTibForHost(TIB *tib); void setThreadTibForHost(TEB *tib);
TIB *getThreadTibForHost(); TEB *getThreadTibForHost();
void debug_log(const char *fmt, ...); void debug_log(const char *fmt, ...);

View File

@@ -4,18 +4,18 @@
namespace { namespace {
constexpr size_t kHostFsOffset = offsetof(TIB, hostFsSelector); constexpr size_t kHostFsOffset = offsetof(TEB, hostFsSelector);
constexpr size_t kHostGsOffset = offsetof(TIB, hostGsSelector); constexpr size_t kHostGsOffset = offsetof(TEB, hostGsSelector);
constexpr size_t kHostValidOffset = offsetof(TIB, hostSegmentsValid); constexpr size_t kHostValidOffset = offsetof(TEB, hostSegmentsValid);
thread_local TIB *g_threadTibForHost = nullptr; thread_local TEB *g_threadTibForHost = nullptr;
} // namespace } // namespace
namespace wibo { 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) { HostContextGuard::HostContextGuard() : previousFs_(0), previousGs_(0), restore_(false) {
asm volatile("mov %%fs, %0" : "=r"(previousFs_)); 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) { if (!tib || !wibo::tibSelector) {
return; return;
} }

View File

@@ -19,7 +19,7 @@ class HostContextGuard {
class GuestContextGuard { class GuestContextGuard {
public: public:
explicit GuestContextGuard(TIB *tib); explicit GuestContextGuard(TEB *tib);
~GuestContextGuard(); ~GuestContextGuard();
GuestContextGuard(const GuestContextGuard &) = delete; GuestContextGuard(const GuestContextGuard &) = delete;
GuestContextGuard &operator=(const GuestContextGuard &) = delete; GuestContextGuard &operator=(const GuestContextGuard &) = delete;

View File

@@ -1,6 +1,7 @@
#include "errors.h" #include "errors.h"
#include "common.h"
#include <cerrno> #include <cerrno>
namespace wibo { namespace wibo {

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "common.h" #include "types.h"
#define ERROR_SUCCESS 0 #define ERROR_SUCCESS 0
#define ERROR_FILE_NOT_FOUND 2 #define ERROR_FILE_NOT_FOUND 2
@@ -49,7 +49,6 @@
#define INVALID_SET_FILE_POINTER ((DWORD) - 1) #define INVALID_SET_FILE_POINTER ((DWORD) - 1)
#define INVALID_HANDLE_VALUE ((HANDLE) - 1) #define INVALID_HANDLE_VALUE ((HANDLE) - 1)
typedef int NTSTATUS;
#define STATUS_SUCCESS ((NTSTATUS)0x00000000) #define STATUS_SUCCESS ((NTSTATUS)0x00000000)
#define STATUS_INVALID_HANDLE ((NTSTATUS)0xC0000008) #define STATUS_INVALID_HANDLE ((NTSTATUS)0xC0000008)
#define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000D) #define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000D)
@@ -62,7 +61,6 @@ typedef int NTSTATUS;
#define STATUS_UNEXPECTED_IO_ERROR ((NTSTATUS)0xC00000E9) #define STATUS_UNEXPECTED_IO_ERROR ((NTSTATUS)0xC00000E9)
#define STATUS_PIPE_BROKEN ((NTSTATUS)0xC000014B) #define STATUS_PIPE_BROKEN ((NTSTATUS)0xC000014B)
typedef int HRESULT;
#define S_OK ((HRESULT)0x00000000) #define S_OK ((HRESULT)0x00000000)
namespace wibo { namespace wibo {

View File

@@ -51,18 +51,18 @@ void wibo::debug_log(const char *fmt, ...) {
va_end(args); va_end(args);
} }
TIB *wibo::allocateTib() { TEB *wibo::allocateTib() {
auto *newTib = static_cast<TIB *>(std::calloc(1, sizeof(TIB))); auto *newTib = static_cast<TEB *>(std::calloc(1, sizeof(TEB)));
if (!newTib) { if (!newTib) {
return nullptr; return nullptr;
} }
tls::initializeTib(newTib); tls::initializeTib(newTib);
newTib->self = newTib; newTib->Tib.Self = &newTib->Tib;
newTib->peb = processPeb; newTib->Peb = processPeb;
return newTib; return newTib;
} }
void wibo::destroyTib(TIB *tibPtr) { void wibo::destroyTib(TEB *tibPtr) {
if (!tibPtr) { if (!tibPtr) {
return; return;
} }
@@ -70,7 +70,7 @@ void wibo::destroyTib(TIB *tibPtr) {
std::free(tibPtr); std::free(tibPtr);
} }
void wibo::initializeTibStackInfo(TIB *tibPtr) { void wibo::initializeTibStackInfo(TEB *tibPtr) {
if (!tibPtr) { if (!tibPtr) {
return; return;
} }
@@ -82,16 +82,16 @@ void wibo::initializeTibStackInfo(TIB *tibPtr) {
void *stackAddr = nullptr; void *stackAddr = nullptr;
size_t stackSize = 0; size_t stackSize = 0;
if (pthread_attr_getstack(&attr, &stackAddr, &stackSize) == 0 && stackAddr && stackSize > 0) { if (pthread_attr_getstack(&attr, &stackAddr, &stackSize) == 0 && stackAddr && stackSize > 0) {
tibPtr->stackLimit = stackAddr; tibPtr->Tib.StackLimit = stackAddr;
tibPtr->stackBase = static_cast<char *>(stackAddr) + stackSize; tibPtr->Tib.StackBase = static_cast<char *>(stackAddr) + stackSize;
} else { } else {
perror("Failed to get thread stack info"); 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); pthread_attr_destroy(&attr);
} }
bool wibo::installTibForCurrentThread(TIB *tibPtr) { bool wibo::installTibForCurrentThread(TEB *tibPtr) {
if (!tibPtr) { if (!tibPtr) {
return false; return false;
} }
@@ -99,7 +99,7 @@ bool wibo::installTibForCurrentThread(TIB *tibPtr) {
std::memset(&desc, 0, sizeof(desc)); std::memset(&desc, 0, sizeof(desc));
desc.entry_number = tibEntryNumber; desc.entry_number = tibEntryNumber;
desc.base_addr = reinterpret_cast<unsigned int>(tibPtr); desc.base_addr = reinterpret_cast<unsigned int>(tibPtr);
desc.limit = static_cast<unsigned int>(sizeof(TIB) - 1); desc.limit = static_cast<unsigned int>(sizeof(TEB) - 1);
desc.seg_32bit = 1; desc.seg_32bit = 1;
desc.contents = 0; desc.contents = 0;
desc.read_exec_only = 0; desc.read_exec_only = 0;
@@ -121,7 +121,7 @@ bool wibo::installTibForCurrentThread(TIB *tibPtr) {
} }
// Make this global to ease debugging // Make this global to ease debugging
TIB tib; TEB tib;
const size_t MAPS_BUFFER_SIZE = 0x10000; const size_t MAPS_BUFFER_SIZE = 0x10000;
@@ -453,11 +453,11 @@ int main(int argc, char **argv) {
// Create TIB // Create TIB
memset(&tib, 0, sizeof(tib)); memset(&tib, 0, sizeof(tib));
wibo::tls::initializeTib(&tib); wibo::tls::initializeTib(&tib);
tib.self = &tib; tib.Tib.Self = &tib.Tib;
tib.peb = static_cast<PEB *>(calloc(1, sizeof(PEB))); tib.Peb = static_cast<PEB *>(calloc(1, sizeof(PEB)));
tib.peb->ProcessParameters = tib.Peb->ProcessParameters =
static_cast<RTL_USER_PROCESS_PARAMETERS *>(calloc(1, sizeof(RTL_USER_PROCESS_PARAMETERS))); static_cast<RTL_USER_PROCESS_PARAMETERS *>(calloc(1, sizeof(RTL_USER_PROCESS_PARAMETERS)));
wibo::processPeb = tib.peb; wibo::processPeb = tib.Peb;
wibo::initializeTibStackInfo(&tib); wibo::initializeTibStackInfo(&tib);
if (!wibo::installTibForCurrentThread(&tib)) { if (!wibo::installTibForCurrentThread(&tib)) {
fprintf(stderr, "Failed to install TIB for main thread\n"); fprintf(stderr, "Failed to install TIB for main thread\n");

View File

@@ -275,7 +275,7 @@ uintptr_t resolveModuleAddress(const wibo::Executable &exec, uintptr_t address)
return static_cast<uintptr_t>(static_cast<intptr_t>(address) + exec.relocationDelta); return static_cast<uintptr_t>(static_cast<intptr_t>(address) + exec.relocationDelta);
} }
bool allocateModuleTlsForThread(wibo::ModuleInfo &module, TIB *tib) { bool allocateModuleTlsForThread(wibo::ModuleInfo &module, TEB *tib) {
if (!tib) { if (!tib) {
return true; return true;
} }
@@ -314,7 +314,7 @@ bool allocateModuleTlsForThread(wibo::ModuleInfo &module, TIB *tib) {
return true; return true;
} }
void freeModuleTlsForThread(wibo::ModuleInfo &module, TIB *tib) { void freeModuleTlsForThread(wibo::ModuleInfo &module, TEB *tib) {
if (!tib) { if (!tib) {
return; return;
} }
@@ -346,7 +346,7 @@ void runModuleTlsCallbacks(wibo::ModuleInfo &module, DWORD reason) {
if (!module.tlsInfo.hasTls || module.tlsInfo.callbacks.empty()) { if (!module.tlsInfo.hasTls || module.tlsInfo.callbacks.empty()) {
return; return;
} }
TIB *tib = wibo::getThreadTibForHost(); TEB *tib = wibo::getThreadTibForHost();
if (!tib) { if (!tib) {
return; return;
} }
@@ -590,7 +590,7 @@ BOOL callDllMain(wibo::ModuleInfo &info, DWORD reason, LPVOID reserved) {
if (!wibo::tibSelector) { if (!wibo::tibSelector) {
result = dllMain(reinterpret_cast<HMODULE>(info.executable->imageBase), callReason, callReserved); result = dllMain(reinterpret_cast<HMODULE>(info.executable->imageBase), callReason, callReserved);
} else { } else {
TIB *tib = wibo::getThreadTibForHost(); TEB *tib = wibo::getThreadTibForHost();
GUEST_CONTEXT_GUARD(tib); GUEST_CONTEXT_GUARD(tib);
result = dllMain(reinterpret_cast<HMODULE>(info.executable->imageBase), callReason, callReserved); result = dllMain(reinterpret_cast<HMODULE>(info.executable->imageBase), callReason, callReserved);
} }
@@ -892,7 +892,7 @@ void addOnExitFunction(void *table, void (*func)()) {
} }
void runPendingOnExit(ModuleInfo &info) { void runPendingOnExit(ModuleInfo &info) {
TIB *tib = wibo::getThreadTibForHost(); TEB *tib = wibo::getThreadTibForHost();
for (auto it = info.onExitFunctions.rbegin(); it != info.onExitFunctions.rend(); ++it) { for (auto it = info.onExitFunctions.rbegin(); it != info.onExitFunctions.rend(); ++it) {
auto fn = reinterpret_cast<void (*)()>(*it); auto fn = reinterpret_cast<void (*)()>(*it);
if (fn) { if (fn) {
@@ -971,7 +971,7 @@ bool initializeModuleTls(ModuleInfo &module) {
}; };
AllocContext ctx{&module, true}; AllocContext ctx{&module, true};
wibo::tls::forEachTib( wibo::tls::forEachTib(
[](TIB *tib, void *opaque) { [](TEB *tib, void *opaque) {
auto *context = static_cast<AllocContext *>(opaque); auto *context = static_cast<AllocContext *>(opaque);
if (!context->success) { if (!context->success) {
return; return;
@@ -1068,7 +1068,7 @@ void notifyDllThreadAttach() {
targets.push_back(info); targets.push_back(info);
} }
} }
TIB *tib = wibo::getThreadTibForHost(); TEB *tib = wibo::getThreadTibForHost();
for (wibo::ModuleInfo *info : targets) { for (wibo::ModuleInfo *info : targets) {
if (info && info->tlsInfo.hasTls && tib) { if (info && info->tlsInfo.hasTls && tib) {
if (!allocateModuleTlsForThread(*info, tib)) { if (!allocateModuleTlsForThread(*info, tib)) {
@@ -1093,7 +1093,7 @@ void notifyDllThreadDetach() {
targets.push_back(info); targets.push_back(info);
} }
} }
TIB *tib = wibo::getThreadTibForHost(); TEB *tib = wibo::getThreadTibForHost();
for (auto it = targets.rbegin(); it != targets.rend(); ++it) { for (auto it = targets.rbegin(); it != targets.rend(); ++it) {
if (*it && (*it)->tlsInfo.hasTls && tib) { if (*it && (*it)->tlsInfo.hasTls && tib) {
runModuleTlsCallbacks(**it, TLS_THREAD_DETACH); runModuleTlsCallbacks(**it, TLS_THREAD_DETACH);

View File

@@ -74,7 +74,7 @@ struct ModuleTlsInfo {
uint32_t characteristics = 0; uint32_t characteristics = 0;
size_t allocationSize = 0; size_t allocationSize = 0;
std::vector<void *> callbacks; std::vector<void *> callbacks;
std::unordered_map<TIB *, void *> threadAllocations; std::unordered_map<TEB *, void *> threadAllocations;
}; };
struct ModuleInfo { struct ModuleInfo {

View File

@@ -8,6 +8,7 @@
#include <cerrno> #include <cerrno>
#include <cstdio> #include <cstdio>
#include <cstdlib> #include <cstdlib>
#include <cstring>
#include <fcntl.h> #include <fcntl.h>
#include <filesystem> #include <filesystem>
#include <linux/sched.h> #include <linux/sched.h>
@@ -262,7 +263,7 @@ static std::vector<std::string> pathextValues() {
static std::vector<std::filesystem::path> parseHostPath(const std::string &value) { static std::vector<std::filesystem::path> parseHostPath(const std::string &value) {
std::vector<std::filesystem::path> paths; std::vector<std::filesystem::path> paths;
const char *delims = strchr(value.c_str(), ';') ? ";" : ":"; const char *delims = std::strchr(value.c_str(), ';') ? ";" : ":";
size_t start = 0; size_t start = 0;
while (start <= value.size()) { while (start <= value.size()) {
size_t end = value.find_first_of(delims, start); size_t end = value.find_first_of(delims, start);
@@ -411,7 +412,7 @@ static int spawnInternal(const std::vector<std::string> &args, Pin<kernel32::Pro
std::vector<std::string> ownedEnv; std::vector<std::string> ownedEnv;
ownedEnv.reserve(256); ownedEnv.reserve(256);
for (char **e = environ; *e; ++e) { 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(*e);
} }
ownedEnv.emplace_back("WIBO_DEBUG_INDENT=" + std::to_string(wibo::debugIndent + 1)); ownedEnv.emplace_back("WIBO_DEBUG_INDENT=" + std::to_string(wibo::debugIndent + 1));

View File

@@ -5,7 +5,7 @@
namespace wibo { namespace wibo {
struct Executable; class Executable;
struct ResourceIdentifier { struct ResourceIdentifier {
ResourceIdentifier() : isString(false), id(0) {} ResourceIdentifier() : isString(false), id(0) {}

View File

@@ -5,6 +5,7 @@
#include <algorithm> #include <algorithm>
#include <cctype> #include <cctype>
#include <cstdint> #include <cstdint>
#include <cstring>
#include <cwctype> #include <cwctype>
#include <sstream> #include <sstream>
#include <string> #include <string>
@@ -223,7 +224,7 @@ std::vector<uint16_t> stringToWideString(const char *src, size_t length) {
if (!src) { if (!src) {
return std::vector<uint16_t>{0}; return std::vector<uint16_t>{0};
} }
size_t len = length == static_cast<size_t>(-1) ? strlen(src) : length; size_t len = length == static_cast<size_t>(-1) ? std::strlen(src) : length;
std::vector<uint16_t> res(len + 1); std::vector<uint16_t> res(len + 1);
for (size_t i = 0; i < len; ++i) { for (size_t i = 0; i < len; ++i) {
res[i] = static_cast<uint16_t>(static_cast<unsigned char>(src[i])); res[i] = static_cast<uint16_t>(static_cast<unsigned char>(src[i]));

View File

@@ -15,7 +15,7 @@ constexpr size_t kMaxExpansionSlots = wibo::tls::kTlsMaxSlotCount - kTlsSlotCoun
std::mutex g_tlsMutex; std::mutex g_tlsMutex;
std::array<bool, wibo::tls::kTlsMaxSlotCount> g_slotUsed{}; std::array<bool, wibo::tls::kTlsMaxSlotCount> g_slotUsed{};
std::vector<TIB *> g_activeTibs; std::vector<TEB *> g_activeTibs;
size_t g_expansionCapacity = 0; size_t g_expansionCapacity = 0;
struct TlsArray { struct TlsArray {
@@ -23,8 +23,8 @@ struct TlsArray {
void *slots[]; void *slots[];
}; };
std::unordered_map<TIB *, TlsArray *> g_moduleArrays; std::unordered_map<TEB *, TlsArray *> g_moduleArrays;
std::unordered_map<TIB *, std::vector<TlsArray *>> g_moduleGarbage; std::unordered_map<TEB *, std::vector<TlsArray *>> g_moduleGarbage;
size_t g_moduleArrayCapacity = 0; size_t g_moduleArrayCapacity = 0;
TlsArray *allocateTlsArray(size_t capacity) { TlsArray *allocateTlsArray(size_t capacity) {
@@ -45,18 +45,18 @@ inline TlsArray *arrayFromSlots(void *slots) {
: nullptr; : nullptr;
} }
TlsArray *getExpansionArray(TIB *tib) { TlsArray *getExpansionArray(TEB *tib) {
if (!tib) { if (!tib) {
return nullptr; return nullptr;
} }
return arrayFromSlots(tib->tlsExpansionSlots); return arrayFromSlots(tib->TlsExpansionSlots);
} }
void setExpansionArray(TIB *tib, TlsArray *arr) { void setExpansionArray(TEB *tib, TlsArray *arr) {
if (!tib) { if (!tib) {
return; return;
} }
tib->tlsExpansionSlots = arr ? arr->slots : nullptr; tib->TlsExpansionSlots = arr ? arr->slots : nullptr;
} }
size_t chooseCapacity(size_t current, size_t required) { size_t chooseCapacity(size_t current, size_t required) {
@@ -88,7 +88,7 @@ size_t chooseCapacity(size_t current, size_t required) {
} }
struct PendingResize { struct PendingResize {
TIB *tib; TEB *tib;
TlsArray *oldArr; TlsArray *oldArr;
TlsArray *newArr; TlsArray *newArr;
}; };
@@ -106,7 +106,7 @@ bool ensureGlobalExpansionCapacityLocked(size_t required) {
} }
std::vector<PendingResize> pending; std::vector<PendingResize> pending;
pending.reserve(g_activeTibs.size()); pending.reserve(g_activeTibs.size());
for (TIB *tib : g_activeTibs) { for (TEB *tib : g_activeTibs) {
auto *currArr = getExpansionArray(tib); auto *currArr = getExpansionArray(tib);
size_t currentCapacity = currArr ? currArr->capacity : 0; size_t currentCapacity = currArr ? currArr->capacity : 0;
if (currentCapacity >= target) { if (currentCapacity >= target) {
@@ -136,7 +136,7 @@ bool ensureGlobalExpansionCapacityLocked(size_t required) {
return true; return true;
} }
TlsArray *getModuleArray(TIB *tib) { TlsArray *getModuleArray(TEB *tib) {
if (!tib) { if (!tib) {
return nullptr; return nullptr;
} }
@@ -144,14 +144,14 @@ TlsArray *getModuleArray(TIB *tib) {
if (it != g_moduleArrays.end()) { if (it != g_moduleArrays.end()) {
return it->second; return it->second;
} }
auto *array = arrayFromSlots(tib->threadLocalStoragePointer); auto *array = arrayFromSlots(tib->ThreadLocalStoragePointer);
if (array) { if (array) {
g_moduleArrays.emplace(tib, array); g_moduleArrays.emplace(tib, array);
} }
return array; return array;
} }
void queueOldModuleArray(TIB *tib, TlsArray *array) { void queueOldModuleArray(TEB *tib, TlsArray *array) {
if (!tib || !array) { if (!tib || !array) {
return; return;
} }
@@ -159,7 +159,7 @@ void queueOldModuleArray(TIB *tib, TlsArray *array) {
} }
struct ModulePendingResize { struct ModulePendingResize {
TIB *tib; TEB *tib;
TlsArray *oldArray; TlsArray *oldArray;
TlsArray *newArray; TlsArray *newArray;
}; };
@@ -182,7 +182,7 @@ bool ensureModuleArrayCapacityLocked(size_t required) {
} }
std::vector<ModulePendingResize> pending; std::vector<ModulePendingResize> pending;
pending.reserve(g_activeTibs.size()); pending.reserve(g_activeTibs.size());
for (TIB *tib : g_activeTibs) { for (TEB *tib : g_activeTibs) {
auto *current = getModuleArray(tib); auto *current = getModuleArray(tib);
size_t currentCapacity = current ? current->capacity : 0; size_t currentCapacity = current ? current->capacity : 0;
if (currentCapacity >= target) { if (currentCapacity >= target) {
@@ -202,7 +202,7 @@ bool ensureModuleArrayCapacityLocked(size_t required) {
} }
for (auto &entry : pending) { for (auto &entry : pending) {
g_moduleArrays[entry.tib] = entry.newArray; g_moduleArrays[entry.tib] = entry.newArray;
entry.tib->threadLocalStoragePointer = entry.newArray->slots; entry.tib->ThreadLocalStoragePointer = entry.newArray->slots;
if (entry.oldArray) { if (entry.oldArray) {
queueOldModuleArray(entry.tib, entry.oldArray); queueOldModuleArray(entry.tib, entry.oldArray);
} }
@@ -213,13 +213,13 @@ bool ensureModuleArrayCapacityLocked(size_t required) {
void zeroSlotForAllTibs(size_t index) { void zeroSlotForAllTibs(size_t index) {
if (index < kTlsSlotCount) { if (index < kTlsSlotCount) {
for (TIB *tib : g_activeTibs) { for (TEB *tib : g_activeTibs) {
tib->tlsSlots[index] = nullptr; tib->TlsSlots[index] = nullptr;
} }
return; return;
} }
size_t expansionIndex = index - kTlsSlotCount; size_t expansionIndex = index - kTlsSlotCount;
for (TIB *tib : g_activeTibs) { for (TEB *tib : g_activeTibs) {
auto *arr = getExpansionArray(tib); auto *arr = getExpansionArray(tib);
if (!arr || expansionIndex >= arr->capacity) { if (!arr || expansionIndex >= arr->capacity) {
continue; continue;
@@ -232,7 +232,7 @@ void zeroSlotForAllTibs(size_t index) {
namespace wibo::tls { namespace wibo::tls {
void initializeTib(TIB *tib) { void initializeTib(TEB *tib) {
if (!tib) { if (!tib) {
return; return;
} }
@@ -253,7 +253,7 @@ void initializeTib(TIB *tib) {
} }
} }
void cleanupTib(TIB *tib) { void cleanupTib(TEB *tib) {
if (!tib) { if (!tib) {
return; return;
} }
@@ -272,7 +272,7 @@ void cleanupTib(TIB *tib) {
} }
g_moduleGarbage.erase(garbageIt); g_moduleGarbage.erase(garbageIt);
} }
tib->threadLocalStoragePointer = nullptr; tib->ThreadLocalStoragePointer = nullptr;
auto it = std::find(g_activeTibs.begin(), g_activeTibs.end(), tib); auto it = std::find(g_activeTibs.begin(), g_activeTibs.end(), tib);
if (it != g_activeTibs.end()) { if (it != g_activeTibs.end()) {
g_activeTibs.erase(it); g_activeTibs.erase(it);
@@ -316,12 +316,12 @@ bool isSlotAllocated(DWORD index) {
return index < wibo::tls::kTlsMaxSlotCount && g_slotUsed[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<DWORD>(wibo::tls::kTlsMaxSlotCount)) { if (!tib || index >= static_cast<DWORD>(wibo::tls::kTlsMaxSlotCount)) {
return nullptr; return nullptr;
} }
if (index < static_cast<DWORD>(kTlsSlotCount)) { if (index < static_cast<DWORD>(kTlsSlotCount)) {
return tib->tlsSlots[index]; return tib->TlsSlots[index];
} }
std::lock_guard lock(g_tlsMutex); std::lock_guard lock(g_tlsMutex);
auto *arr = getExpansionArray(tib); auto *arr = getExpansionArray(tib);
@@ -335,12 +335,12 @@ void *getValue(TIB *tib, DWORD index) {
return arr->slots[expansionIndex]; 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<DWORD>(wibo::tls::kTlsMaxSlotCount)) { if (!tib || index >= static_cast<DWORD>(wibo::tls::kTlsMaxSlotCount)) {
return false; return false;
} }
if (index < static_cast<DWORD>(kTlsSlotCount)) { if (index < static_cast<DWORD>(kTlsSlotCount)) {
tib->tlsSlots[index] = value; tib->TlsSlots[index] = value;
return true; return true;
} }
std::lock_guard lock(g_tlsMutex); 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); } 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) { if (!callback) {
return; return;
} }
std::vector<TIB *> tibs; std::vector<TEB *> tibs;
{ {
std::lock_guard lock(g_tlsMutex); std::lock_guard lock(g_tlsMutex);
tibs = g_activeTibs; tibs = g_activeTibs;
} }
for (TIB *tib : tibs) { for (TEB *tib : tibs) {
callback(tib, context); callback(tib, context);
} }
} }
@@ -380,7 +380,7 @@ bool ensureModulePointerCapacity(size_t capacity) {
return ensureModuleArrayCapacityLocked(capacity); return ensureModuleArrayCapacityLocked(capacity);
} }
bool setModulePointer(TIB *tib, size_t index, void *value) { bool setModulePointer(TEB *tib, size_t index, void *value) {
if (!tib) { if (!tib) {
return false; return false;
} }
@@ -393,11 +393,11 @@ bool setModulePointer(TIB *tib, size_t index, void *value) {
return false; return false;
} }
array->slots[index] = value; array->slots[index] = value;
tib->threadLocalStoragePointer = array->slots; tib->ThreadLocalStoragePointer = array->slots;
return true; return true;
} }
void clearModulePointer(TIB *tib, size_t index) { void clearModulePointer(TEB *tib, size_t index) {
if (!tib) { if (!tib) {
return; return;
} }

View File

@@ -7,21 +7,21 @@ namespace wibo::tls {
constexpr DWORD kInvalidTlsIndex = 0xFFFFFFFFu; constexpr DWORD kInvalidTlsIndex = 0xFFFFFFFFu;
constexpr size_t kTlsMaxSlotCount = 1088; constexpr size_t kTlsMaxSlotCount = 1088;
void initializeTib(TIB *tib); void initializeTib(TEB *tib);
void cleanupTib(TIB *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 ensureModulePointerCapacity(size_t capacity);
bool setModulePointer(TIB *tib, size_t index, void *value); bool setModulePointer(TEB *tib, size_t index, void *value);
void clearModulePointer(TIB *tib, size_t index); void clearModulePointer(TEB *tib, size_t index);
DWORD reserveSlot(); DWORD reserveSlot();
bool releaseSlot(DWORD index); bool releaseSlot(DWORD index);
bool isSlotAllocated(DWORD index); bool isSlotAllocated(DWORD index);
void *getValue(TIB *tib, DWORD index); void *getValue(TEB *tib, DWORD index);
bool setValue(TIB *tib, DWORD index, void *value); bool setValue(TEB *tib, DWORD index, void *value);
void *getValue(DWORD index); void *getValue(DWORD index);
bool setValue(DWORD index, void *value); bool setValue(DWORD index, void *value);

405
src/types.h Normal file
View File

@@ -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");

248
tools/gen_trampolines.py Normal file
View File

@@ -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 <stddef.h>")
lines.append("#include <string.h>")
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())

236
tools/script_venv.py Normal file
View File

@@ -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<content>(^#(| .*)$\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:]])