Nikolay Sivov : ntdll: Use better type for thread description info structure.

Alexandre Julliard julliard at winehq.org
Tue Dec 3 16:13:11 CST 2019


Module: wine
Branch: master
Commit: 7082ebc6081e7b94b7489a11fff9f6d28338828d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=7082ebc6081e7b94b7489a11fff9f6d28338828d

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Dec  3 12:05:21 2019 +0300

ntdll: Use better type for thread description info structure.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/thread.c | 28 ++++++++++++++--------------
 dlls/kernelbase/thread.c     | 14 ++++++--------
 dlls/ntdll/thread.c          | 12 +++++-------
 include/winternl.h           |  3 +--
 4 files changed, 26 insertions(+), 31 deletions(-)

diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c
index 8ff34ba5f3..9a8ad9151c 100644
--- a/dlls/kernel32/tests/thread.c
+++ b/dlls/kernel32/tests/thread.c
@@ -2145,14 +2145,15 @@ static void test_thread_description(void)
     ok(len == sizeof(*thread_desc), "Unexpected structure length %u.\n", len);
 
     len2 = 0;
-    thread_desc->Length = 1;
-    thread_desc->Description = (WCHAR *)thread_desc;
+    thread_desc->Description.Length = 1;
+    thread_desc->Description.MaximumLength = 0;
+    thread_desc->Description.Buffer = (WCHAR *)thread_desc;
     status = pNtQueryInformationThread(GetCurrentThread(), ThreadDescription, thread_desc, len, &len2);
     ok(!status, "Failed to get thread info, status %#x.\n", status);
     ok(len2 == sizeof(*thread_desc), "Unexpected structure length %u.\n", len);
-    ok(!thread_desc->Length, "Unexpected description length %#x.\n", thread_desc->Length);
-    ok(thread_desc->Description == (WCHAR *)(thread_desc + 1), "Unexpected description string pointer %p, %p.\n",
-            thread_desc->Description, thread_desc);
+    ok(!thread_desc->Description.Length, "Unexpected description length %#x.\n", thread_desc->Description.Length);
+    ok(thread_desc->Description.Buffer == (WCHAR *)(thread_desc + 1),
+            "Unexpected description string pointer %p, %p.\n", thread_desc->Description.Buffer, thread_desc);
 
     hr = pSetThreadDescription(GetCurrentThread(), NULL);
     ok(hr == HRESULT_FROM_NT(STATUS_SUCCESS), "Failed to set thread description, hr %#x.\n", hr);
@@ -2176,11 +2177,11 @@ static void test_thread_description(void)
     ok(!status, "Failed to get thread info.\n");
     ok(len == sizeof(*thread_desc) + desc_len, "Unexpected structure length %u.\n", len);
 
-    ok(thread_desc->Length == (desc_len << 16 | desc_len), "Unexpected description length %#x.\n",
-            thread_desc->Length);
-    ok(thread_desc->Description == (WCHAR *)(thread_desc + 1), "Unexpected description string pointer %p, %p.\n",
-            thread_desc->Description, thread_desc);
-    ok(!memcmp(thread_desc->Description, desc, desc_len), "Unexpected description string.\n");
+    ok(thread_desc->Description.Length == desc_len && thread_desc->Description.MaximumLength == desc_len,
+            "Unexpected description length %u.\n", thread_desc->Description.Length);
+    ok(thread_desc->Description.Buffer == (WCHAR *)(thread_desc + 1),
+            "Unexpected description string pointer %p, %p.\n", thread_desc->Description.Buffer, thread_desc);
+    ok(!memcmp(thread_desc->Description.Buffer, desc, desc_len), "Unexpected description string.\n");
 
     /* Partial results. */
     len = 0;
@@ -2193,7 +2194,7 @@ static void test_thread_description(void)
     ok(len == sizeof(*thread_desc) + desc_len, "Unexpected structure length %u.\n", len);
 
     /* Change description. */
-    thread_desc->Length = 8 << 16 | 8;
+    thread_desc->Description.Length = thread_desc->Description.MaximumLength = 8;
     lstrcpyW((WCHAR *)(thread_desc + 1), L"desc");
 
     status = pNtSetInformationThread(GetCurrentThread(), ThreadDescription, thread_desc, sizeof(*thread_desc));
@@ -2211,7 +2212,7 @@ static void test_thread_description(void)
     status = NtSetInformationThread(GetCurrentThread(), ThreadDescription, NULL, sizeof(*thread_desc));
     ok(status == STATUS_ACCESS_VIOLATION, "Unexpected status %#x.\n", status);
 
-    thread_desc->Description = NULL;
+    thread_desc->Description.Buffer = NULL;
     status = pNtSetInformationThread(GetCurrentThread(), ThreadDescription, thread_desc, sizeof(*thread_desc));
     ok(status == STATUS_ACCESS_VIOLATION, "Unexpected status %#x.\n", status);
 
