Alexandre Julliard : ntdll: Move Wow64 initialization to LdrInitializeThunk().
Alexandre Julliard
julliard at winehq.org
Mon Apr 5 16:28:23 CDT 2021
Module: wine
Branch: master
Commit: 4f594e155254cdd236bf1b44299c9cd4cccdcb73
URL: https://source.winehq.org/git/wine.git/?a=commit;h=4f594e155254cdd236bf1b44299c9cd4cccdcb73
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Apr 5 12:04:25 2021 +0200
ntdll: Move Wow64 initialization to LdrInitializeThunk().
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/loader.c | 100 ++++++++++++++++++++++++++++------------------------
1 file changed, 53 insertions(+), 47 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index daee7675196..35cef275e9a 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -3484,6 +3484,56 @@ static void process_breakpoint(void)
}
+#ifndef _WIN64
+void *Wow64Transition = NULL;
+
+static void map_wow64cpu(void)
+{
+ SIZE_T size = 0;
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING string;
+ HANDLE file, section;
+ IO_STATUS_BLOCK io;
+ NTSTATUS status;
+
+ RtlInitUnicodeString( &string, L"\\??\\C:\\windows\\sysnative\\wow64cpu.dll" );
+ InitializeObjectAttributes( &attr, &string, 0, NULL, NULL );
+ if ((status = NtOpenFile( &file, GENERIC_READ | SYNCHRONIZE, &attr, &io, FILE_SHARE_READ,
+ FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE )))
+ {
+ WARN("failed to open wow64cpu, status %#x\n", status);
+ return;
+ }
+ if (!NtCreateSection( §ion, STANDARD_RIGHTS_REQUIRED | SECTION_QUERY |
+ SECTION_MAP_READ | SECTION_MAP_EXECUTE,
+ NULL, NULL, PAGE_EXECUTE_READ, SEC_COMMIT, file ))
+ {
+ NtMapViewOfSection( section, NtCurrentProcess(), &Wow64Transition, 0,
+ 0, NULL, &size, ViewShare, 0, PAGE_EXECUTE_READ );
+ NtClose( section );
+ }
+ NtClose( file );
+}
+
+static void init_wow64(void)
+{
+ PEB *peb = NtCurrentTeb()->Peb;
+ PEB64 *peb64;
+
+ if (!NtCurrentTeb64()) return;
+ peb64 = UlongToPtr( NtCurrentTeb64()->Peb );
+ peb64->ImageBaseAddress = PtrToUlong( peb->ImageBaseAddress );
+ peb64->OSMajorVersion = peb->OSMajorVersion;
+ peb64->OSMinorVersion = peb->OSMinorVersion;
+ peb64->OSBuildNumber = peb->OSBuildNumber;
+ peb64->OSPlatformId = peb->OSPlatformId;
+ peb64->SessionId = peb->SessionId;
+
+ map_wow64cpu();
+}
+#endif
+
+
/******************************************************************
* LdrInitializeThunk (NTDLL.@)
*
@@ -3518,6 +3568,9 @@ void WINAPI LdrInitializeThunk( CONTEXT *context, ULONG_PTR unknown2, ULONG_PTR
ANSI_STRING func_name;
WINE_MODREF *kernel32;
+#ifndef _WIN64
+ init_wow64();
+#endif
wm = build_main_module();
wm->ldr.LoadCount = -1;
@@ -3984,39 +4037,6 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
}
-#ifndef _WIN64
-void *Wow64Transition = NULL;
-
-static void map_wow64cpu(void)
-{
- SIZE_T size = 0;
- OBJECT_ATTRIBUTES attr;
- UNICODE_STRING string;
- HANDLE file, section;
- IO_STATUS_BLOCK io;
- NTSTATUS status;
-
- RtlInitUnicodeString( &string, L"\\??\\C:\\windows\\sysnative\\wow64cpu.dll" );
- InitializeObjectAttributes( &attr, &string, 0, NULL, NULL );
- if ((status = NtOpenFile( &file, GENERIC_READ | SYNCHRONIZE, &attr, &io, FILE_SHARE_READ,
- FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE )))
- {
- WARN("failed to open wow64cpu, status %#x\n", status);
- return;
- }
- if (!NtCreateSection( §ion, STANDARD_RIGHTS_REQUIRED | SECTION_QUERY |
- SECTION_MAP_READ | SECTION_MAP_EXECUTE,
- NULL, NULL, PAGE_EXECUTE_READ, SEC_COMMIT, file ))
- {
- NtMapViewOfSection( section, NtCurrentProcess(), &Wow64Transition, 0,
- 0, NULL, &size, ViewShare, 0, PAGE_EXECUTE_READ );
- NtClose( section );
- }
- NtClose( file );
-}
-#endif
-
-
/***********************************************************************
* process_init
*/
@@ -4050,20 +4070,6 @@ static NTSTATUS process_init(void)
init_user_process_params();
load_global_options();
version_init();
-
-#ifndef _WIN64
- if (NtCurrentTeb64())
- {
- PEB64 *peb64 = UlongToPtr( NtCurrentTeb64()->Peb );
- peb64->ImageBaseAddress = PtrToUlong( peb->ImageBaseAddress );
- peb64->OSMajorVersion = peb->OSMajorVersion;
- peb64->OSMinorVersion = peb->OSMinorVersion;
- peb64->OSBuildNumber = peb->OSBuildNumber;
- peb64->OSPlatformId = peb->OSPlatformId;
- peb64->SessionId = peb->SessionId;
- map_wow64cpu();
- }
-#endif
return STATUS_SUCCESS;
}
More information about the wine-cvs
mailing list