Module: wine Branch: master Commit: 42dec97d1a54528af832e37e865302295d3e3e89 URL: https://source.winehq.org/git/wine.git/?a=commit;h=42dec97d1a54528af832e37e8...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jul 22 13:33:57 2021 +0200
wow64: Load the backend cpu dll at process init.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wow64/syscall.c | 61 +++++++++++++++++++++++++++++++++++++++++++++- dlls/wow64/wow64_private.h | 41 +++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-)
diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c index a4acb8ba646..504580e8717 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c @@ -27,10 +27,14 @@ #include "winnt.h" #include "winternl.h" #include "wine/exception.h" +#include "wow64_private.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(wow);
+USHORT native_machine = 0; +USHORT current_machine = 0; + void *dummy = RtlUnwind;
BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, void *reserved ) @@ -54,6 +58,55 @@ void __cdecl __wine_spec_unimplemented_stub( const char *module, const char *fun }
+/********************************************************************** + * load_cpu_dll + */ +static HMODULE load_cpu_dll(void) +{ + NTSTATUS status; + HMODULE module; + UNICODE_STRING str; + WCHAR path[MAX_PATH]; + const WCHAR *dir, *name; + + switch (current_machine) + { + 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 ); + } + + dir = get_machine_wow64_dir( IMAGE_FILE_MACHINE_TARGET_HOST ); + + swprintf( path, MAX_PATH, L"%s\%s", dir, name ); + RtlInitUnicodeString( &str, path ); + if ((status = LdrLoadDll( NULL, 0, &str, &module ))) + { + ERR( "failed to load CPU dll %x\n", status ); + NtTerminateProcess( GetCurrentProcess(), status ); + } + return module; +} + + +/********************************************************************** + * process_init + */ +static void process_init(void) +{ + RtlWow64GetProcessMachines( GetCurrentProcess(), ¤t_machine, &native_machine ); + if (!current_machine) current_machine = native_machine; + + load_cpu_dll(); +} + + /********************************************************************** * Wow64SystemServiceEx (NTDLL.@) */ @@ -69,5 +122,11 @@ NTSTATUS WINAPI Wow64SystemServiceEx( UINT num, UINT *args ) */ void WINAPI Wow64LdrpInitialize( CONTEXT *context ) { - FIXME( "stub\n" ); + static BOOL init_done; + + if (!init_done) + { + init_done = TRUE; + process_init(); + } } diff --git a/dlls/wow64/wow64_private.h b/dlls/wow64/wow64_private.h new file mode 100644 index 00000000000..52cc40566b1 --- /dev/null +++ b/dlls/wow64/wow64_private.h @@ -0,0 +1,41 @@ +/* + * WoW64 private definitions + * + * Copyright 2021 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WOW64_PRIVATE_H +#define __WOW64_PRIVATE_H + +extern USHORT native_machine DECLSPEC_HIDDEN; +extern USHORT current_machine DECLSPEC_HIDDEN; + +/* cf. GetSystemWow64Directory2 */ +static inline const WCHAR *get_machine_wow64_dir( USHORT machine ) +{ + switch (machine) + { + case IMAGE_FILE_MACHINE_TARGET_HOST: return L"\??\C:\windows\system32"; + case IMAGE_FILE_MACHINE_I386: return L"\??\C:\windows\syswow64"; + case IMAGE_FILE_MACHINE_ARMNT: return L"\??\C:\windows\sysarm32"; + case IMAGE_FILE_MACHINE_AMD64: return L"\??\C:\windows\sysx8664"; + case IMAGE_FILE_MACHINE_ARM64: return L"\??\C:\windows\sysarm64"; + default: return NULL; + } +} + +#endif /* __WOW64_PRIVATE_H */