Alexandre Julliard : ntdll: Moved the calling of the process entry point to LdrInitializeThunk.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jul 13 10:12:24 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 50fca716fddf5af03b4c91ae5e950daff5fbdf2a
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=50fca716fddf5af03b4c91ae5e950daff5fbdf2a

Author: Alexandre Julliard <julliard at 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);




More information about the wine-cvs mailing list