Store the thread entry point in the startup info passed to the new
thread instead of the TEB.
This commit is contained in:
parent
794bf0fda0
commit
6281d82e87
|
@ -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 );
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue