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; }