[PATCH] ntdll: Avoid reading TEB in NtCreateThreadEx.
Paul Gofman
pgofman at codeweavers.com
Tue Sep 29 07:58:17 CDT 2020
I am not sure if this is acceptable either way, but wouldn't it be less
of an application specific hack if to try to handle hardware breakpoints
for the Unix part in a universal way in trap_handler()? As the DRM may
apparently want to breakpoint any other TEB or PEB location the same way
and ntdll.so is unlikely to avoid touching PEB completely.
On 9/28/20 21:59, Myah Caron wrote:
> Wine-bug: https://bugs.winehq.org/show_bug.cgi?id=49903
> Signed-off-by: Myah Caron <qsniyg at protonmail.com>
> ---
> As noted in the bug, some programs hold a breakpoint on memory reads to the TEB, and they get triggered by GetCurrentProcessId. Since this is a syscall, this wouldn't occur under Windows.
>
> dlls/ntdll/unix/thread.c | 4 +++-
> server/protocol.def | 1 +
> server/thread.c | 1 +
> 3 files changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c
> index ded4b33eb0..9f318eaa4c 100644
> --- a/dlls/ntdll/unix/thread.c
> +++ b/dlls/ntdll/unix/thread.c
> @@ -144,6 +144,7 @@ NTSTATUS WINAPI NtCreateThreadEx( HANDLE *handle, ACCESS_MASK access, OBJECT_ATT
> data_size_t len;
> struct object_attributes *objattr;
> struct ntdll_thread_data *thread_data;
> + DWORD pid = 0;
> DWORD tid = 0;
> int request_pipe[2];
> SIZE_T extra_stack = PTHREAD_STACK_MIN;
> @@ -200,6 +201,7 @@ NTSTATUS WINAPI NtCreateThreadEx( HANDLE *handle, ACCESS_MASK access, OBJECT_ATT
> if (!(status = wine_server_call( req )))
> {
> *handle = wine_server_ptr_handle( reply->handle );
> + pid = reply->pid;
> tid = reply->tid;
> }
> close( request_pipe[0] );
> @@ -223,7 +225,7 @@ NTSTATUS WINAPI NtCreateThreadEx( HANDLE *handle, ACCESS_MASK access, OBJECT_ATT
> goto done;
> }
>
> - client_id.UniqueProcess = ULongToHandle( GetCurrentProcessId() );
> + client_id.UniqueProcess = ULongToHandle( pid );
> client_id.UniqueThread = ULongToHandle( tid );
> teb->ClientId = client_id;
>
> diff --git a/server/protocol.def b/server/protocol.def
> index f538c6dcf5..fe6a44bcda 100644
> --- a/server/protocol.def
> +++ b/server/protocol.def
> @@ -832,6 +832,7 @@ struct rawinput_device
> int request_fd; /* fd for request pipe */
> VARARG(objattr,object_attributes); /* object attributes */
> @REPLY
> + process_id_t pid; /* process id */
> thread_id_t tid; /* thread id */
> obj_handle_t handle; /* thread handle (in the current process) */
> @END
> diff --git a/server/thread.c b/server/thread.c
> index eb13807973..efd6a00bc4 100644
> --- a/server/thread.c
> +++ b/server/thread.c
> @@ -1373,6 +1373,7 @@ DECL_HANDLER(new_thread)
> {
> thread->system_regs = current->system_regs;
> if (req->suspend) thread->suspend++;
> + reply->pid = get_process_id( process );
> reply->tid = get_thread_id( thread );
> if ((reply->handle = alloc_handle_no_access_check( current->process, thread,
> req->access, objattr->attributes )))
> --
> 2.28.0
>
>
>
More information about the wine-devel
mailing list