@@ -2228,8 +2229,7 @@ static void test_thread_description(void)
     hr = pSetThreadDescription(GetCurrentThread(), L"123");
     ok(hr == HRESULT_FROM_NT(STATUS_SUCCESS), "Failed to set thread description, hr %#x.\n", hr);
 
-    thread_desc->Length = 0;
-    thread_desc->Description = NULL;
+    memset(thread_desc, 0, sizeof(*thread_desc));
     status = pNtSetInformationThread(GetCurrentThread(), ThreadDescription, thread_desc, sizeof(*thread_desc));
     ok(!status, "Failed to set thread description, status %#x.\n", status);
 
diff --git a/dlls/kernelbase/thread.c b/dlls/kernelbase/thread.c
index 521d3be079..2f0bcb7dde 100644
--- a/dlls/kernelbase/thread.c
+++ b/dlls/kernelbase/thread.c
@@ -404,8 +404,8 @@ HRESULT WINAPI DECLSPEC_HOTPATCH SetThreadDescription( HANDLE thread, PCWSTR des
     if (length > USHRT_MAX)
         return HRESULT_FROM_NT(STATUS_INVALID_PARAMETER);
 
-    info.Length = length << 16 | length;
-    info.Description = (WCHAR *)description;
+    info.Description.Length = info.Description.MaximumLength = length;
+    info.Description.Buffer = (WCHAR *)description;
 
     return HRESULT_FROM_NT(NtSetInformationThread( thread, ThreadDescription, &info, sizeof(info) ));
 }
@@ -434,15 +434,13 @@ HRESULT WINAPI DECLSPEC_HOTPATCH GetThreadDescription( HANDLE thread, WCHAR **de
     status = NtQueryInformationThread( thread, ThreadDescription, info, length, &length );
     if (!status)
     {
-        length = info->Length & 0xffff;
-
-        if (!(*description = LocalAlloc( 0, length + sizeof(WCHAR))))
+        if (!(*description = LocalAlloc( 0, info->Description.Length + sizeof(WCHAR))))
             status = STATUS_NO_MEMORY;
         else
         {
-            if (length)
-                memcpy(*description, info->Description, length);
-            (*description)[length / sizeof(WCHAR)] = 0;
+            if (info->Description.Length)
+                memcpy(*description, info->Description.Buffer, info->Description.Length);
+            (*description)[info->Description.Length / sizeof(WCHAR)] = 0;
         }
     }
 
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 6079a6c195..fd8d388403 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -1137,8 +1137,8 @@ NTSTATUS WINAPI NtQueryInformationThread( HANDLE handle, THREADINFOCLASS class,
                 status = STATUS_BUFFER_TOO_SMALL;
             else if (status == STATUS_SUCCESS)
             {
-                info->Length = desc_len << 16 | desc_len;
-                info->Description = ptr;
+                info->Description.Length = info->Description.MaximumLength = desc_len;
+                info->Description.Buffer = ptr;
             }
 
             if (ret_len && (status == STATUS_SUCCESS || status == STATUS_BUFFER_TOO_SMALL))
@@ -1303,20 +1303,18 @@ NTSTATUS WINAPI NtSetInformationThread( HANDLE handle, THREADINFOCLASS class,
     case ThreadDescription:
         {
             const THREAD_DESCRIPTION_INFORMATION *info = data;
-            data_size_t desc_len;
 
             if (length != sizeof(*info)) return STATUS_INFO_LENGTH_MISMATCH;
             if (!info) return STATUS_ACCESS_VIOLATION;
 
-            desc_len = info->Length & 0xffff;
-            if (info->Length >> 16 != desc_len) return STATUS_INVALID_PARAMETER;
-            if (info->Length && !info->Description) return STATUS_ACCESS_VIOLATION;
+            if (info->Description.Length != info->Description.MaximumLength) return STATUS_INVALID_PARAMETER;
+            if (info->Description.Length && !info->Description.Buffer) return STATUS_ACCESS_VIOLATION;
 
             SERVER_START_REQ( set_thread_info )
             {
                 req->handle = wine_server_obj_handle( handle );
                 req->mask   = SET_THREAD_INFO_DESCRIPTION;
-                wine_server_add_data( req, info->Description, desc_len );
+                wine_server_add_data( req, info->Description.Buffer, info->Description.Length );
                 status = wine_server_call( req );
             }
             SERVER_END_REQ;
diff --git a/include/winternl.h b/include/winternl.h
index ccd4a7e10b..847e55e216 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -1030,8 +1030,7 @@ typedef struct _THREAD_DESCRIPTOR_INFORMATION
 
 typedef struct _THREAD_DESCRIPTION_INFORMATION
 {
-    DWORD  Length;
-    WCHAR *Description;
+    UNICODE_STRING Description;
 } THREAD_DESCRIPTION_INFORMATION, *PTHREAD_DESCRIPTION_INFORMATION;
 
 typedef struct _KERNEL_USER_TIMES {




More information about the wine-cvs mailing list