Skip to content
Snippets Groups Projects
Commit 6281d82e authored by Alexandre Julliard's avatar Alexandre Julliard
Browse files

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

thread instead of the TEB.
parent 794bf0fd
No related branches found
No related tags found
No related merge requests found
......@@ -51,7 +51,7 @@ extern void thread_init(void);
/* server support */
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_perror( const char *err );
extern void DECLSPEC_NORETURN server_abort_thread( int status );
......
......@@ -654,7 +654,7 @@ void server_init_process(void)
*
* 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();
int version, ret;
......@@ -691,7 +691,7 @@ void server_init_thread( int unix_pid, int unix_tid )
req->unix_pid = unix_pid;
req->unix_tid = unix_tid;
req->teb = teb;
req->entry = teb->entry_point;
req->entry = entry_point;
req->reply_fd = reply_pipe[1];
req->wait_fd = teb->wait_fd[1];
ret = wine_server_call( req );
......
......@@ -37,6 +37,14 @@
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_LDR_DATA ldr;
static RTL_USER_PROCESS_PARAMETERS params; /* default parameters if no parent */
......@@ -128,7 +136,7 @@ void thread_init(void)
/* setup the server connection */
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 */
NtAllocateVirtualMemory( GetCurrentProcess(), &addr, teb, &size,
......@@ -151,7 +159,9 @@ void thread_init(void)
static void start_thread( struct wine_pthread_thread_info *info )
{
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;
ULONG size;
......@@ -161,7 +171,7 @@ static void start_thread( struct wine_pthread_thread_info *info )
wine_pthread_init_thread( info );
SIGNAL_Init();
server_init_thread( info->pid, info->tid );
server_init_thread( info->pid, info->tid, func );
/* allocate a memory view for the stack */
size = info->stack_size;
......@@ -181,7 +191,7 @@ static void start_thread( struct wine_pthread_thread_info *info )
InsertHeadList( &tls_links, &teb->TlsLinks );
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,
HANDLE *handle_ptr, CLIENT_ID *id )
{
struct wine_pthread_thread_info *info = NULL;
struct startup_info *info = NULL;
HANDLE handle = 0;
TEB *teb = NULL;
DWORD tid = 0;
......@@ -242,14 +252,12 @@ NTSTATUS WINAPI RtlCreateUserThread( HANDLE process, const SECURITY_DESCRIPTOR *
teb->reply_fd = -1;
teb->wait_fd[0] = -1;
teb->wait_fd[1] = -1;
teb->entry_point = start;
teb->entry_arg = param;
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 );
info->teb_size = size;
info->teb_sel = teb->teb_sel;
info->pthread_info.teb_size = size;
info->pthread_info.teb_sel = teb->teb_sel;
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 */
if (stack_reserve < 1024 * 1024) stack_reserve = 1024 * 1024; /* Xlib needs a large stack */
info->stack_base = NULL;
info->stack_size = stack_reserve;
info->entry = start_thread;
info->pthread_info.stack_base = NULL;
info->pthread_info.stack_size = stack_reserve;
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;
goto error;
......
......@@ -99,9 +99,7 @@ typedef struct _TEB
DWORD unknown4[7]; /* d-n 18c Unknown */
void *create_data; /* d-n 1a8 Pointer to creation structure */
DWORD suspend_count; /* d-n 1ac SuspendThread() counter */
void *entry_point; /* --3 1b0 Thread entry point (was: unknown) */
void *entry_arg; /* --3 1b4 Entry point arg (was: unknown) */
DWORD unknown5[4]; /* --n 1b8 Unknown */
DWORD unknown5[6]; /* --n 1b0 Unknown */
DWORD sys_count[4]; /* --3 1c8 Syslevel mutex entry counters */
struct tagSYSLEVEL *sys_mutex[4]; /* --3 1d8 Syslevel mutex pointers */
DWORD unknown6[5]; /* --n 1e8 Unknown */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment