Module: wine Branch: refs/heads/master Commit: 50fca716fddf5af03b4c91ae5e950daff5fbdf2a URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=50fca716fddf5af03b4c91ae...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jul 13 14:58:04 2006 +0200
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 389899c..911cf51 100644 --- a/dlls/kernel/process.c +++ b/dlls/kernel/process.c @@ -54,7 +54,6 @@ #endif
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 f5022e1..0ca8f2a 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -2094,6 +2094,8 @@ void WINAPI LdrInitializeThunk( ULONG un 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 un /* 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 un 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 5177348..c8aa3ed 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -1726,7 +1726,7 @@ NTSTATUS WINAPI LdrFindResourceDirector 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);