Module: wine Branch: master Commit: 3a5b9263848d6244d9eb1aae14fd71812f88576f URL: https://source.winehq.org/git/wine.git/?a=commit;h=3a5b9263848d6244d9eb1aae1...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Aug 31 11:32:07 2021 +0200
wow64: Load wow64win.dll.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wow64/syscall.c | 93 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 74 insertions(+), 19 deletions(-)
diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c index 087bf1aa3ad..cc2ab1c48b3 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c @@ -72,6 +72,9 @@ struct mem_header
SYSTEM_DLL_INIT_BLOCK *pLdrSystemDllInitBlock = NULL;
+/* wow64win syscall table */ +static const SYSTEM_SERVICE_TABLE *psdwhwin32; + /* cpu backend dll functions */ static void * (WINAPI *pBTCpuGetBopCode)(void); static void (WINAPI *pBTCpuProcessInit)(void); @@ -410,39 +413,84 @@ static void init_syscall_table( HMODULE module, ULONG idx, const SYSTEM_SERVICE_
/********************************************************************** - * load_cpu_dll + * load_64bit_module */ -static HMODULE load_cpu_dll(void) +static HMODULE load_64bit_module( const WCHAR *name ) { NTSTATUS status; HMODULE module; UNICODE_STRING str; WCHAR path[MAX_PATH]; - const WCHAR *dir, *name; + const WCHAR *dir = get_machine_wow64_dir( IMAGE_FILE_MACHINE_TARGET_HOST );
- switch (current_machine) + swprintf( path, MAX_PATH, L"%s\%s", dir, name ); + RtlInitUnicodeString( &str, path ); + if ((status = LdrLoadDll( NULL, 0, &str, &module ))) { - case IMAGE_FILE_MACHINE_I386: - name = (native_machine == IMAGE_FILE_MACHINE_ARM64 ? L"xtajit.dll" : L"wow64cpu.dll"); - break; - case IMAGE_FILE_MACHINE_ARM: - name = L"wowarmhw.dll"; - break; - default: - ERR( "unsupported machine %04x\n", current_machine ); - RtlExitUserProcess( 1 ); + ERR( "failed to load dll %x\n", status ); + NtTerminateProcess( GetCurrentProcess(), status ); } + return module; +}
- dir = get_machine_wow64_dir( IMAGE_FILE_MACHINE_TARGET_HOST ); + +/********************************************************************** + * load_32bit_module + */ +static HMODULE load_32bit_module( const WCHAR *name ) +{ + NTSTATUS status; + UNICODE_STRING str; + WCHAR path[MAX_PATH]; + HANDLE file, mapping; + LARGE_INTEGER size; + IO_STATUS_BLOCK io; + OBJECT_ATTRIBUTES attr; + SIZE_T len = 0; + void *module = NULL; + const WCHAR *dir = get_machine_wow64_dir( current_machine );
swprintf( path, MAX_PATH, L"%s\%s", dir, name ); RtlInitUnicodeString( &str, path ); - if ((status = LdrLoadDll( NULL, 0, &str, &module ))) + InitializeObjectAttributes( &attr, &str, OBJ_CASE_INSENSITIVE, 0, NULL ); + if ((status = NtOpenFile( &file, GENERIC_READ | SYNCHRONIZE, &attr, &io, + FILE_SHARE_READ | FILE_SHARE_DELETE, + FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE ))) goto failed; + + size.QuadPart = 0; + status = NtCreateSection( &mapping, STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | + SECTION_MAP_READ | SECTION_MAP_EXECUTE, + NULL, &size, PAGE_EXECUTE_READ, SEC_IMAGE, file ); + NtClose( file ); + if (status) goto failed; + + status = NtMapViewOfSection( mapping, GetCurrentProcess(), &module, 0, 0, NULL, &len, + ViewShare, 0, PAGE_EXECUTE_READ ); + NtClose( mapping ); + if (!status) return module; + +failed: + ERR( "failed to load dll %x\n", status ); + NtTerminateProcess( GetCurrentProcess(), status ); + return NULL; +} + + +/********************************************************************** + * get_cpu_dll_name + */ +static const WCHAR *get_cpu_dll_name(void) +{ + switch (current_machine) { - ERR( "failed to load CPU dll %x\n", status ); - NtTerminateProcess( GetCurrentProcess(), status ); + case IMAGE_FILE_MACHINE_I386: + return (native_machine == IMAGE_FILE_MACHINE_ARM64 ? L"xtajit.dll" : L"wow64cpu.dll"); + case IMAGE_FILE_MACHINE_ARM: + return L"wowarmhw.dll"; + default: + ERR( "unsupported machine %04x\n", current_machine ); + RtlExitUserProcess( 1 ); } - return module; }
@@ -464,11 +512,14 @@ static DWORD WINAPI process_init( RTL_RUN_ONCE *once, void *param, void **contex LdrGetDllHandle( NULL, 0, &str, &module ); GET_PTR( LdrSystemDllInitBlock );
- module = load_cpu_dll(); + module = load_64bit_module( get_cpu_dll_name() ); GET_PTR( BTCpuGetBopCode ); GET_PTR( BTCpuProcessInit ); GET_PTR( BTCpuSimulate );
+ module = load_64bit_module( L"wow64win.dll" ); + GET_PTR( sdwhwin32 ); + pBTCpuProcessInit();
module = (HMODULE)(ULONG_PTR)pLdrSystemDllInitBlock->ntdll_handle; @@ -476,6 +527,10 @@ static DWORD WINAPI process_init( RTL_RUN_ONCE *once, void *param, void **contex init_syscall_table( module, 0, &ntdll_syscall_table ); *(void **)RtlFindExportedRoutineByName( module, "__wine_syscall_dispatcher" ) = pBTCpuGetBopCode();
+ module = load_32bit_module( L"win32u.dll" ); + init_syscall_table( module, 1, psdwhwin32 ); + NtUnmapViewOfSection( GetCurrentProcess(), module ); + init_file_redirects(); return TRUE;