c096fbf42932d424be7e17c009abc96610f44692
[reactos.git] / rostests / apitests / ntdll / SystemInfo.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for NtQuery/SetSystemInformation
5 * PROGRAMMERS: Timo Kreuzer
6 * Thomas Faber <thomas.faber@reactos.org>
7 */
8
9 #include <apitest.h>
10
11 #define WIN32_NO_STATUS
12 #include <ndk/exfuncs.h>
13 #include <ndk/rtlfuncs.h>
14 #include <ndk/setypes.h>
15
16 #define ntv6(x) (LOBYTE(LOWORD(GetVersion())) >= 6 ? (x) : 0)
17
18 static
19 void
20 Test_Flags(void)
21 {
22 NTSTATUS Status;
23 ULONG ReturnLength;
24 ULONG Flags;
25 ULONG Buffer[2];
26 ULONG Buffer2[2];
27 PSYSTEM_FLAGS_INFORMATION FlagsInfo = (PVOID)Buffer;
28 BOOLEAN PrivilegeEnabled;
29
30 /* Query */
31 ReturnLength = 0x55555555;
32 Status = NtQuerySystemInformation(SystemFlagsInformation, NULL, 0, &ReturnLength);
33 ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtQuerySystemInformation returned %lx\n", Status);
34 ok(ReturnLength == 0 ||
35 ntv6(ReturnLength == sizeof(SYSTEM_FLAGS_INFORMATION)), "ReturnLength = %lu\n", ReturnLength);
36
37 ReturnLength = 0x55555555;
38 Status = NtQuerySystemInformation(SystemFlagsInformation, NULL, sizeof(SYSTEM_FLAGS_INFORMATION) - 1, &ReturnLength);
39 ok(Status == STATUS_ACCESS_VIOLATION, "NtQuerySystemInformation returned %lx\n", Status);
40 ok(ReturnLength == 0x55555555, "ReturnLength = %lu\n", ReturnLength);
41
42 ReturnLength = 0x55555555;
43 Status = NtQuerySystemInformation(SystemFlagsInformation, (PVOID)2, 0, &ReturnLength);
44 ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtQuerySystemInformation returned %lx\n", Status);
45 ok(ReturnLength == 0 ||
46 ntv6(ReturnLength == sizeof(SYSTEM_FLAGS_INFORMATION)), "ReturnLength = %lu\n", ReturnLength);
47
48 ReturnLength = 0x55555555;
49 Status = NtQuerySystemInformation(SystemFlagsInformation, (PVOID)4, 0, &ReturnLength);
50 ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtQuerySystemInformation returned %lx\n", Status);
51 ok(ReturnLength == 0 ||
52 ntv6(ReturnLength == sizeof(SYSTEM_FLAGS_INFORMATION)), "ReturnLength = %lu\n", ReturnLength);
53
54 ReturnLength = 0x55555555;
55 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
56 Status = NtQuerySystemInformation(SystemFlagsInformation, (PUCHAR)FlagsInfo + 2, sizeof(SYSTEM_FLAGS_INFORMATION), &ReturnLength);
57 ok(Status == STATUS_DATATYPE_MISALIGNMENT, "NtQuerySystemInformation returned %lx\n", Status);
58 ok(ReturnLength == 0x55555555, "ReturnLength = %lu\n", ReturnLength);
59 ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
60 ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
61
62 ReturnLength = 0x55555555;
63 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
64 Status = NtQuerySystemInformation(SystemFlagsInformation, (PUCHAR)FlagsInfo + 2, sizeof(SYSTEM_FLAGS_INFORMATION) - 1, &ReturnLength);
65 ok(Status == STATUS_DATATYPE_MISALIGNMENT, "NtQuerySystemInformation returned %lx\n", Status);
66 ok(ReturnLength == 0x55555555, "ReturnLength = %lu\n", ReturnLength);
67 ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
68 ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
69
70 ReturnLength = 0x55555555;
71 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
72 Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, sizeof(SYSTEM_FLAGS_INFORMATION) - 1, &ReturnLength);
73 ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtQuerySystemInformation returned %lx\n", Status);
74 ok(ReturnLength == 0 ||
75 ntv6(ReturnLength == sizeof(SYSTEM_FLAGS_INFORMATION)), "ReturnLength = %lu\n", ReturnLength);
76 ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
77 ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
78
79 ReturnLength = 0x55555555;
80 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
81 Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, sizeof(SYSTEM_FLAGS_INFORMATION), &ReturnLength);
82 ok(Status == STATUS_SUCCESS, "NtQuerySystemInformation returned %lx\n", Status);
83 ok(ReturnLength == sizeof(SYSTEM_FLAGS_INFORMATION), "ReturnLength = %lu\n", ReturnLength);
84 ok(FlagsInfo->Flags != 0x55555555, "Flags = %lx\n", FlagsInfo->Flags);
85 ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
86 Flags = FlagsInfo->Flags;
87
88 ReturnLength = 0x55555555;
89 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
90 Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, sizeof(SYSTEM_FLAGS_INFORMATION) + 1, &ReturnLength);
91 ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtQuerySystemInformation returned %lx\n", Status);
92 ok(ReturnLength == 0 ||
93 ntv6(ReturnLength == sizeof(SYSTEM_FLAGS_INFORMATION)), "ReturnLength = %lu\n", ReturnLength);
94 ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
95 ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
96
97 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
98 Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, sizeof(SYSTEM_FLAGS_INFORMATION), NULL);
99 ok(Status == STATUS_SUCCESS, "NtQuerySystemInformation returned %lx\n", Status);
100 ok(FlagsInfo->Flags == Flags, "Flags = %lx, expected %lx\n", FlagsInfo->Flags, Flags);
101 ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
102
103 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
104 Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, sizeof(SYSTEM_FLAGS_INFORMATION), (PVOID)4);
105 ok(Status == STATUS_ACCESS_VIOLATION, "NtQuerySystemInformation returned %lx\n", Status);
106 ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
107 ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
108
109 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
110 Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, sizeof(SYSTEM_FLAGS_INFORMATION), (PVOID)2);
111 ok(Status == STATUS_ACCESS_VIOLATION, "NtQuerySystemInformation returned %lx\n", Status);
112 ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
113 ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
114
115 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
116 Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, sizeof(SYSTEM_FLAGS_INFORMATION), (PVOID)1);
117 ok(Status == STATUS_ACCESS_VIOLATION, "NtQuerySystemInformation returned %lx\n", Status);
118 ok(Buffer[0] == 0x55555555, "Buffer[0] = %lx\n", Buffer[0]);
119 ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
120
121 RtlFillMemory(Buffer2, sizeof(Buffer2), 0x55);
122 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
123 Status = NtQuerySystemInformation(SystemFlagsInformation, FlagsInfo, sizeof(SYSTEM_FLAGS_INFORMATION), (PULONG)((PUCHAR)Buffer2 + 1));
124 ok(Status == STATUS_SUCCESS, "NtQuerySystemInformation returned %lx\n", Status);
125 ok(FlagsInfo->Flags == Flags, "Flags = %lx, expected %lx\n", FlagsInfo->Flags, Flags);
126 ok(Buffer[1] == 0x55555555, "Buffer[1] = %lx\n", Buffer[1]);
127 ok(Buffer2[0] == 0x00000455, "Buffer2[0] = %lx\n", Buffer2[0]);
128 ok(Buffer2[1] == 0x55555500, "Buffer2[1] = %lx\n", Buffer2[1]);
129
130 /* Set */
131 Status = NtSetSystemInformation(SystemFlagsInformation, NULL, 0);
132 ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtSetSystemInformation returned %lx\n", Status);
133
134 Status = NtSetSystemInformation(SystemFlagsInformation, NULL, sizeof(SYSTEM_FLAGS_INFORMATION) - 1);
135 ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtSetSystemInformation returned %lx\n", Status);
136
137 Status = NtSetSystemInformation(SystemFlagsInformation, NULL, sizeof(SYSTEM_FLAGS_INFORMATION));
138 ok(Status == STATUS_ACCESS_DENIED, "NtSetSystemInformation returned %lx\n", Status);
139
140 Status = NtSetSystemInformation(SystemFlagsInformation, (PVOID)2, sizeof(SYSTEM_FLAGS_INFORMATION));
141 ok(Status == STATUS_DATATYPE_MISALIGNMENT, "NtSetSystemInformation returned %lx\n", Status);
142
143 Status = RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, FALSE, &PrivilegeEnabled);
144 if (!NT_SUCCESS(Status))
145 {
146 skip("Cannot acquire SeDebugPrivilege\n");
147 return;
148 }
149
150 Status = NtSetSystemInformation(SystemFlagsInformation, NULL, sizeof(SYSTEM_FLAGS_INFORMATION));
151 ok(Status == STATUS_ACCESS_VIOLATION, "NtSetSystemInformation returned %lx\n", Status);
152
153 Status = NtSetSystemInformation(SystemFlagsInformation, (PVOID)2, sizeof(SYSTEM_FLAGS_INFORMATION));
154 ok(Status == STATUS_DATATYPE_MISALIGNMENT, "NtSetSystemInformation returned %lx\n", Status);
155
156 Status = NtSetSystemInformation(SystemFlagsInformation, (PVOID)4, sizeof(SYSTEM_FLAGS_INFORMATION));
157 ok(Status == STATUS_ACCESS_VIOLATION, "NtSetSystemInformation returned %lx\n", Status);
158
159 FlagsInfo->Flags = Flags;
160 Status = NtSetSystemInformation(SystemFlagsInformation, (PUCHAR)FlagsInfo + 2, sizeof(SYSTEM_FLAGS_INFORMATION));
161 ok(Status == STATUS_DATATYPE_MISALIGNMENT, "NtSetSystemInformation returned %lx\n", Status);
162
163 Status = NtSetSystemInformation(SystemFlagsInformation, (PUCHAR)FlagsInfo + 2, sizeof(SYSTEM_FLAGS_INFORMATION) - 1);
164 ok(Status == STATUS_DATATYPE_MISALIGNMENT, "NtSetSystemInformation returned %lx\n", Status);
165
166 Status = NtSetSystemInformation(SystemFlagsInformation, FlagsInfo, sizeof(SYSTEM_FLAGS_INFORMATION) - 1);
167 ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtSetSystemInformation returned %lx\n", Status);
168
169 Status = NtSetSystemInformation(SystemFlagsInformation, FlagsInfo, sizeof(SYSTEM_FLAGS_INFORMATION) + 1);
170 ok(Status == STATUS_INFO_LENGTH_MISMATCH, "NtSetSystemInformation returned %lx\n", Status);
171
172 Status = NtSetSystemInformation(SystemFlagsInformation, FlagsInfo, sizeof(SYSTEM_FLAGS_INFORMATION));
173 ok(Status == STATUS_SUCCESS, "NtSetSystemInformation returned %lx\n", Status);
174
175 ok(FlagsInfo->Flags == Flags, "Flags = %lx, expected %lu\n", FlagsInfo->Flags, Flags);
176
177 Status = RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, PrivilegeEnabled, FALSE, &PrivilegeEnabled);
178 ok(Status == STATUS_SUCCESS, "RtlAdjustPrivilege returned %lx\n", Status);
179 }
180
181 static
182 void
183 Test_TimeAdjustment(void)
184 {
185 SYSTEM_QUERY_TIME_ADJUST_INFORMATION TimeInfoOrg, GetTimeInfo;
186 SYSTEM_SET_TIME_ADJUST_INFORMATION SetTimeInfo;
187 NTSTATUS Status;
188 ULONG ReturnLength;
189 BOOLEAN PrivilegeEnabled;
190
191 SetTimeInfo.TimeAdjustment = 0;
192 SetTimeInfo.Enable = 0;
193
194 /* Query original values */
195 Status = NtQuerySystemInformation(SystemTimeAdjustmentInformation,
196 &TimeInfoOrg,
197 sizeof(TimeInfoOrg),
198 &ReturnLength);
199
200 /* Test without privilege */
201 Status = NtSetSystemInformation(SystemTimeAdjustmentInformation,
202 &SetTimeInfo,
203 sizeof(SetTimeInfo));
204 ok_ntstatus(Status, STATUS_PRIVILEGE_NOT_HELD);
205
206 /* Get the required privilege */
207 Status = RtlAdjustPrivilege(SE_SYSTEMTIME_PRIVILEGE, TRUE, FALSE, &PrivilegeEnabled);
208 if (!NT_SUCCESS(Status))
209 {
210 skip("Cannot acquire SeSystemTimePrivilege\n");
211 return;
212 }
213
214 /* Test wrong length */
215 Status = NtSetSystemInformation(SystemTimeAdjustmentInformation,
216 &SetTimeInfo,
217 sizeof(SetTimeInfo) + 1);
218 ok_ntstatus(Status, STATUS_INFO_LENGTH_MISMATCH);
219
220 /* Test both members 0 */
221 Status = NtSetSystemInformation(SystemTimeAdjustmentInformation,
222 &SetTimeInfo,
223 sizeof(SetTimeInfo));
224 ok_ntstatus(Status, STATUS_INVALID_PARAMETER_2);
225
226 /* Set huge value */
227 SetTimeInfo.TimeAdjustment = -1;
228 SetTimeInfo.Enable = 0;
229 Status = NtSetSystemInformation(SystemTimeAdjustmentInformation,
230 &SetTimeInfo,
231 sizeof(SetTimeInfo));
232 ok_ntstatus(Status, STATUS_SUCCESS);
233
234 /* Query the result */
235 Status = NtQuerySystemInformation(SystemTimeAdjustmentInformation,
236 &GetTimeInfo,
237 sizeof(GetTimeInfo),
238 &ReturnLength);
239 ok_ntstatus(Status, STATUS_SUCCESS);
240 ok_long(GetTimeInfo.TimeAdjustment, -1);
241 ok_long(GetTimeInfo.Enable, 0);
242
243 /* set Enable to 1 */
244 SetTimeInfo.TimeAdjustment = -1;
245 SetTimeInfo.Enable = 1;
246 Status = NtSetSystemInformation(SystemTimeAdjustmentInformation,
247 &SetTimeInfo,
248 sizeof(SetTimeInfo));
249 ok_ntstatus(Status, STATUS_SUCCESS);
250
251 /* Query the result */
252 Status = NtQuerySystemInformation(SystemTimeAdjustmentInformation,
253 &GetTimeInfo,
254 sizeof(GetTimeInfo),
255 &ReturnLength);
256 ok_ntstatus(Status, STATUS_SUCCESS);
257 ok_long(GetTimeInfo.TimeAdjustment, GetTimeInfo.TimeIncrement);
258 ok_long(GetTimeInfo.Enable, 1);
259
260 /* Restore original values */
261 SetTimeInfo.TimeAdjustment = TimeInfoOrg.TimeAdjustment;
262 SetTimeInfo.Enable = TimeInfoOrg.Enable;;
263 Status = NtSetSystemInformation(SystemTimeAdjustmentInformation,
264 &SetTimeInfo,
265 sizeof(SetTimeInfo));
266 ok_ntstatus(Status, STATUS_SUCCESS);
267
268 Status = RtlAdjustPrivilege(SE_SYSTEMTIME_PRIVILEGE, PrivilegeEnabled, FALSE, &PrivilegeEnabled);
269 ok(Status == STATUS_SUCCESS, "RtlAdjustPrivilege returned %lx\n", Status);
270 }
271
272 START_TEST(NtSystemInformation)
273 {
274 Test_Flags();
275 Test_TimeAdjustment();
276 }