ntdll: Moved the calling of the process entry point to LdrInitializeThunk.
This commit is contained in:
parent
38440f561d
commit
50fca716fd
|
@ -54,7 +54,6 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(process);
|
WINE_DEFAULT_DEBUG_CHANNEL(process);
|
||||||
WINE_DECLARE_DEBUG_CHANNEL(file);
|
WINE_DECLARE_DEBUG_CHANNEL(file);
|
||||||
WINE_DECLARE_DEBUG_CHANNEL(relay);
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -794,23 +793,7 @@ static void start_process( void *arg )
|
||||||
{
|
{
|
||||||
__TRY
|
__TRY
|
||||||
{
|
{
|
||||||
PEB *peb = NtCurrentTeb()->Peb;
|
|
||||||
IMAGE_NT_HEADERS *nt;
|
|
||||||
LPTHREAD_START_ROUTINE entry;
|
|
||||||
|
|
||||||
LdrInitializeThunk( 0, 0, 0, 0 );
|
LdrInitializeThunk( 0, 0, 0, 0 );
|
||||||
|
|
||||||
nt = RtlImageNtHeader( peb->ImageBaseAddress );
|
|
||||||
entry = (LPTHREAD_START_ROUTINE)((char *)peb->ImageBaseAddress +
|
|
||||||
nt->OptionalHeader.AddressOfEntryPoint);
|
|
||||||
|
|
||||||
if (TRACE_ON(relay))
|
|
||||||
DPRINTF( "%04lx:Starting process %s (entryproc=%p)\n", GetCurrentThreadId(),
|
|
||||||
debugstr_w(peb->ProcessParameters->ImagePathName.Buffer), entry );
|
|
||||||
|
|
||||||
SetLastError( 0 ); /* clear error code */
|
|
||||||
if (peb->BeingDebugged) DbgBreakPoint();
|
|
||||||
ExitProcess( entry( peb ) );
|
|
||||||
}
|
}
|
||||||
__EXCEPT(UnhandledExceptionFilter)
|
__EXCEPT(UnhandledExceptionFilter)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2094,6 +2094,8 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3,
|
||||||
LPCWSTR load_path;
|
LPCWSTR load_path;
|
||||||
PEB *peb = NtCurrentTeb()->Peb;
|
PEB *peb = NtCurrentTeb()->Peb;
|
||||||
IMAGE_NT_HEADERS *nt = RtlImageNtHeader( peb->ImageBaseAddress );
|
IMAGE_NT_HEADERS *nt = RtlImageNtHeader( peb->ImageBaseAddress );
|
||||||
|
LPTHREAD_START_ROUTINE entry = (LPTHREAD_START_ROUTINE)((char *)peb->ImageBaseAddress +
|
||||||
|
nt->OptionalHeader.AddressOfEntryPoint);
|
||||||
|
|
||||||
if (main_exe_file) NtClose( main_exe_file ); /* at this point the main module is created */
|
if (main_exe_file) NtClose( main_exe_file ); /* at this point the main module is created */
|
||||||
|
|
||||||
|
@ -2125,9 +2127,9 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3,
|
||||||
/* Signal the parent process to continue */
|
/* Signal the parent process to continue */
|
||||||
SERVER_START_REQ( init_process_done )
|
SERVER_START_REQ( init_process_done )
|
||||||
{
|
{
|
||||||
req->module = peb->ImageBaseAddress;
|
req->module = peb->ImageBaseAddress;
|
||||||
req->entry = (char *)peb->ImageBaseAddress + nt->OptionalHeader.AddressOfEntryPoint;
|
req->entry = entry;
|
||||||
req->gui = (nt->OptionalHeader.Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CUI);
|
req->gui = (nt->OptionalHeader.Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CUI);
|
||||||
status = wine_server_call( req );
|
status = wine_server_call( req );
|
||||||
}
|
}
|
||||||
SERVER_END_REQ;
|
SERVER_END_REQ;
|
||||||
|
@ -2151,7 +2153,16 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3,
|
||||||
RtlLeaveCriticalSection( &loader_section );
|
RtlLeaveCriticalSection( &loader_section );
|
||||||
|
|
||||||
if (nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE) VIRTUAL_UseLargeAddressSpace();
|
if (nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE) VIRTUAL_UseLargeAddressSpace();
|
||||||
return;
|
|
||||||
|
if (TRACE_ON(relay))
|
||||||
|
DPRINTF( "%04lx:Starting process %s (entryproc=%p)\n", GetCurrentThreadId(),
|
||||||
|
debugstr_w(peb->ProcessParameters->ImagePathName.Buffer), entry );
|
||||||
|
|
||||||
|
RtlSetLastWin32ErrorAndNtStatusFromNtStatus( STATUS_SUCCESS ); /* clear error code */
|
||||||
|
if (peb->BeingDebugged) DbgBreakPoint();
|
||||||
|
status = entry( peb );
|
||||||
|
LdrShutdownProcess();
|
||||||
|
NtTerminateProcess( GetCurrentProcess(), status );
|
||||||
|
|
||||||
error:
|
error:
|
||||||
ERR( "Main exe initialization for %s failed, status %lx\n",
|
ERR( "Main exe initialization for %s failed, status %lx\n",
|
||||||
|
|
|
@ -1726,7 +1726,7 @@ NTSTATUS WINAPI LdrFindResourceDirectory_U(HMODULE,const LDR_RESOURCE_INFO*,ULO
|
||||||
NTSTATUS WINAPI LdrFindResource_U(HMODULE,const LDR_RESOURCE_INFO*,ULONG,const IMAGE_RESOURCE_DATA_ENTRY**);
|
NTSTATUS WINAPI LdrFindResource_U(HMODULE,const LDR_RESOURCE_INFO*,ULONG,const IMAGE_RESOURCE_DATA_ENTRY**);
|
||||||
NTSTATUS WINAPI LdrGetDllHandle(ULONG, ULONG, const UNICODE_STRING*, HMODULE*);
|
NTSTATUS WINAPI LdrGetDllHandle(ULONG, ULONG, const UNICODE_STRING*, HMODULE*);
|
||||||
NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE, const ANSI_STRING*, ULONG, void**);
|
NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE, const ANSI_STRING*, ULONG, void**);
|
||||||
void WINAPI LdrInitializeThunk(ULONG,ULONG,ULONG,ULONG);
|
void DECLSPEC_NORETURN WINAPI LdrInitializeThunk(ULONG,ULONG,ULONG,ULONG);
|
||||||
NTSTATUS WINAPI LdrLoadDll(LPCWSTR, DWORD, const UNICODE_STRING*, HMODULE*);
|
NTSTATUS WINAPI LdrLoadDll(LPCWSTR, DWORD, const UNICODE_STRING*, HMODULE*);
|
||||||
void WINAPI LdrShutdownProcess(void);
|
void WINAPI LdrShutdownProcess(void);
|
||||||
void WINAPI LdrShutdownThread(void);
|
void WINAPI LdrShutdownThread(void);
|
||||||
|
|
Loading…
Reference in New Issue