Alexandre Julliard : wow64: Load the backend cpu dll at process init.
Alexandre Julliard
julliard at winehq.org
Thu Jul 22 16:28:19 CDT 2021
Module: wine
Branch: master
Commit: 42dec97d1a54528af832e37e865302295d3e3e89
URL: https://source.winehq.org/git/wine.git/?a=commit;h=42dec97d1a54528af832e37e865302295d3e3e89
Author: Alexandre Julliard <julliard at 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 at 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 */
More information about the wine-cvs
mailing list