From 50fca716fddf5af03b4c91ae5e950daff5fbdf2a Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 13 Jul 2006 14:58:04 +0200 Subject: [PATCH] ntdll: Moved the calling of the process entry point to LdrInitializeThunk. --- dlls/kernel/process.c | 17 ----------------- dlls/ntdll/loader.c | 19 +++++++++++++++---- include/winternl.h | 2 +- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/dlls/kernel/process.c b/dlls/kernel/process.c index 389899c9f28..911cf511ca8 100644 --- a/dlls/kernel/process.c +++ b/dlls/kernel/process.c @@ -54,7 +54,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(process); WINE_DECLARE_DEBUG_CHANNEL(file); -WINE_DECLARE_DEBUG_CHANNEL(relay); typedef struct { @@ -794,23 +793,7 @@ static void start_process( void *arg ) { __TRY { - PEB *peb = NtCurrentTeb()->Peb; - IMAGE_NT_HEADERS *nt; - LPTHREAD_START_ROUTINE entry; - 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) { diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index f5022e14ffc..0ca8f2ad86a 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -2094,6 +2094,8 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3, LPCWSTR load_path; PEB *peb = NtCurrentTeb()->Peb; 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 */ @@ -2125,9 +2127,9 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3, /* Signal the parent process to continue */ SERVER_START_REQ( init_process_done ) { - req->module = peb->ImageBaseAddress; - req->entry = (char *)peb->ImageBaseAddress + nt->OptionalHeader.AddressOfEntryPoint; - req->gui = (nt->OptionalHeader.Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CUI); + req->module = peb->ImageBaseAddress; + req->entry = entry; + req->gui = (nt->OptionalHeader.Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CUI); status = wine_server_call( req ); } SERVER_END_REQ; @@ -2151,7 +2153,16 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3, RtlLeaveCriticalSection( &loader_section ); 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: ERR( "Main exe initialization for %s failed, status %lx\n", diff --git a/include/winternl.h b/include/winternl.h index 51773484fce..c8aa3ed79a8 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -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 LdrGetDllHandle(ULONG, ULONG, const UNICODE_STRING*, HMODULE*); 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*); void WINAPI LdrShutdownProcess(void); void WINAPI LdrShutdownThread(void);