mirror of
https://github.com/decompals/wibo.git
synced 2025-12-11 22:43:58 +00:00
Initial guest-to-host trampoline generation
This commit is contained in:
@@ -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
11
.gitignore
vendored
@@ -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
|
||||||
|
|||||||
102
CMakeLists.txt
102
CMakeLists.txt
@@ -5,7 +5,7 @@ set(CMAKE_CXX_FLAGS_INIT "-m32 -fno-exceptions -fno-rtti")
|
|||||||
set(CMAKE_EXE_LINKER_FLAGS_INIT "-m32")
|
set(CMAKE_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)
|
||||||
|
|
||||||
|
|||||||
@@ -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 \
|
||||||
|
|||||||
@@ -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 .)
|
||||||
|
|||||||
108
dll/advapi32.cpp
108
dll/advapi32.cpp
@@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "common.h"
|
#include "types.h"
|
||||||
|
|
||||||
namespace advapi32 {
|
namespace advapi32 {
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "common.h"
|
#include "types.h"
|
||||||
|
|
||||||
struct ACL {
|
struct ACL {
|
||||||
BYTE AclRevision;
|
BYTE AclRevision;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "common.h"
|
#include "types.h"
|
||||||
|
|
||||||
struct FILETIME;
|
struct FILETIME;
|
||||||
|
|
||||||
|
|||||||
@@ -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
12
dll/bcrypt.h
Normal 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
|
||||||
@@ -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);
|
||||||
{
|
{
|
||||||
|
|||||||
610
dll/kernel32.cpp
610
dll/kernel32.cpp
@@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,11 +41,11 @@ 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,
|
||||||
lpArguments);
|
lpArguments);
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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]) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,15 +111,15 @@ 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),
|
||||||
HeapInformation, HeapInformationLength);
|
HeapInformation, HeapInformationLength);
|
||||||
@@ -147,7 +148,7 @@ BOOL WIN_FUNC HeapSetInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LPVOID WIN_FUNC HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes) {
|
LPVOID WINAPI HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes) {
|
||||||
HOST_CONTEXT_GUARD();
|
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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 WINAPI ExitThread(DWORD dwExitCode);
|
||||||
[[noreturn]] void WIN_FUNC ExitThread(DWORD dwExitCode);
|
BOOL WINAPI GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode);
|
||||||
BOOL WIN_FUNC GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode);
|
BOOL WINAPI SetThreadPriority(HANDLE hThread, int nPriority);
|
||||||
BOOL WIN_FUNC SetThreadPriority(HANDLE hThread, int nPriority);
|
int WINAPI GetThreadPriority(HANDLE hThread);
|
||||||
int WIN_FUNC GetThreadPriority(HANDLE hThread);
|
DWORD WINAPI GetPriorityClass(HANDLE hProcess);
|
||||||
DWORD WIN_FUNC GetPriorityClass(HANDLE hProcess);
|
BOOL WINAPI GetThreadTimes(HANDLE hThread, FILETIME *lpCreationTime, FILETIME *lpExitTime, FILETIME *lpKernelTime,
|
||||||
BOOL WIN_FUNC GetThreadTimes(HANDLE hThread, FILETIME *lpCreationTime, FILETIME *lpExitTime, FILETIME *lpKernelTime,
|
FILETIME *lpUserTime);
|
||||||
FILETIME *lpUserTime);
|
BOOL WINAPI CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,
|
||||||
BOOL WIN_FUNC 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 WINAPI CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,
|
||||||
BOOL WIN_FUNC 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 WINAPI GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo);
|
||||||
void WIN_FUNC GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo);
|
void WINAPI GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo);
|
||||||
void WIN_FUNC GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo);
|
BOOL WINAPI SetThreadStackGuarantee(PULONG StackSizeInBytes);
|
||||||
BOOL WIN_FUNC SetThreadStackGuarantee(PULONG StackSizeInBytes);
|
|
||||||
|
|
||||||
} // namespace kernel32
|
} // namespace kernel32
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,15 +497,15 @@ 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,
|
||||||
nSize, Arguments);
|
nSize, Arguments);
|
||||||
@@ -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,8 +579,8 @@ 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);
|
||||||
std::vector<uint16_t> wideStorage;
|
std::vector<uint16_t> wideStorage;
|
||||||
@@ -596,8 +596,8 @@ 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(),
|
||||||
ReturnedData);
|
ReturnedData);
|
||||||
@@ -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,8 +1082,8 @@ 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)");
|
||||||
struct statvfs buf{};
|
struct statvfs buf{};
|
||||||
@@ -1133,16 +1133,16 @@ 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);
|
||||||
return GetDiskFreeSpaceA(lpRootPathName ? rootPath.c_str() : nullptr, lpSectorsPerCluster, lpBytesPerSector,
|
return GetDiskFreeSpaceA(lpRootPathName ? rootPath.c_str() : nullptr, lpSectorsPerCluster, lpBytesPerSector,
|
||||||
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)");
|
||||||
struct statvfs buf{};
|
struct statvfs buf{};
|
||||||
@@ -1176,8 +1176,8 @@ 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 -> ");
|
||||||
std::string directoryName = wideStringToString(lpDirectoryName);
|
std::string directoryName = wideStringToString(lpDirectoryName);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
390
src/common.h
390
src/common.h
@@ -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, ...);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
#include "errors.h"
|
#include "errors.h"
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
|
|
||||||
namespace wibo {
|
namespace wibo {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
32
src/main.cpp
32
src/main.cpp
@@ -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");
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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) {}
|
||||||
|
|||||||
@@ -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]));
|
||||||
|
|||||||
62
src/tls.cpp
62
src/tls.cpp
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
14
src/tls.h
14
src/tls.h
@@ -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
405
src/types.h
Normal 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
248
tools/gen_trampolines.py
Normal 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
236
tools/script_venv.py
Normal 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:]])
|
||||||
Reference in New Issue
Block a user