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(), &current_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