Module: wine Branch: master Commit: 93577c001372460a145460648581fab9a4f3c075 URL: https://gitlab.winehq.org/wine/wine/-/commit/93577c001372460a145460648581fab...
Author: Brendan Shanks bshanks@codeweavers.com Date: Wed Oct 19 10:45:16 2022 -0700
ntdll: Add native thread renaming for exception method.
---
dlls/ntdll/ntdll_misc.h | 2 ++ dlls/ntdll/signal_arm.c | 2 ++ dlls/ntdll/signal_arm64.c | 2 ++ dlls/ntdll/signal_i386.c | 2 ++ dlls/ntdll/signal_x86_64.c | 2 ++ dlls/ntdll/thread.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ dlls/ntdll/unix/thread.c | 10 ++++++++++ 7 files changed, 65 insertions(+)
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index d55083ae34c..973e985ff42 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -20,6 +20,7 @@ #define __WINE_NTDLL_MISC_H
#include <stdarg.h> +#include <stdlib.h> #include <sys/types.h>
#include "windef.h" @@ -61,6 +62,7 @@ extern RUNTIME_FUNCTION *lookup_function_info( ULONG_PTR pc, ULONG_PTR *base, LD /* debug helpers */ extern LPCSTR debugstr_us( const UNICODE_STRING *str ) DECLSPEC_HIDDEN; extern const char *debugstr_exception_code( DWORD code ) DECLSPEC_HIDDEN; +extern void set_native_thread_name( DWORD tid, const char *name ) DECLSPEC_HIDDEN;
/* init routines */ extern void version_init(void) DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index 0952be6ba33..37f2144e078 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -482,6 +482,8 @@ NTSTATUS WINAPI KiUserExceptionDispatcher( EXCEPTION_RECORD *rec, CONTEXT *conte else WARN_(threadname)( "Thread ID %04x renamed to %s\n", (DWORD)rec->ExceptionInformation[2], debugstr_a((char *)rec->ExceptionInformation[1]) ); + + set_native_thread_name((DWORD)rec->ExceptionInformation[2], (char *)rec->ExceptionInformation[1]); } else if (rec->ExceptionCode == DBG_PRINTEXCEPTION_C) { diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index 799e152ff4c..f644816fb1c 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -514,6 +514,8 @@ NTSTATUS WINAPI KiUserExceptionDispatcher( EXCEPTION_RECORD *rec, CONTEXT *conte else WARN_(threadname)( "Thread ID %04x renamed to %s\n", (DWORD)rec->ExceptionInformation[2], debugstr_a((char *)rec->ExceptionInformation[1]) ); + + set_native_thread_name((DWORD)rec->ExceptionInformation[2], (char *)rec->ExceptionInformation[1]); } else if (rec->ExceptionCode == DBG_PRINTEXCEPTION_C) { diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index acb3937efa8..c8e1b495ac0 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -200,6 +200,8 @@ NTSTATUS WINAPI dispatch_exception( EXCEPTION_RECORD *rec, CONTEXT *context ) else WARN_(threadname)( "Thread ID %04x renamed to %s\n", (DWORD)rec->ExceptionInformation[2], debugstr_a((char *)rec->ExceptionInformation[1]) ); + + set_native_thread_name((DWORD)rec->ExceptionInformation[2], (char *)rec->ExceptionInformation[1]); } else if (rec->ExceptionCode == DBG_PRINTEXCEPTION_C) { diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index b1ab4933b93..b6fb0a2ff1f 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -531,6 +531,8 @@ NTSTATUS WINAPI dispatch_exception( EXCEPTION_RECORD *rec, CONTEXT *context ) else WARN_(threadname)( "Thread ID %04x renamed to %s\n", (DWORD)rec->ExceptionInformation[2], debugstr_a((char *)rec->ExceptionInformation[1]) ); + + set_native_thread_name((DWORD)rec->ExceptionInformation[2], (char *)rec->ExceptionInformation[1]); } else if (rec->ExceptionCode == DBG_PRINTEXCEPTION_C) { diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index 37dc7c8ab37..c78ce038892 100644 --- a/dlls/ntdll/thread.c +++ b/dlls/ntdll/thread.c @@ -178,6 +178,51 @@ int __cdecl __wine_dbg_output( const char *str ) }
+/*********************************************************************** + * set_native_thread_name + */ +void set_native_thread_name( DWORD tid, const char *name ) +{ + THREAD_NAME_INFORMATION info; + HANDLE h = GetCurrentThread(); + WCHAR nameW[64]; + + if (tid != -1) + { + OBJECT_ATTRIBUTES attr; + CLIENT_ID cid; + + attr.Length = sizeof(attr); + attr.RootDirectory = 0; + attr.Attributes = 0; + attr.ObjectName = NULL; + attr.SecurityDescriptor = NULL; + attr.SecurityQualityOfService = NULL; + + cid.UniqueProcess = 0; + cid.UniqueThread = ULongToHandle( tid ); + + if (NtOpenThread( &h, THREAD_QUERY_LIMITED_INFORMATION, &attr, &cid )) return; + } + + if (name) + { + mbstowcs( nameW, name, ARRAY_SIZE(nameW) ); + nameW[ARRAY_SIZE(nameW) - 1] = '\0'; + } + else + { + nameW[0] = '\0'; + } + + RtlInitUnicodeString( &info.ThreadName, nameW ); + NtSetInformationThread( h, ThreadWineNativeThreadName, &info, sizeof(info) ); + + if (h != GetCurrentThread()) + NtClose(h); +} + + /*********************************************************************** * RtlExitUserThread (NTDLL.@) */ diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c index 0cf0da4ad4c..029f13dc4f9 100644 --- a/dlls/ntdll/unix/thread.c +++ b/dlls/ntdll/unix/thread.c @@ -2304,6 +2304,16 @@ NTSTATUS WINAPI NtSetInformationThread( HANDLE handle, THREADINFOCLASS class, return status; }
+ case ThreadWineNativeThreadName: + { + const THREAD_NAME_INFORMATION *info = data; + + if (length != sizeof(*info)) return STATUS_INFO_LENGTH_MISMATCH; + + set_native_thread_name( handle, &info->ThreadName ); + return STATUS_SUCCESS; + } + case ThreadWow64Context: return set_thread_wow64_context( handle, data, length );