diff --git a/dlls/kernel32/tests/thread.c b/dlls/kernel32/tests/thread.c index 8ff34ba5f36..9a8ad9151cc 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 521d3be0798..2f0bcb7ddee 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 6079a6c1955..fd8d3884039 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 ccd4a7e10b9..847e55e2162 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 {