Alexandre Julliard : ntdll: Route the process startup through the platform-specific thread startup code .
Alexandre Julliard
julliard at winehq.org
Sat Aug 29 11:35:45 CDT 2009
Module: wine
Branch: master
Commit: c9d85dd5760fb082c19577338632a05837eccdce
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c9d85dd5760fb082c19577338632a05837eccdce
Author: Alexandre Julliard <julliard at winehq.org>
Date: Sat Aug 29 11:07:17 2009 +0200
ntdll: Route the process startup through the platform-specific thread startup code.
---
dlls/kernel32/process.c | 50 +++++++++++++++++-----------------------------
dlls/ntdll/loader.c | 13 ++++++++++-
include/winternl.h | 2 +-
3 files changed, 31 insertions(+), 34 deletions(-)
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index ddc93f2..bf9bab4 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -47,7 +47,6 @@
#include "wine/winuser16.h"
#include "winternl.h"
#include "kernel_private.h"
-#include "wine/exception.h"
#include "wine/server.h"
#include "wine/unicode.h"
#include "wine/debug.h"
@@ -930,38 +929,29 @@ static void start_wineboot( HANDLE handles[2] )
*
* Startup routine of a new process. Runs on the new process stack.
*/
-static void start_process( void *arg )
+static DWORD WINAPI start_process( PEB *peb )
{
- __TRY
- {
- PEB *peb = NtCurrentTeb()->Peb;
- IMAGE_NT_HEADERS *nt;
- LPTHREAD_START_ROUTINE entry;
-
- nt = RtlImageNtHeader( peb->ImageBaseAddress );
- entry = (LPTHREAD_START_ROUTINE)((char *)peb->ImageBaseAddress +
- nt->OptionalHeader.AddressOfEntryPoint);
-
- if (!nt->OptionalHeader.AddressOfEntryPoint)
- {
- ERR( "%s doesn't have an entry point, it cannot be executed\n",
- debugstr_w(peb->ProcessParameters->ImagePathName.Buffer) );
- ExitThread( 1 );
- }
+ IMAGE_NT_HEADERS *nt;
+ LPTHREAD_START_ROUTINE entry;
- if (TRACE_ON(relay))
- DPRINTF( "%04x:Starting process %s (entryproc=%p)\n", GetCurrentThreadId(),
- debugstr_w(peb->ProcessParameters->ImagePathName.Buffer), entry );
+ nt = RtlImageNtHeader( peb->ImageBaseAddress );
+ entry = (LPTHREAD_START_ROUTINE)((char *)peb->ImageBaseAddress +
+ nt->OptionalHeader.AddressOfEntryPoint);
- SetLastError( 0 ); /* clear error code */
- if (peb->BeingDebugged) DbgBreakPoint();
- ExitThread( entry( peb ) );
- }
- __EXCEPT(UnhandledExceptionFilter)
+ if (!nt->OptionalHeader.AddressOfEntryPoint)
{
- TerminateThread( GetCurrentThread(), GetExceptionCode() );
+ ERR( "%s doesn't have an entry point, it cannot be executed\n",
+ debugstr_w(peb->ProcessParameters->ImagePathName.Buffer) );
+ ExitThread( 1 );
}
- __ENDTRY
+
+ if (TRACE_ON(relay))
+ DPRINTF( "%04x:Starting process %s (entryproc=%p)\n", GetCurrentThreadId(),
+ debugstr_w(peb->ProcessParameters->ImagePathName.Buffer), entry );
+
+ SetLastError( 0 ); /* clear error code */
+ if (peb->BeingDebugged) DbgBreakPoint();
+ return entry( peb );
}
@@ -1125,9 +1115,7 @@ void CDECL __wine_kernel_init(void)
ExitProcess( error );
}
- LdrInitializeThunk( 0, 0, 0, 0 );
- /* switch to the new stack */
- wine_switch_to_stack( start_process, NULL, NtCurrentTeb()->Tib.StackBase );
+ LdrInitializeThunk( start_process, 0, 0, 0 );
error:
ExitProcess( GetLastError() );
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index a3db3b2..df4bb01 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -2444,11 +2444,20 @@ static NTSTATUS attach_process_dlls( void *wm )
}
+/***********************************************************************
+ * start_process
+ */
+static void start_process( void *kernel_start )
+{
+ call_thread_entry_point( kernel_start, NtCurrentTeb()->Peb );
+}
+
/******************************************************************
* LdrInitializeThunk (NTDLL.@)
*
*/
-void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3, ULONG unknown4 )
+void WINAPI LdrInitializeThunk( void *kernel_start, ULONG_PTR unknown2,
+ ULONG_PTR unknown3, ULONG_PTR unknown4 )
{
NTSTATUS status;
WINE_MODREF *wm;
@@ -2489,7 +2498,7 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3,
virtual_release_address_space( nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE );
virtual_clear_thread_stack();
- return;
+ wine_switch_to_stack( start_process, kernel_start, NtCurrentTeb()->Tib.StackBase );
error:
ERR( "Main exe initialization for %s failed, status %x\n",
diff --git a/include/winternl.h b/include/winternl.h
index aca74e5..07c778c 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -1980,7 +1980,7 @@ NTSYSAPI NTSTATUS WINAPI LdrDisableThreadCalloutsForDll(HMODULE);
NTSYSAPI NTSTATUS WINAPI LdrFindEntryForAddress(const void*, PLDR_MODULE*);
NTSYSAPI NTSTATUS WINAPI LdrGetDllHandle(LPCWSTR, ULONG, const UNICODE_STRING*, HMODULE*);
NTSYSAPI NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE, const ANSI_STRING*, ULONG, void**);
-NTSYSAPI void WINAPI LdrInitializeThunk(ULONG,ULONG,ULONG,ULONG);
+NTSYSAPI void WINAPI LdrInitializeThunk(void*,ULONG_PTR,ULONG_PTR,ULONG_PTR);
NTSYSAPI NTSTATUS WINAPI LdrLoadDll(LPCWSTR, DWORD, const UNICODE_STRING*, HMODULE*);
NTSYSAPI NTSTATUS WINAPI LdrLockLoaderLock(ULONG,ULONG*,ULONG*);
IMAGE_BASE_RELOCATION * WINAPI LdrProcessRelocationBlock(void*,UINT,USHORT*,INT_PTR);
More information about the wine-cvs
mailing list