From 6f7b1f646389f850bc48abf79271037455fc91c6 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 31 Jul 2006 21:25:29 +0200 Subject: [PATCH] ntdll: Move the calling of the process entry point back to kernel32. Apparently some copy protection stuff relies on that. This reverts commit 50fca716fddf5af03b4c91ae5e950daff5fbdf2a. --- dlls/kernel/process.c | 17 +++++++++++++++++ dlls/ntdll/loader.c | 15 ++------------- include/winternl.h | 2 +- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/dlls/kernel/process.c b/dlls/kernel/process.c index a2ab351edbb..7092d2c78cf 100644 --- a/dlls/kernel/process.c +++ b/dlls/kernel/process.c @@ -60,6 +60,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(process); WINE_DECLARE_DEBUG_CHANNEL(file); +WINE_DECLARE_DEBUG_CHANNEL(relay); typedef struct { @@ -802,7 +803,23 @@ 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 d3a3d783149..184f64f241a 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -2094,8 +2094,6 @@ 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 */ @@ -2128,7 +2126,7 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3, SERVER_START_REQ( init_process_done ) { req->module = peb->ImageBaseAddress; - req->entry = entry; + req->entry = (char *)peb->ImageBaseAddress + nt->OptionalHeader.AddressOfEntryPoint; req->gui = (nt->OptionalHeader.Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CUI); status = wine_server_call( req ); } @@ -2153,16 +2151,7 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3, RtlLeaveCriticalSection( &loader_section ); if (nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE) VIRTUAL_UseLargeAddressSpace(); - - 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 ); + return; error: ERR( "Main exe initialization for %s failed, status %lx\n", diff --git a/include/winternl.h b/include/winternl.h index c8aa3ed79a8..51773484fce 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 DECLSPEC_NORETURN WINAPI LdrInitializeThunk(ULONG,ULONG,ULONG,ULONG); +void WINAPI LdrInitializeThunk(ULONG,ULONG,ULONG,ULONG); NTSTATUS WINAPI LdrLoadDll(LPCWSTR, DWORD, const UNICODE_STRING*, HMODULE*); void WINAPI LdrShutdownProcess(void); void WINAPI LdrShutdownThread(void);