Store the thread entry point in the startup info passed to the new

thread instead of the TEB.
This commit is contained in:
Alexandre Julliard 2003-11-25 03:42:05 +00:00
parent 794bf0fda0
commit 6281d82e87
4 changed files with 28 additions and 20 deletions

View File

@ -51,7 +51,7 @@ extern void thread_init(void);
/* server support */ /* server support */
extern void server_init_process(void); extern void server_init_process(void);
extern void server_init_thread( int unix_pid, int unix_tid ); extern void server_init_thread( int unix_pid, int unix_tid, void *entry_point );
extern void DECLSPEC_NORETURN server_protocol_error( const char *err, ... ); extern void DECLSPEC_NORETURN server_protocol_error( const char *err, ... );
extern void DECLSPEC_NORETURN server_protocol_perror( const char *err ); extern void DECLSPEC_NORETURN server_protocol_perror( const char *err );
extern void DECLSPEC_NORETURN server_abort_thread( int status ); extern void DECLSPEC_NORETURN server_abort_thread( int status );

View File

@ -654,7 +654,7 @@ void server_init_process(void)
* *
* Send an init thread request. Return 0 if OK. * Send an init thread request. Return 0 if OK.
*/ */
void server_init_thread( int unix_pid, int unix_tid ) void server_init_thread( int unix_pid, int unix_tid, void *entry_point )
{ {
TEB *teb = NtCurrentTeb(); TEB *teb = NtCurrentTeb();
int version, ret; int version, ret;
@ -691,7 +691,7 @@ void server_init_thread( int unix_pid, int unix_tid )
req->unix_pid = unix_pid; req->unix_pid = unix_pid;
req->unix_tid = unix_tid; req->unix_tid = unix_tid;
req->teb = teb; req->teb = teb;
req->entry = teb->entry_point; req->entry = entry_point;
req->reply_fd = reply_pipe[1]; req->reply_fd = reply_pipe[1];
req->wait_fd = teb->wait_fd[1]; req->wait_fd = teb->wait_fd[1];
ret = wine_server_call( req ); ret = wine_server_call( req );

View File

@ -37,6 +37,14 @@
WINE_DEFAULT_DEBUG_CHANNEL(thread); WINE_DEFAULT_DEBUG_CHANNEL(thread);
/* info passed to a starting thread */
struct startup_info
{
struct wine_pthread_thread_info pthread_info;
PRTL_THREAD_START_ROUTINE entry_point;
void *entry_arg;
};
static PEB peb; static PEB peb;
static PEB_LDR_DATA ldr; static PEB_LDR_DATA ldr;
static RTL_USER_PROCESS_PARAMETERS params; /* default parameters if no parent */ static RTL_USER_PROCESS_PARAMETERS params; /* default parameters if no parent */
@ -128,7 +136,7 @@ void thread_init(void)
/* setup the server connection */ /* setup the server connection */
server_init_process(); server_init_process();
server_init_thread( thread_info.pid, thread_info.tid ); server_init_thread( thread_info.pid, thread_info.tid, NULL );
/* create a memory view for the TEB */ /* create a memory view for the TEB */
NtAllocateVirtualMemory( GetCurrentProcess(), &addr, teb, &size, NtAllocateVirtualMemory( GetCurrentProcess(), &addr, teb, &size,
@ -151,7 +159,9 @@ void thread_init(void)
static void start_thread( struct wine_pthread_thread_info *info ) static void start_thread( struct wine_pthread_thread_info *info )
{ {
TEB *teb = info->teb_base; TEB *teb = info->teb_base;
LPTHREAD_START_ROUTINE func = (LPTHREAD_START_ROUTINE)teb->entry_point; struct startup_info *startup_info = (struct startup_info *)info;
PRTL_THREAD_START_ROUTINE func = startup_info->entry_point;
void *arg = startup_info->entry_arg;
struct debug_info debug_info; struct debug_info debug_info;
ULONG size; ULONG size;
@ -161,7 +171,7 @@ static void start_thread( struct wine_pthread_thread_info *info )
wine_pthread_init_thread( info ); wine_pthread_init_thread( info );
SIGNAL_Init(); SIGNAL_Init();
server_init_thread( info->pid, info->tid ); server_init_thread( info->pid, info->tid, func );
/* allocate a memory view for the stack */ /* allocate a memory view for the stack */
size = info->stack_size; size = info->stack_size;
@ -181,7 +191,7 @@ static void start_thread( struct wine_pthread_thread_info *info )
InsertHeadList( &tls_links, &teb->TlsLinks ); InsertHeadList( &tls_links, &teb->TlsLinks );
RtlReleasePebLock(); RtlReleasePebLock();
NtTerminateThread( GetCurrentThread(), func( NtCurrentTeb()->entry_arg ) ); func( arg );
} }
@ -194,7 +204,7 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR *
PRTL_THREAD_START_ROUTINE start, void *param, PRTL_THREAD_START_ROUTINE start, void *param,
HANDLE *handle_ptr, CLIENT_ID *id ) HANDLE *handle_ptr, CLIENT_ID *id )
{ {
struct wine_pthread_thread_info *info = NULL; struct startup_info *info = NULL;
HANDLE handle = 0; HANDLE handle = 0;
TEB *teb = NULL; TEB *teb = NULL;
DWORD tid = 0; DWORD tid = 0;
@ -242,14 +252,12 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR *
teb->reply_fd = -1; teb->reply_fd = -1;
teb->wait_fd[0] = -1; teb->wait_fd[0] = -1;
teb->wait_fd[1] = -1; teb->wait_fd[1] = -1;
teb->entry_point = start;
teb->entry_arg = param;
teb->htask16 = NtCurrentTeb()->htask16; teb->htask16 = NtCurrentTeb()->htask16;
NtAllocateVirtualMemory( GetCurrentProcess(), &info->teb_base, teb, &size, NtAllocateVirtualMemory( GetCurrentProcess(), &info->pthread_info.teb_base, teb, &size,
MEM_SYSTEM, PAGE_EXECUTE_READWRITE ); MEM_SYSTEM, PAGE_EXECUTE_READWRITE );
info->teb_size = size; info->pthread_info.teb_size = size;
info->teb_sel = teb->teb_sel; info->pthread_info.teb_sel = teb->teb_sel;
if (!stack_reserve || !stack_commit) if (!stack_reserve || !stack_commit)
{ {
@ -261,11 +269,13 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR *
stack_reserve = (stack_reserve + 0xffff) & ~0xffff; /* round to 64K boundary */ stack_reserve = (stack_reserve + 0xffff) & ~0xffff; /* round to 64K boundary */
if (stack_reserve < 1024 * 1024) stack_reserve = 1024 * 1024; /* Xlib needs a large stack */ if (stack_reserve < 1024 * 1024) stack_reserve = 1024 * 1024; /* Xlib needs a large stack */
info->stack_base = NULL; info->pthread_info.stack_base = NULL;
info->stack_size = stack_reserve; info->pthread_info.stack_size = stack_reserve;
info->entry = start_thread; info->pthread_info.entry = start_thread;
info->entry_point = start;
info->entry_arg = param;
if (wine_pthread_create_thread( info ) == -1) if (wine_pthread_create_thread( &info->pthread_info ) == -1)
{ {
status = STATUS_NO_MEMORY; status = STATUS_NO_MEMORY;
goto error; goto error;

View File

@ -99,9 +99,7 @@ typedef struct _TEB
DWORD unknown4[7]; /* d-n 18c Unknown */ DWORD unknown4[7]; /* d-n 18c Unknown */
void *create_data; /* d-n 1a8 Pointer to creation structure */ void *create_data; /* d-n 1a8 Pointer to creation structure */
DWORD suspend_count; /* d-n 1ac SuspendThread() counter */ DWORD suspend_count; /* d-n 1ac SuspendThread() counter */
void *entry_point; /* --3 1b0 Thread entry point (was: unknown) */ DWORD unknown5[6]; /* --n 1b0 Unknown */
void *entry_arg; /* --3 1b4 Entry point arg (was: unknown) */
DWORD unknown5[4]; /* --n 1b8 Unknown */
DWORD sys_count[4]; /* --3 1c8 Syslevel mutex entry counters */ DWORD sys_count[4]; /* --3 1c8 Syslevel mutex entry counters */
struct tagSYSLEVEL *sys_mutex[4]; /* --3 1d8 Syslevel mutex pointers */ struct tagSYSLEVEL *sys_mutex[4]; /* --3 1d8 Syslevel mutex pointers */
DWORD unknown6[5]; /* --n 1e8 Unknown */ DWORD unknown6[5]; /* --n 1e8 Unknown */