1 /*
2 * PROJECT: ReactOS API tests
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Tests for the NtQueryInformationThread API
5 * COPYRIGHT: Copyright 2020 George Bișoc <george.bisoc@reactos.org>
6 */
7
8 #include "precomp.h"
9 #include <internal/ps_i.h>
10
11 static
12 void
Test_ThreadBasicInformationClass(void)13 Test_ThreadBasicInformationClass(void)
14 {
15 NTSTATUS Status;
16 PTHREAD_BASIC_INFORMATION ThreadInfoBasic;
17 ULONG ReturnedLength;
18
19 ThreadInfoBasic = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(THREAD_BASIC_INFORMATION));
20 if (!ThreadInfoBasic)
21 {
22 skip("Failed to allocate memory for THREAD_BASIC_INFORMATION!\n");
23 return;
24 }
25
26 /* Everything is NULL */
27 Status = NtQueryInformationThread(NULL,
28 ThreadBasicInformation,
29 NULL,
30 0,
31 NULL);
32 ok_hex(Status, STATUS_INFO_LENGTH_MISMATCH);
33
34 /* Don't give a valid thread handle */
35 Status = NtQueryInformationThread(NULL,
36 ThreadBasicInformation,
37 ThreadInfoBasic,
38 sizeof(THREAD_BASIC_INFORMATION),
39 NULL);
40 ok_hex(Status, STATUS_INVALID_HANDLE);
41
42 /* The information length is incorrect */
43 Status = NtQueryInformationThread(GetCurrentThread(),
44 ThreadBasicInformation,
45 ThreadInfoBasic,
46 0,
47 NULL);
48 ok_hex(Status, STATUS_INFO_LENGTH_MISMATCH);
49
50 /* Don't query anything from the function */
51 Status = NtQueryInformationThread(GetCurrentThread(),
52 ThreadBasicInformation,
53 NULL,
54 sizeof(THREAD_BASIC_INFORMATION),
55 NULL);
56 ok_hex(Status, STATUS_ACCESS_VIOLATION);
57
58 /* The buffer is misaligned and length information is wrong */
59 Status = NtQueryInformationThread(GetCurrentThread(),
60 ThreadBasicInformation,
61 (PVOID)1,
62 0,
63 NULL);
64 ok_hex(Status, STATUS_INFO_LENGTH_MISMATCH);
65
66 /* The buffer is misaligned */
67 Status = NtQueryInformationThread(GetCurrentThread(),
68 ThreadBasicInformation,
69 (PVOID)1,
70 sizeof(THREAD_BASIC_INFORMATION),
71 NULL);
72 ok_hex(Status, STATUS_DATATYPE_MISALIGNMENT);
73
74 /* The buffer is misaligned, try with an alignment size of 2 */
75 Status = NtQueryInformationThread(GetCurrentThread(),
76 ThreadBasicInformation,
77 (PVOID)2,
78 sizeof(THREAD_BASIC_INFORMATION),
79 NULL);
80 ok_hex(Status, STATUS_DATATYPE_MISALIGNMENT);
81
82 /* Query the basic information we need from the thread */
83 Status = NtQueryInformationThread(GetCurrentThread(),
84 ThreadBasicInformation,
85 ThreadInfoBasic,
86 sizeof(THREAD_BASIC_INFORMATION),
87 &ReturnedLength);
88 ok_hex(Status, STATUS_SUCCESS);
89 ok(ReturnedLength != 0, "The size of the buffer pointed by ThreadInformation shouldn't be 0!\n");
90
91 /* Output the thread basic information details */
92 trace("ReturnedLength = %lu\n", ReturnedLength);
93 trace("ThreadInfoBasic->ExitStatus = 0x%08lx\n", ThreadInfoBasic->ExitStatus);
94 trace("ThreadInfoBasic->TebBaseAddress = %p\n", ThreadInfoBasic->TebBaseAddress);
95 trace("ThreadInfoBasic->ClientId.UniqueProcess = %p\n", ThreadInfoBasic->ClientId.UniqueProcess);
96 trace("ThreadInfoBasic->ClientId.UniqueThread = %p\n", ThreadInfoBasic->ClientId.UniqueThread);
97 trace("ThreadInfoBasic->AffinityMask = %lu\n", ThreadInfoBasic->AffinityMask);
98 trace("ThreadInfoBasic->Priority = %li\n", ThreadInfoBasic->Priority);
99 trace("ThreadInfoBasic->BasePriority = %li\n", ThreadInfoBasic->BasePriority);
100
101 HeapFree(GetProcessHeap(), 0, ThreadInfoBasic);
102 }
103
104 static
105 void
Test_ThreadQueryAlignmentProbe(void)106 Test_ThreadQueryAlignmentProbe(void)
107 {
108 ULONG InfoClass;
109
110 /* Iterate over the process info classes and begin the tests */
111 for (InfoClass = 0; InfoClass < _countof(PsThreadInfoClass); InfoClass++)
112 {
113 /* The buffer is misaligned */
114 QuerySetThreadValidator(QUERY,
115 InfoClass,
116 (PVOID)(ULONG_PTR)1,
117 PsThreadInfoClass[InfoClass].RequiredSizeQUERY,
118 STATUS_DATATYPE_MISALIGNMENT);
119
120 /* We query an invalid buffer address */
121 QuerySetThreadValidator(QUERY,
122 InfoClass,
123 (PVOID)(ULONG_PTR)PsThreadInfoClass[InfoClass].AlignmentQUERY,
124 PsThreadInfoClass[InfoClass].RequiredSizeQUERY,
125 STATUS_ACCESS_VIOLATION);
126
127 /* The information length is wrong */
128 QuerySetThreadValidator(QUERY,
129 InfoClass,
130 (PVOID)(ULONG_PTR)PsThreadInfoClass[InfoClass].AlignmentQUERY,
131 PsThreadInfoClass[InfoClass].RequiredSizeQUERY - 1,
132 STATUS_INFO_LENGTH_MISMATCH);
133 }
134 }
135
START_TEST(NtQueryInformationThread)136 START_TEST(NtQueryInformationThread)
137 {
138 Test_ThreadBasicInformationClass();
139 Test_ThreadQueryAlignmentProbe();
140 }
141