ntdll: Move Wow64 initialization to LdrInitializeThunk().
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
7a1ed2e121
commit
4f594e1552
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user