Alexandre Julliard : ntdll: Add a helper function to set the thread id.
Alexandre Julliard
julliard at winehq.org
Mon May 17 15:45:29 CDT 2021
Module: wine
Branch: master
Commit: 711bde7cd11bfbb691e0e9b5fa2efae82a4f541c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=711bde7cd11bfbb691e0e9b5fa2efae82a4f541c
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon May 17 09:39:34 2021 +0200
ntdll: Add a helper function to set the thread id.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/unix/server.c | 38 ++++++++++----------------------------
dlls/ntdll/unix/thread.c | 30 +++++++++++++++++++++++++-----
dlls/ntdll/unix/unix_private.h | 1 +
3 files changed, 36 insertions(+), 33 deletions(-)
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c
index 9f10bb135bd..33a49adb8e8 100644
--- a/dlls/ntdll/unix/server.c
+++ b/dlls/ntdll/unix/server.c
@@ -1446,22 +1446,6 @@ static int init_thread_pipe(void)
}
-/***********************************************************************
- * init_teb64
- *
- * Initialize the 64-bit part of the TEB for WoW64 threads.
- */
-static void init_teb64( TEB *teb )
-{
-#ifndef _WIN64
- TEB64 *teb64 = (TEB64 *)((char *)teb - teb_offset);
-
- if (!is_wow64) return;
- teb64->ClientId.UniqueProcess = PtrToUlong( teb->ClientId.UniqueProcess );
- teb64->ClientId.UniqueThread = PtrToUlong( teb->ClientId.UniqueThread );
-#endif
-}
-
/***********************************************************************
* process_exit_wrapper
*
@@ -1488,6 +1472,7 @@ size_t server_init_process(void)
int ret, reply_pipe;
struct sigaction sig_act;
size_t info_size;
+ DWORD pid, tid;
server_pid = -1;
if (env_socket)
@@ -1558,8 +1543,8 @@ size_t server_init_process(void)
req->debug_level = (TRACE_ON(server) != 0);
wine_server_set_reply( req, supported_machines, sizeof(supported_machines) );
ret = wine_server_call( req );
- NtCurrentTeb()->ClientId.UniqueProcess = ULongToHandle(reply->pid);
- NtCurrentTeb()->ClientId.UniqueThread = ULongToHandle(reply->tid);
+ pid = reply->pid;
+ tid = reply->tid;
info_size = reply->info_size;
server_start_time = reply->server_start;
supported_machines_count = wine_server_reply_size( reply ) / sizeof(*supported_machines);
@@ -1578,13 +1563,11 @@ size_t server_init_process(void)
{
if (arch && !strcmp( arch, "win32" ))
fatal_error( "WINEARCH set to win32 but '%s' is a 64-bit installation.\n", config_dir );
- if (!is_win64)
- {
- is_wow64 = TRUE;
- NtCurrentTeb()->GdiBatchCount = PtrToUlong( (char *)NtCurrentTeb() - teb_offset );
- NtCurrentTeb()->WowTebOffset = -teb_offset;
- init_teb64( NtCurrentTeb() );
- }
+#ifndef _WIN64
+ is_wow64 = TRUE;
+ NtCurrentTeb()->GdiBatchCount = PtrToUlong( (char *)NtCurrentTeb() - teb_offset );
+ NtCurrentTeb()->WowTebOffset = -teb_offset;
+#endif
}
else
{
@@ -1594,6 +1577,8 @@ size_t server_init_process(void)
fatal_error( "WINEARCH set to win64 but '%s' is a 32-bit installation.\n", config_dir );
}
+ set_thread_id( NtCurrentTeb(), pid, tid );
+
for (i = 0; i < supported_machines_count; i++)
if (supported_machines[i] == current_machine) return info_size;
@@ -1675,12 +1660,9 @@ void server_init_thread( void *entry_point, BOOL *suspend )
req->wait_fd = ntdll_get_thread_data()->wait_fd[1];
wine_server_call( req );
*suspend = reply->suspend;
- NtCurrentTeb()->ClientId.UniqueProcess = ULongToHandle(reply->pid);
- NtCurrentTeb()->ClientId.UniqueThread = ULongToHandle(reply->tid);
}
SERVER_END_REQ;
close( reply_pipe );
- init_teb64( NtCurrentTeb() );
}
diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c
index 01eeb666a44..079ac16952d 100644
--- a/dlls/ntdll/unix/thread.c
+++ b/dlls/ntdll/unix/thread.c
@@ -119,6 +119,28 @@ static void start_thread( TEB *teb )
}
+/***********************************************************************
+ * set_thread_id
+ */
+void set_thread_id( TEB *teb, DWORD pid, DWORD tid )
+{
+ teb->ClientId.UniqueProcess = ULongToHandle( pid );
+ teb->ClientId.UniqueThread = ULongToHandle( tid );
+ if (teb->WowTebOffset)
+ {
+#ifdef _WIN64
+ TEB32 *teb32 = (TEB32 *)((char *)teb + teb->WowTebOffset);
+ teb32->ClientId.UniqueProcess = pid;
+ teb32->ClientId.UniqueThread = tid;
+#else
+ TEB64 *teb64 = (TEB64 *)((char *)teb + teb->WowTebOffset);
+ teb64->ClientId.UniqueProcess = pid;
+ teb64->ClientId.UniqueThread = tid;
+#endif
+ }
+}
+
+
/***********************************************************************
* update_attr_list
*
@@ -173,7 +195,6 @@ NTSTATUS WINAPI NtCreateThreadEx( HANDLE *handle, ACCESS_MASK access, OBJECT_ATT
DWORD tid = 0;
int request_pipe[2];
SIZE_T extra_stack = PTHREAD_STACK_MIN;
- CLIENT_ID client_id;
TEB *teb;
INITIAL_TEB stack;
NTSTATUS status;
@@ -200,6 +221,7 @@ NTSTATUS WINAPI NtCreateThreadEx( HANDLE *handle, ACCESS_MASK access, OBJECT_ATT
if (result.create_thread.status == STATUS_SUCCESS)
{
+ CLIENT_ID client_id;
TEB *teb = wine_server_get_ptr( result.create_thread.teb );
*handle = wine_server_ptr_handle( result.create_thread.handle );
client_id.UniqueProcess = ULongToHandle( result.create_thread.pid );
@@ -253,9 +275,7 @@ NTSTATUS WINAPI NtCreateThreadEx( HANDLE *handle, ACCESS_MASK access, OBJECT_ATT
goto done;
}
- client_id.UniqueProcess = ULongToHandle( GetCurrentProcessId() );
- client_id.UniqueThread = ULongToHandle( tid );
- teb->ClientId = client_id;
+ set_thread_id( teb, GetCurrentProcessId(), tid );
teb->Tib.StackBase = stack.StackBase;
teb->Tib.StackLimit = stack.StackLimit;
@@ -289,7 +309,7 @@ done:
close( request_pipe[1] );
return status;
}
- if (attr_list) update_attr_list( attr_list, &client_id, teb );
+ if (attr_list) update_attr_list( attr_list, &teb->ClientId, teb );
return STATUS_SUCCESS;
}
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index ce34cea7fcf..5c340107964 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -172,6 +172,7 @@ extern void server_init_process_done(void) DECLSPEC_HIDDEN;
extern void server_init_thread( void *entry_point, BOOL *suspend ) DECLSPEC_HIDDEN;
extern int server_pipe( int fd[2] ) DECLSPEC_HIDDEN;
+extern void set_thread_id( TEB *teb, DWORD pid, DWORD tid ) DECLSPEC_HIDDEN;
extern NTSTATUS context_to_server( context_t *to, const CONTEXT *from ) DECLSPEC_HIDDEN;
extern NTSTATUS context_from_server( CONTEXT *to, const context_t *from ) DECLSPEC_HIDDEN;
extern void DECLSPEC_NORETURN abort_thread( int status ) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list