1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * PURPOSE:         Test for NtUserSystemParametersInfo
5  * PROGRAMMERS:
6  */
7 
8 #include <win32nt.h>
9 
10 #include <winreg.h>
11 
12 static const WCHAR* KEY_MOUSE = L"Control Panel\\Mouse";
13 //static const WCHAR* VAL_MOUSE1 = L"MouseThreshold1";
14 //static const WCHAR* VAL_MOUSE2 = L"MouseThreshold2";
15 //static const WCHAR* VAL_MOUSE3 = L"MouseSpeed";
16 //static const WCHAR* VAL_DBLCLKWIDTH = L"DoubleClickWidth";
17 //static const WCHAR* VAL_DBLCLKHEIGHT = L"DoubleClickHeight";
18 //static const WCHAR* VAL_DBLCLKTIME = L"DoubleClickSpeed";
19 static const WCHAR* VAL_SWAP = L"SwapMouseButtons";
20 
21 static const WCHAR* KEY_DESKTOP = L"Control Panel\\Desktop";
22 //static const WCHAR* VAL_SCRTO = L"ScreenSaveTimeOut";
23 //static const WCHAR* VAL_SCRACT = L"ScreenSaveActive";
24 //static const WCHAR* VAL_GRID = L"GridGranularity";
25 //static const WCHAR* VAL_DRAG = L"DragFullWindows";
26 //static const WCHAR* VAL_DRAGHEIGHT = L"DragHeight";
27 //static const WCHAR* VAL_DRAGWIDTH = L"DragWidth";
28 //static const WCHAR* VAL_FNTSMOOTH = L"FontSmoothing";
29 static const WCHAR* VAL_PREFMASK = L"UserPreferencesMask";
30 
31 enum
32 {
33     UPM_ACTIVEWINDOWTRACKING = 0x01,
34     UPM_MENUANIMATION = 0x02,
35     UPM_COMBOBOXANIMATION = 0x04,
36     UPM_LISTBOXSMOOTHSCROLLING = 0x08,
37     UPM_GRADIENTCAPTIONS = 0x10,
38     UPM_KEYBOARDCUES = 0x20,
39     UPM_ACTIVEWNDTRKZORDER = 0x40,
40     UPM_HOTTRACKING = 0x80,
41     UPM_RESERVED = 0x100,
42     UPM_MENUFADE = 0x200,
43     UPM_SELECTIONFADE = 0x400,
44     UPM_TOOLTIPANIMATION = 0x800,
45     UPM_TOOLTIPFADE = 0x1000,
46     UPM_CURSORSHADOW = 0x2000,
47     UPM_CLICKLOCK = 0x8000,
48     // room for more
49     UPM_UIEFFECTS = 0x80000000,
50     UPM_DEFAULT = 0x80003E9E
51 } USERPREFMASKS;
52 
53 
54 //static const WCHAR* KEY_MDALIGN = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows";
55 //static const WCHAR* VAL_MDALIGN = L"MenuDropAlignment";
56 
57 static const WCHAR* KEY_METRIC = L"Control Panel\\Desktop\\WindowMetrics";
58 //static const WCHAR* VAL_BORDER = L"BorderWidth";
59 //static const WCHAR* VAL_ICONSPC = L"IconSpacing";
60 //static const WCHAR* VAL_ICONVSPC = L"IconVerticalspacing";
61 //static const WCHAR* VAL_ITWRAP = L"IconTitleWrap";
62 
63 static const WCHAR* KEY_SOUND = L"Control Panel\\Sound";
64 static const WCHAR* VAL_BEEP = L"Beep";
65 
66 //static const WCHAR* KEY_KBD = L"Control Panel\\Keyboard";
67 //static const WCHAR* VAL_KBDSPD = L"KeyboardSpeed";
68 //static const WCHAR* VAL_KBDDELAY = L"KeyboardDelay";
69 
70 //static const WCHAR* KEY_SHOWSNDS = L"Control Panel\\Accessibility\\ShowSounds";
71 //static const WCHAR* KEY_KDBPREF = L"Control Panel\\Accessibility\\Keyboard Preference";
72 //static const WCHAR* KEY_SCRREAD = L"Control Panel\\Accessibility\\Blind Access";
73 //static const WCHAR* VAL_ON = L"On";
74 
75 LONG
76 QueryUserRegValueW(PCWSTR pszSubKey, PCWSTR pszValueName, PVOID pData, LPDWORD cbSize, LPDWORD pType)
77 {
78 	HKEY hKey;
79 	LONG ret;
80 
81 	RegOpenKeyExW(HKEY_CURRENT_USER, pszSubKey, 0, KEY_QUERY_VALUE, &hKey);
82 	ret = RegQueryValueExW(hKey, pszValueName, NULL, pType, (LPBYTE)pData, cbSize);
83 	RegCloseKey(hKey);
84 	return ret;
85 }
86 
87 
88 HWND
89 CreateTestWindow()
90 {
91     HINSTANCE hinst = GetModuleHandle(NULL);
92 	WNDCLASSA wc;
93 
94 	wc.style = 0;
95 	wc.lpfnWndProc = DefWindowProcA;
96 	wc.cbClsExtra = 0;
97 	wc.cbWndExtra = 0;
98 	wc.hInstance = hinst;
99 	wc.hIcon = NULL;
100 	wc.hCursor = NULL;
101 	wc.hbrBackground = NULL;
102 	wc.lpszMenuName = NULL;
103 	wc.lpszClassName = "testclass";
104 
105 	RegisterClassA(&wc);
106 	return CreateWindowA("testclass",
107 	                     "testwnd",
108 	                     WS_VISIBLE,
109 	                     0,
110 	                     0,
111 	                     50,
112 	                     30,
113 	                     NULL,
114 	                     NULL,
115 	                     hinst,
116 	                     0);
117 }
118 
119 void
120 Test_NtUserSystemParametersInfo_Params(void)
121 {
122 //	UINT uint;
123 	DWORD data[1000];
124 	UINT i, uint;
125 	ACCESSTIMEOUT ato;
126 	/* Test normal */
127 	SetLastError(ERROR_SUCCESS);
128 	TEST(NtUserSystemParametersInfo(SPI_GETFOCUSBORDERHEIGHT, 0, &uint, 0) == TRUE);
129 	TEST(GetLastError() == ERROR_SUCCESS);
130 
131 	/* Test invalid SPI code */
132 	SetLastError(ERROR_SUCCESS);
133 	TEST(NtUserSystemParametersInfo(7, 0, &data, 0) == FALSE);
134 	TEST(GetLastError() == ERROR_INVALID_PARAMETER);
135 
136 	/* Test wrong cbSize member */
137 	ato.cbSize = 1;
138 	SetLastError(0xdeadbeef);
139 	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 0, &ato, 0) == FALSE);
140 	TEST(GetLastError() == 0xdeadbeef);
141 #if 0
142 	/* Test undocumented, but valid SPI codes */
143 	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
144 	SetLastError(ERROR_SUCCESS);
145 	TEST(NtUserSystemParametersInfo(0x1010, 0, &data, 0) == TRUE);
146 	TEST(GetLastError() == ERROR_SUCCESS);
147 	TEST(data[0] <= 1);
148 	TEST(data[1] == 0xdeadbeef);
149 
150 	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
151 	SetLastError(ERROR_SUCCESS);
152 	TEST(NtUserSystemParametersInfo(0x1011, 0, &data, 0) == TRUE);
153 	TEST(GetLastError() == ERROR_SUCCESS);
154 	TEST(data[0] == 0xbeefdead);
155 	TEST(data[1] == 0xbeefdead);
156 	data[0] = 0;
157 	NtUserSystemParametersInfo(0x1010, 0, &data, 0);
158 	TEST(data[0] == 1);
159 
160 	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
161 	SetLastError(ERROR_SUCCESS);
162 	TEST(NtUserSystemParametersInfo(0x1028, 0, &data, 0) == TRUE);
163 	TEST(GetLastError() == ERROR_SUCCESS);
164 	TEST(data[0] != 0xdeadbeef);
165 	TEST(data[1] == 0xdeadbeef);
166 
167 	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
168 	SetLastError(ERROR_SUCCESS);
169 	TEST(NtUserSystemParametersInfo(0x1029, 0, &data, 0) == TRUE);
170 	TEST(GetLastError() == ERROR_SUCCESS);
171 	TEST(data[0] == 0xbeefdead);
172 	TEST(data[1] == 0xbeefdead);
173 
174 	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
175 	SetLastError(ERROR_SUCCESS);
176 	TEST(NtUserSystemParametersInfo(0x102A, 0, &data, 0) == TRUE);
177 	TEST(GetLastError() == ERROR_SUCCESS);
178 	TEST(data[0] != 0xdeadbeef);
179 	TEST(data[1] == 0xdeadbeef);
180 
181 	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
182 	SetLastError(ERROR_SUCCESS);
183 	TEST(NtUserSystemParametersInfo(4139, 0, &data, 0) == TRUE);
184 	TEST(GetLastError() == ERROR_SUCCESS);
185 	TEST(data[0] == 0xbeefdead);
186 	TEST(data[1] == 0xbeefdead);
187 
188 	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
189 	SetLastError(ERROR_SUCCESS);
190 	TEST(NtUserSystemParametersInfo(4140, 0, &data, 0) == TRUE);
191 	TEST(GetLastError() == ERROR_SUCCESS);
192 	TEST(data[0] != 0xdeadbeef);
193 	TEST(data[1] == 0xdeadbeef);
194 
195 	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
196 	SetLastError(ERROR_SUCCESS);
197 	TEST(NtUserSystemParametersInfo(4141, 0, &data, 0) == TRUE);
198 	TEST(GetLastError() == ERROR_SUCCESS);
199 	TEST(data[0] == 0xbeefdead);
200 	TEST(data[1] == 0xbeefdead);
201 
202 	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
203 	SetLastError(ERROR_SUCCESS);
204 	TEST(NtUserSystemParametersInfo(4142, 0, &data, 0) == TRUE);
205 	TEST(GetLastError() == ERROR_SUCCESS);
206 	TEST(data[0] != 0xdeadbeef);
207 	TEST(data[1] == 0xdeadbeef);
208 
209 	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
210 	SetLastError(ERROR_SUCCESS);
211 	TEST(NtUserSystemParametersInfo(4143, 0, &data, 0) == TRUE);
212 	TEST(GetLastError() == ERROR_SUCCESS);
213 	TEST(data[0] == 0xbeefdead);
214 	TEST(data[1] == 0xbeefdead);
215 
216 	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
217 	SetLastError(ERROR_SUCCESS);
218 	TEST(NtUserSystemParametersInfo(4144, 0, &data, 0) == TRUE);
219 	TEST(GetLastError() == ERROR_SUCCESS);
220 	TEST(data[0] != 0xdeadbeef);
221 	TEST(data[1] == 0xdeadbeef);
222 
223 	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
224 	SetLastError(ERROR_SUCCESS);
225 	TEST(NtUserSystemParametersInfo(4145, 0, &data, 0) == TRUE);
226 	TEST(GetLastError() == ERROR_SUCCESS);
227 	TEST(data[0] == 0xbeefdead);
228 	TEST(data[1] == 0xbeefdead);
229 
230 	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
231 	SetLastError(ERROR_SUCCESS);
232 	TEST(NtUserSystemParametersInfo(4146, 0, &data, 0) == TRUE);
233 	TEST(GetLastError() == ERROR_SUCCESS);
234 	TEST(data[0] != 0xdeadbeef);
235 	TEST(data[1] == 0xdeadbeef);
236 
237 	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
238 	SetLastError(ERROR_SUCCESS);
239 	TEST(NtUserSystemParametersInfo(4147, 0, &data, 0) == TRUE);
240 	TEST(GetLastError() == ERROR_SUCCESS);
241 	TEST(data[0] == 0xbeefdead);
242 	TEST(data[1] == 0xbeefdead);
243 
244 	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
245 	SetLastError(ERROR_SUCCESS);
246 	TEST(NtUserSystemParametersInfo(4148, 0, &data, 0) == TRUE);
247 	TEST(GetLastError() == ERROR_SUCCESS);
248 	TEST(data[0] != 0xdeadbeef);
249 	TEST(data[1] == 0xdeadbeef);
250 
251 	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
252 	SetLastError(ERROR_SUCCESS);
253 	TEST(NtUserSystemParametersInfo(4149, 0, &data, 0) == TRUE);
254 	TEST(GetLastError() == ERROR_SUCCESS);
255 	TEST(data[0] == 0xbeefdead);
256 	TEST(data[1] == 0xbeefdead);
257 
258 	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
259 	SetLastError(ERROR_SUCCESS);
260 	TEST(NtUserSystemParametersInfo(4150, 0, &data, 0) == TRUE);
261 	TEST(GetLastError() == ERROR_SUCCESS);
262 	TEST(data[0] != 0xdeadbeef);
263 	TEST(data[1] == 0xdeadbeef);
264 
265 	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
266 	SetLastError(ERROR_SUCCESS);
267 	TEST(NtUserSystemParametersInfo(4151, 0, &data, 0) == TRUE);
268 	TEST(GetLastError() == ERROR_SUCCESS);
269 	TEST(data[0] == 0xbeefdead);
270 	TEST(data[1] == 0xbeefdead);
271 
272 	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
273 	SetLastError(ERROR_SUCCESS);
274 	TEST(NtUserSystemParametersInfo(4152, 0, &data, 0) == TRUE);
275 	TEST(GetLastError() == ERROR_SUCCESS);
276 	TEST(data[0] != 0xdeadbeef);
277 	TEST(data[1] == 0xdeadbeef);
278 
279 	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
280 	SetLastError(ERROR_SUCCESS);
281 	TEST(NtUserSystemParametersInfo(4153, 0, &data, 0) == TRUE);
282 	TEST(GetLastError() == ERROR_SUCCESS);
283 	TEST(data[0] == 0xbeefdead);
284 	TEST(data[1] == 0xbeefdead);
285 
286 	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
287 	SetLastError(ERROR_SUCCESS);
288 	TEST(NtUserSystemParametersInfo(4154, 0, &data, 0) == TRUE);
289 	TEST(GetLastError() == ERROR_SUCCESS);
290 	TEST(data[0] != 0xdeadbeef);
291 	TEST(data[1] == 0xdeadbeef);
292 
293 	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
294 	SetLastError(ERROR_SUCCESS);
295 	TEST(NtUserSystemParametersInfo(4155, 0, &data, 0) == TRUE);
296 	TEST(GetLastError() == ERROR_SUCCESS);
297 	TEST(data[0] == 0xbeefdead);
298 	TEST(data[1] == 0xbeefdead);
299 
300 	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
301 	SetLastError(ERROR_SUCCESS);
302 	TEST(NtUserSystemParametersInfo(4156, 0, &data, 0) == TRUE);
303 	TEST(GetLastError() == ERROR_SUCCESS);
304 	TEST(data[0] != 0xdeadbeef);
305 	TEST(data[1] == 0xdeadbeef);
306 
307 	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
308 	SetLastError(ERROR_SUCCESS);
309 	TEST(NtUserSystemParametersInfo(4157, 0, &data, 0) == TRUE);
310 	TEST(GetLastError() == ERROR_SUCCESS);
311 	TEST(data[0] == 0xbeefdead);
312 	TEST(data[1] == 0xbeefdead);
313 #endif
314 	/* Test invalid pointer */
315 	SetLastError(ERROR_SUCCESS);
316 	TEST(NtUserSystemParametersInfo(SPI_GETFOCUSBORDERHEIGHT, 0, (PVOID)0x80000000, 0) == FALSE);
317 	TEST(GetLastError() == ERROR_NOACCESS);
318 	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
319 
320 	/* test wrong bools */
321 }
322 
323 void
324 Test_NtUserSystemParametersInfo_Winsta(void)
325 {
326     HWINSTA hwinsta, hwinstaOld;
327     INT ai[20];
328     BOOL bRet;
329 //    INT i;
330 
331     hwinstaOld = GetProcessWindowStation();
332     hwinsta = CreateWindowStation(NULL, 0, READ_CONTROL, NULL);
333     SetProcessWindowStation(hwinsta);
334     printf("hwinstaOld=%p, hwinsta=%p\n", hwinstaOld, hwinsta);
335 
336 #if 1 // currently Winsta stuff is broken in ros
337     TEST(SystemParametersInfoA(SPI_GETBEEP, 0, ai, 0) == 0);
338     TEST(GetLastError() == ERROR_ACCESS_DENIED);
339     TEST(SystemParametersInfoA(SPI_SETBEEP, 0, ai, 0) == 0);
340     TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
341     TEST(SystemParametersInfoA(SPI_GETMOUSE, 0, ai, 0) == 0);
342     TEST(GetLastError() == ERROR_ACCESS_DENIED);
343     TEST(SystemParametersInfoA(SPI_SETMOUSE, 0, ai, 0) == 0);
344     TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
345     TEST(SystemParametersInfoA(SPI_GETBORDER, 0, ai, 0) == 0);
346     TEST(GetLastError() == ERROR_ACCESS_DENIED);
347     TEST(SystemParametersInfoA(SPI_SETBORDER, 0, ai, 0) == 0);
348     TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
349     TEST(SystemParametersInfoA(SPI_GETKEYBOARDSPEED, 0, ai, 0) == 0);
350     TEST(GetLastError() == ERROR_ACCESS_DENIED);
351     TEST(SystemParametersInfoA(SPI_SETKEYBOARDSPEED, 0, ai, 0) == 0);
352     TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
353     TEST(SystemParametersInfoA(SPI_ICONHORIZONTALSPACING, 0, ai, 0) == 0);
354     TEST(GetLastError() == ERROR_ACCESS_DENIED);
355     TEST(SystemParametersInfoA(SPI_ICONHORIZONTALSPACING, 32, 0, 0) == 0);
356     TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
357     TEST(SystemParametersInfoA(SPI_GETSCREENSAVETIMEOUT, 0, ai, 0) == 0);
358     TEST(GetLastError() == ERROR_ACCESS_DENIED);
359     TEST(SystemParametersInfoA(SPI_SETSCREENSAVETIMEOUT, 0, ai, 0) == 0);
360     TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
361     TEST(SystemParametersInfoA(SPI_GETKEYBOARDCUES, 0, &bRet, 0) == 0);
362     TEST(GetLastError() == ERROR_ACCESS_DENIED);
363     TEST(SystemParametersInfoA(SPI_SETKEYBOARDCUES, 0, (PVOID)1, 0) == 0);
364     TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
365 #endif
366 
367     SetProcessWindowStation(hwinstaOld);
368 }
369 
370 void
371 Test_NtUserSystemParametersInfo_fWinIni(void)
372 {
373 	ACCESSTIMEOUT ato;
374 //	UINT uFocusBorderHeight;
375 	WCHAR Buffer[6];
376 	DWORD cbSize;
377 
378 	ato.cbSize = sizeof(ato);
379 	NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 0, &ato, 0);
380 	ato.iTimeOutMSec++;
381 	NtUserSystemParametersInfo(SPI_SETACCESSTIMEOUT, 0, &ato, 0);
382 	ato.iTimeOutMSec--;
383 
384 //	NtUserSystemParametersInfo(SPI_GETFOCUSBORDERHEIGHT, 0, &uFocusBorderHeight, 0);
385 //	NtUserSystemParametersInfo(SPI_SETFOCUSBORDERHEIGHT, 0, &uFocusBorderHeight, SPIF_UPDATEINIFILE);
386 
387 	NtUserSystemParametersInfo(SPI_SETACCESSTIMEOUT, 0, &ato, 0);
388 
389 	cbSize = 6;
390 	QueryUserRegValueW(L"Control Panel\\Accessibility\\TimeOut", L"TimeToWait", &Buffer, &cbSize, NULL);
391 
392 }
393 
394 void
395 Test_MetricKey(PCWSTR pwszVal, INT iVal)
396 {
397 	WCHAR szReg[10];
398 	DWORD cbSize;
399 
400 	cbSize = sizeof(szReg);
401 	TESTX(QueryUserRegValueW(KEY_METRIC, pwszVal, &szReg, &cbSize, NULL) == ERROR_SUCCESS, "Value=%S\n", pwszVal);
402 	TESTX(_wcsicmp(szReg, L"1") == 0, "Value=%S\n", pwszVal);
403 
404 }
405 
406 void
407 Test_UserPref(UINT uiGet, UINT uiSet, DWORD dwPrefMask)
408 {
409 	BOOL bOrig, bTemp = 0;
410 	DWORD dwUserPref, dwUserPrefOrg;
411 	DWORD cbSize;
412 
413 	/* Get original values */
414 	NtUserSystemParametersInfo(uiGet, 0, &bOrig, 0);
415 	cbSize = sizeof(dwUserPrefOrg);
416 	QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPrefOrg, &cbSize, NULL);
417 
418 	/* Value 0 */
419 	NtUserSystemParametersInfo(uiSet, 0, NULL, SPIF_UPDATEINIFILE);
420 	NtUserSystemParametersInfo(uiGet, 0, &bTemp, 0);
421 	TEST(bTemp == 0);
422 	cbSize = sizeof(dwUserPref);
423 	TEST(QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPref, &cbSize, NULL) == ERROR_SUCCESS);
424 	TEST((dwUserPref & dwPrefMask) == 0);
425 	TEST((dwUserPref & (~dwPrefMask)) == (dwUserPrefOrg & (~dwPrefMask)));
426 
427 	/* Value 1 without Registry */
428 	NtUserSystemParametersInfo(uiSet, 0, (PVOID)1, 0);
429 	NtUserSystemParametersInfo(uiGet, 0, &bTemp, 0);
430 	TEST(bTemp == 1);
431 	cbSize = sizeof(dwUserPref);
432 	TEST(QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPref, &cbSize, NULL) == ERROR_SUCCESS);
433 	TEST((dwUserPref & dwPrefMask) == 0);
434 	TEST((dwUserPref & (~dwPrefMask)) == (dwUserPrefOrg & (~dwPrefMask)));
435 
436 	/* Value 2 without Registry */
437 	NtUserSystemParametersInfo(uiSet, 0, (PVOID)2, 0);
438 	NtUserSystemParametersInfo(uiGet, 0, &bTemp, 0);
439 	TEST(bTemp == 1);
440 	cbSize = sizeof(dwUserPref);
441 	TEST(QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPref, &cbSize, NULL) == ERROR_SUCCESS);
442 	TEST((dwUserPref & dwPrefMask) == 0);
443 	TEST((dwUserPref & (~dwPrefMask)) == (dwUserPrefOrg & (~dwPrefMask)));
444 
445 	/* Value 1 with Registry */
446 	NtUserSystemParametersInfo(uiSet, 0, (PVOID)1, SPIF_UPDATEINIFILE);
447 	NtUserSystemParametersInfo(uiGet, 0, &bTemp, 0);
448 	TEST(bTemp == 1);
449 	cbSize = sizeof(dwUserPref);
450 	TEST(QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPref, &cbSize, NULL) == ERROR_SUCCESS);
451 	TEST((dwUserPref & dwPrefMask) == dwPrefMask);
452 	TEST((dwUserPref & (~dwPrefMask)) == (dwUserPrefOrg & (~dwPrefMask)));
453 
454 	/* Restore original value */
455 	NtUserSystemParametersInfo(uiSet, 0, (PVOID)bOrig, SPIF_UPDATEINIFILE);
456 
457 
458 }
459 
460 
461 /******************************************************************************/
462 
463 void
464 Test_SPI_SETBEEP(void)
465 {
466 	BOOL bOrig, bTemp = 0;
467 	WCHAR szReg[10];
468 	DWORD cbSize;
469 
470 	/* Get original value */
471 	NtUserSystemParametersInfo(SPI_GETBEEP, 0, &bOrig, 0);
472 
473 	/* Value 0 */
474 	NtUserSystemParametersInfo(SPI_SETBEEP, 0, NULL, SPIF_UPDATEINIFILE);
475 	NtUserSystemParametersInfo(SPI_GETBEEP, 0, &bTemp, 0);
476 	TEST(bTemp == 0);
477 	cbSize = sizeof(szReg);
478 	TEST(QueryUserRegValueW(KEY_SOUND, VAL_BEEP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
479 	TEST(_wcsicmp(szReg, L"No") == 0);
480 
481 	/* Value 1 */
482 	NtUserSystemParametersInfo(SPI_SETBEEP, 1, NULL, SPIF_UPDATEINIFILE);
483 	NtUserSystemParametersInfo(SPI_GETBEEP, 0, &bTemp, 0);
484 	TEST(bTemp == 1);
485 	cbSize = sizeof(szReg);
486 	TEST(QueryUserRegValueW(KEY_SOUND, VAL_BEEP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
487 	TEST(_wcsicmp(szReg, L"Yes") == 0);
488 
489 	/* Value 2 */
490 	NtUserSystemParametersInfo(SPI_SETBEEP, 2, NULL, SPIF_UPDATEINIFILE);
491 	NtUserSystemParametersInfo(SPI_GETBEEP, 0, &bTemp, 0);
492 	TEST(bTemp == 1);
493 	cbSize = sizeof(szReg);
494 	TEST(QueryUserRegValueW(KEY_SOUND, VAL_BEEP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
495 	TEST(_wcsicmp(szReg, L"Yes") == 0);
496 
497 	/* Restore original value */
498 	NtUserSystemParametersInfo(SPI_SETBEEP, 0, &bOrig, SPIF_UPDATEINIFILE);
499 }
500 
501 void
502 Test_SPI_SETMOUSE(void)
503 {
504 	INT aiOrig[3], aiTemp[3];
505 
506 	/* Get original value */
507 	NtUserSystemParametersInfo(SPI_GETMOUSE, 0, aiOrig, 0);
508 
509 	/* Test uiParam value */
510 	TEST(NtUserSystemParametersInfo(SPI_GETMOUSE, 0, aiTemp, 0) == 1);
511 	TEST(NtUserSystemParametersInfo(SPI_GETMOUSE, 1, aiTemp, 0) == 1);
512 	TEST(NtUserSystemParametersInfo(SPI_GETMOUSE, -1, aiTemp, 0) == 1);
513 	TEST(NtUserSystemParametersInfo(SPI_GETMOUSE, 0xdeadbeef, aiTemp, 0) == 1);
514 
515     /* Set modified values */
516     aiTemp[0] = aiOrig[0] + 1;
517     aiTemp[1] = aiOrig[1] - 1;
518     aiTemp[2] = aiOrig[2] + 2;
519 	NtUserSystemParametersInfo(SPI_SETMOUSE, 2, aiTemp, SPIF_UPDATEINIFILE);
520     aiTemp[0] = aiTemp[1] = aiTemp[2] = 0;
521 
522     /* Get new values */
523 	NtUserSystemParametersInfo(SPI_GETMOUSE, 0, aiTemp, 0);
524 
525     /* Test modified values */
526     TEST(aiTemp[0] == aiOrig[0] + 1);
527     TEST(aiTemp[1] == aiOrig[1] - 1);
528     TEST(aiTemp[2] == aiOrig[2] + 2);
529 
530     // FIXME: Test registry values
531 
532 	/* Restore original value */
533 	NtUserSystemParametersInfo(SPI_SETMOUSE, 0, aiOrig, SPIF_UPDATEINIFILE);
534 }
535 
536 void
537 Test_SPI_SETBORDER(void)
538 {
539 	INT iOrig, iTemp = 0;
540 
541 	/* Get original value */
542 	NtUserSystemParametersInfo(SPI_GETBORDER, 0, &iOrig, 0);
543 
544 	/* Value 0 */
545 	NtUserSystemParametersInfo(SPI_SETBORDER, 0, NULL, SPIF_UPDATEINIFILE);
546 	NtUserSystemParametersInfo(SPI_GETBORDER, 0, &iTemp, 0);
547 	TEST(iTemp == 1);
548 	TEST(GetSystemMetrics(SM_CXBORDER) == 1);
549 
550 	/* Value 1 */
551 	NtUserSystemParametersInfo(SPI_SETBORDER, 1, NULL, SPIF_UPDATEINIFILE);
552 	NtUserSystemParametersInfo(SPI_GETBORDER, 0, &iTemp, 0);
553 	TEST(iTemp == 1);
554 //	Test_MetricKey(pti, VAL_BORDER, 1);
555 
556 	/* Value 2 */
557 	NtUserSystemParametersInfo(SPI_SETBORDER, 2, NULL, SPIF_UPDATEINIFILE);
558 	NtUserSystemParametersInfo(SPI_GETBORDER, 0, &iTemp, 0);
559 	TEST(iTemp == 2);
560 	TEST(GetSystemMetrics(SM_CXBORDER) == 1);
561 
562 	/* Restore original value */
563 	NtUserSystemParametersInfo(SPI_SETBORDER, iOrig, NULL, SPIF_UPDATEINIFILE);
564 
565 }
566 
567 //	Test_SPI_SETKEYBOARDSPEED();
568 //	Test_SPI_LANGDRIVER();
569 //	Test_SPI_ICONHORIZONTALSPACING();
570 //	Test_SPI_SETSCREENSAVETIMEOUT();
571 //	Test_SPI_SETSCREENSAVEACTIVE();
572 //	Test_SPI_SETGRIDGRANULARITY();
573 
574 void
575 Test_SPI_SETDESKWALLPAPER(void)
576 {
577     UNICODE_STRING ustrOld, ustrNew;
578     WCHAR szOld[MAX_PATH];
579     WCHAR szNew[MAX_PATH];
580 
581 	/* Get old Wallpaper */
582 	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, szOld, 0) == 1);
583     RtlInitUnicodeString(&ustrOld, szOld);
584 
585 	/* Set no Wallpaper */
586 	TEST(NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, L"", 0) == 1);
587 	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, szNew, 0) == 1);
588 	TEST(szNew[0] == 0);
589 
590     /* Set no Wallpaper 2 */
591     RtlInitUnicodeString(&ustrNew, L"");
592 	TEST(NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &ustrNew, 0) == 1);
593 	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, szNew, 0) == 1);
594 	TEST(szNew[0] == 0);
595 
596     /* Reset Wallpaper */
597 	TEST(NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, NULL, 0) == 1);
598 	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, szNew, 0) == 1);
599 	TEST(wcscmp(szNew, szOld) == 0);
600 
601     /* Set new Wallpaper */
602     RtlInitUnicodeString(&ustrNew, L"test.bmp");
603 	TEST(NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &ustrNew, 0) == 1);
604 	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, szNew, 0) == 1);
605 	TEST(wcscmp(szNew, L"test.bmp") == 0);
606 
607 	/* Get Wallpaper, too small buffer  */
608 	szNew[0] = 0; szNew[1] = 0; szNew[2] = 0;
609 	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, 3, szNew, 0) == 1);
610     TEST(szNew[0] != 0);
611     TEST(szNew[1] != 0);
612     TEST(szNew[2] != 0);
613 
614     /* Set invalid Wallpaper */
615     SetLastError(0xdeadbeef);
616     RtlInitUnicodeString(&ustrNew, L"*#!!-&");
617 	TEST(NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &ustrNew, 0) == 0);
618 	TEST(GetLastError() == ERROR_FILE_NOT_FOUND);
619 	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, szNew, 0) == 1);
620 	TEST(wcscmp(szNew, L"*#!!-&") == 0);
621 
622 	/* Restore old Wallpaper */
623 	TEST(NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, MAX_PATH, &ustrOld, SPIF_UPDATEINIFILE) == 1);
624 
625 }
626 
627 //	Test_SPI_SETDESKPATTERN();
628 //	Test_SPI_SETKEYBOARDDELAY();
629 //	Test_SPI_ICONVERTICALSPACING();
630 //	Test_SPI_SETICONTITLEWRAP();
631 //	Test_SPI_SETMENUDROPALIGNMENT();
632 //	Test_SPI_SETDOUBLECLKWIDTH();
633 //	Test_SPI_SETDOUBLECLKHEIGHT();
634 //	Test_SPI_SETDOUBLECLICKTIME();
635 
636 void
637 Test_SPI_SETMOUSEBUTTONSWAP(void)
638 {
639 	BOOL bOrig, bTemp = 0;
640 	WCHAR szReg[10];
641 	DWORD cbSize;
642 
643 	/* Get original value */
644 	bOrig = GetSystemMetrics(SM_SWAPBUTTON);
645 
646 	/* Value 0 */
647 	NtUserSystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 0, NULL, SPIF_UPDATEINIFILE);
648 	bTemp = GetSystemMetrics(SM_SWAPBUTTON);
649 	TEST(bTemp == 0);
650 	cbSize = sizeof(szReg);
651 	TEST(QueryUserRegValueW(KEY_MOUSE, VAL_SWAP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
652 	TEST(_wcsicmp(szReg, L"0") == 0);
653 
654 	/* Value 1 */
655 	NtUserSystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 1, NULL, SPIF_UPDATEINIFILE);
656 	bTemp = GetSystemMetrics(SM_SWAPBUTTON);
657 	TEST(bTemp == 1);
658 	cbSize = sizeof(szReg);
659 	TEST(QueryUserRegValueW(KEY_MOUSE, VAL_SWAP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
660 	TEST(_wcsicmp(szReg, L"1") == 0);
661 
662 	/* Value 2 */
663 	NtUserSystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 2, NULL, SPIF_UPDATEINIFILE);
664 	bTemp = GetSystemMetrics(SM_SWAPBUTTON);
665 	TEST(bTemp == 1);
666 	cbSize = sizeof(szReg);
667 	TEST(QueryUserRegValueW(KEY_MOUSE, VAL_SWAP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
668 	TEST(_wcsicmp(szReg, L"2") == 0);
669 
670 	/* Value -1 */
671 	NtUserSystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, -1, NULL, SPIF_UPDATEINIFILE);
672 	bTemp = GetSystemMetrics(SM_SWAPBUTTON);
673 	TEST(bTemp == 1);
674 	cbSize = sizeof(szReg);
675 	TEST(QueryUserRegValueW(KEY_MOUSE, VAL_SWAP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
676 	TEST(_wcsicmp(szReg, L"-1") == 0);
677 
678 	/* Restore original value */
679 	NtUserSystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, bOrig, 0, SPIF_UPDATEINIFILE);
680 
681 
682 }
683 
684 void
685 Test_SPI_SETICONTITLELOGFONT(void)
686 {
687     LOGFONTW lfOrig;
688     struct
689     {
690         LOGFONTW lf;
691         DWORD dwRedzone;
692     } buf;
693 
694 	/* Get original value */
695 	ASSERT(NtUserSystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(lfOrig), &lfOrig, 0));
696 
697     /* Test uiParam == 0 */
698     memset(&buf, 0, sizeof(buf));
699     buf.lf.lfFaceName[LF_FACESIZE-1] = 33;
700     buf.dwRedzone = 0xdeadbeef;
701 	TEST(NtUserSystemParametersInfo(SPI_GETICONTITLELOGFONT, 0, &buf.lf, 0) == 1);
702     TEST(buf.lf.lfHeight != 0);
703     TEST(buf.lf.lfWeight != 0);
704     TEST(buf.lf.lfFaceName[0] != 0);
705     TEST(buf.lf.lfFaceName[LF_FACESIZE-1] == 0);
706     TEST(buf.dwRedzone == 0xdeadbeef);
707 
708     /* Test uiParam < sizeof(LOGFONTW) */
709     memset(&buf, 0, sizeof(buf));
710     buf.lf.lfFaceName[LF_FACESIZE-1] = 33;
711     buf.dwRedzone = 0xdeadbeef;
712 	TEST(NtUserSystemParametersInfo(SPI_GETICONTITLELOGFONT, 8, &buf.lf, 0) == 1);
713     TEST(buf.lf.lfHeight != 0);
714     TEST(buf.lf.lfWeight != 0);
715     TEST(buf.lf.lfFaceName[0] != 0);
716     TEST(buf.lf.lfFaceName[LF_FACESIZE-1] == 0);
717     TEST(buf.dwRedzone == 0xdeadbeef);
718 
719     /* Test uiParam < 0 */
720 	TEST(NtUserSystemParametersInfo(SPI_GETICONTITLELOGFONT, -1, &buf.lf, 0) == 1);
721 }
722 
723 void
724 Test_SPI_SETFASTTASKSWITCH(void)
725 {
726     char buf[10];
727 	TEST(NtUserSystemParametersInfo(SPI_SETFASTTASKSWITCH, 0, 0, 0) == 1);
728 	TEST(NtUserSystemParametersInfo(SPI_SETFASTTASKSWITCH, 0, buf, 0) == 1);
729 
730 
731 }
732 
733 void
734 Test_SPI_SETDRAGFULLWINDOWS(void)
735 {
736 
737 }
738 
739 void
740 Test_SPI_SETNONCLIENTMETRICS(void)
741 {
742     NONCLIENTMETRICSW metrics;
743     NONCLIENTMETRICSW origMetrics;
744 
745     metrics.cbSize = sizeof(NONCLIENTMETRICSW);
746     TEST(NtUserSystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &metrics, 0) == 1);
747     TEST(NtUserSystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), (PVOID)0xdeadbeef, 0) == 0);
748 
749     origMetrics = metrics;
750 
751     metrics.cbSize = sizeof(NONCLIENTMETRICSW) + 10;
752     TEST(NtUserSystemParametersInfo(SPI_SETNONCLIENTMETRICS, 0, (PVOID)&metrics, 0) == 1);
753     TEST(NtUserSystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, (PVOID)&metrics, 0) == 1);
754     ok(metrics.cbSize == sizeof(NONCLIENTMETRICSW), "Expected size: %lu, got %lu\n", (ULONG)sizeof(NONCLIENTMETRICSW), (ULONG)metrics.cbSize);
755 
756     TEST(NtUserSystemParametersInfo(SPI_SETNONCLIENTMETRICS, 0, (PVOID)&origMetrics, 0) == 1);
757 }
758 
759 void
760 Test_SPI_SETMINIMIZEDMETRICS(void)
761 {
762     MINIMIZEDMETRICS metrics;
763     MINIMIZEDMETRICS origMetrics;
764 
765     metrics.cbSize = sizeof(MINIMIZEDMETRICS);
766     TEST(NtUserSystemParametersInfo(SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), (PVOID)&metrics, 0) == 1);
767     TEST(NtUserSystemParametersInfo(SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), (PVOID)0xdeadbeef, 0) == 0);
768 
769     origMetrics = metrics;
770 
771     metrics.cbSize = sizeof(MINIMIZEDMETRICS) + 10;
772     TEST(NtUserSystemParametersInfo(SPI_SETMINIMIZEDMETRICS, 0, (PVOID)&metrics, 0) == 1);
773     TEST(NtUserSystemParametersInfo(SPI_GETMINIMIZEDMETRICS, 0, (PVOID)&metrics, 0) == 1);
774     ok(metrics.cbSize == sizeof(MINIMIZEDMETRICS), "Expected size: %lu, got %lu\n", (ULONG)sizeof(MINIMIZEDMETRICS), (ULONG)metrics.cbSize);
775 
776     TEST(NtUserSystemParametersInfo(SPI_SETMINIMIZEDMETRICS, 0, (PVOID)&origMetrics, 0) == 1);
777 }
778 
779 void
780 Test_SPI_SETICONMETRICS(void)
781 {
782     ICONMETRICSW metrics;
783     ICONMETRICSW origMetrics;
784 
785     metrics.cbSize = sizeof(ICONMETRICSW);
786     TEST(NtUserSystemParametersInfo(SPI_GETICONMETRICS, sizeof(ICONMETRICSW), (PVOID)&metrics, 0) == 1);
787     TEST(NtUserSystemParametersInfo(SPI_GETICONMETRICS, sizeof(ICONMETRICSW), (PVOID)0xdeadbeef, 0) == 0);
788 
789     origMetrics = metrics;
790 
791     metrics.cbSize = sizeof(ICONMETRICSW) + 10;
792     TEST(NtUserSystemParametersInfo(SPI_SETICONMETRICS, 0, (PVOID)&metrics, 0) == 1);
793     TEST(NtUserSystemParametersInfo(SPI_GETICONMETRICS, 0, (PVOID)&metrics, 0) == 1);
794     ok(metrics.cbSize == sizeof(ICONMETRICSW), "Expected size: %lu, got %lu\n", (ULONG)sizeof(ICONMETRICSW), (ULONG)metrics.cbSize);
795 
796     TEST(NtUserSystemParametersInfo(SPI_SETICONMETRICS, 0, (PVOID)&origMetrics, 0) == 1);
797 }
798 
799 void
800 Test_SPI_SETWORKAREA(void)
801 {
802     RECT rcOrig, rc;
803 
804     /* Get the original value */
805 	ASSERT(NtUserSystemParametersInfo(SPI_GETWORKAREA, 0, &rcOrig, 0) == 1);
806 
807     /* Change value */
808     rc = rcOrig;
809     rc.left += 1;
810     rc.top += 2;
811     rc.right -= 3;
812     rc.bottom -= 2;
813 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 1, &rc, 0) == 1);
814 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 1);
815 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, sizeof(RECT), &rc, 0) == 1);
816 
817 	TEST(NtUserSystemParametersInfo(SPI_GETWORKAREA, 1, &rc, 0) == 1);
818 	TEST(NtUserSystemParametersInfo(SPI_GETWORKAREA, -1, &rc, 0) == 1);
819 	TEST(NtUserSystemParametersInfo(SPI_GETWORKAREA, 0xdeadbeef, &rc, 0) == 1);
820 	TEST(NtUserSystemParametersInfo(SPI_GETWORKAREA, 0, (PVOID)0xdeadbeef, 0) == 0);
821 
822     /* Test values */
823     rc = rcOrig; rc.left = -1;
824 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
825     rc = rcOrig; rc.top = -1;
826 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
827     rc = rcOrig; rc.top = 10; rc.bottom = 11;
828 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 1);
829     rc = rcOrig; rc.top = 10; rc.bottom = 10;
830 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
831     rc = rcOrig; rc.top = 10; rc.bottom = 9;
832 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
833     rc = rcOrig; rc.left = 10; rc.right = 11;
834 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 1);
835     rc = rcOrig; rc.left = 10; rc.right = 10;
836 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
837     rc = rcOrig; rc.left = 10; rc.right = 9;
838 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
839     rc = rcOrig; rc.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN);
840 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 1);
841     rc = rcOrig; rc.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN)+1;
842 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
843     rc = rcOrig; rc.right = GetSystemMetrics(SM_CXVIRTUALSCREEN);
844 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 1);
845     rc = rcOrig; rc.right = GetSystemMetrics(SM_CXVIRTUALSCREEN)+1;
846 	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
847 
848     /* Restore original value */
849 	ASSERT(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rcOrig, 0) == 1);
850 
851 
852 }
853 
854 void
855 Test_SPI_SETPENWINDOWS(void)
856 {
857 
858 }
859 
860 void
861 Test_SPI_SETFILTERKEYS(void)
862 {
863 
864 }
865 
866 void
867 Test_SPI_SETTOGGLEKEYS(void)
868 {
869 
870 }
871 
872 void
873 Test_SPI_SETMOUSEKEYS(void)
874 {
875 
876 }
877 
878 void
879 Test_SPI_SETSHOWSOUNDS(void)
880 {
881 
882 }
883 
884 void
885 Test_SPI_SETSTICKYKEYS(void)
886 {
887 	STICKYKEYS skOrig, sk;
888 
889     /* Get original values */
890 	skOrig.cbSize = sizeof(STICKYKEYS);
891 	ASSERT(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, 0, &skOrig, 0) == 1);
892 
893 	sk.cbSize = sizeof(STICKYKEYS)+1;
894 	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, 0, &sk, 0) == 0);
895 
896 	sk.cbSize = sizeof(STICKYKEYS)-1;
897 	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, 0, &sk, 0) == 0);
898 
899 	sk.cbSize = sizeof(STICKYKEYS);
900 	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, 1, &sk, 0) == 0);
901 	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, -1, &sk, 0) == 0);
902 	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, sk.cbSize, &sk, 0) == 1);
903 	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, sk.cbSize-1, &sk, 0) == 0);
904 	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, sk.cbSize+1, &sk, 0) == 0);
905 
906     sk = skOrig;
907     sk.dwFlags = (skOrig.dwFlags ^ 1);
908 	TEST(NtUserSystemParametersInfo(SPI_SETSTICKYKEYS, sk.cbSize+1, &sk, 0) == 0);
909 	TEST(NtUserSystemParametersInfo(SPI_SETSTICKYKEYS, sk.cbSize-1, &sk, 0) == 0);
910 	TEST(NtUserSystemParametersInfo(SPI_SETSTICKYKEYS, sk.cbSize, &sk, 0) == 1);
911 
912     sk = skOrig;
913 	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, 0, &sk, 0) == 1);
914     TEST(sk.dwFlags == (skOrig.dwFlags ^ 1));
915 
916     /* Restore original values */
917 	skOrig.cbSize = sizeof(STICKYKEYS);
918 	ASSERT(NtUserSystemParametersInfo(SPI_SETSTICKYKEYS, 0, &skOrig, 0) == 1);
919 
920 }
921 
922 void
923 Test_SPI_SETACCESSTIMEOUT(void)
924 {
925     ACCESSTIMEOUT atoOrig, atoTmp;
926 
927     /* Get original values */
928     atoOrig.cbSize = sizeof(ACCESSTIMEOUT);
929 	ASSERT(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 0, &atoOrig, 0) == 1);
930 
931     atoTmp.cbSize = sizeof(ACCESSTIMEOUT) - 1;
932 	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 0, &atoTmp, 0) == 0);
933     atoTmp.cbSize = sizeof(ACCESSTIMEOUT) + 1;
934 	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 0, &atoTmp, 0) == 0);
935     atoTmp.cbSize = sizeof(ACCESSTIMEOUT);
936 	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 0, &atoTmp, 0) == 1);
937     atoTmp.cbSize = sizeof(ACCESSTIMEOUT);
938 	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 1, &atoTmp, 0) == 0);
939     atoTmp.cbSize = sizeof(ACCESSTIMEOUT);
940 	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, -1, &atoTmp, 0) == 0);
941     atoTmp.cbSize = sizeof(ACCESSTIMEOUT);
942 	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, sizeof(ACCESSTIMEOUT), &atoTmp, 0) == 1);
943     atoTmp.cbSize = sizeof(ACCESSTIMEOUT);
944 	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, sizeof(ACCESSTIMEOUT)-1, &atoTmp, 0) == 0);
945     atoTmp.cbSize = sizeof(ACCESSTIMEOUT);
946 	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, sizeof(ACCESSTIMEOUT)+1, &atoTmp, 0) == 0);
947 
948     /* Restore original values */
949 	ASSERT(NtUserSystemParametersInfo(SPI_SETACCESSTIMEOUT, sizeof(atoOrig), &atoOrig, 0) == 1);
950 }
951 
952 void
953 Test_SPI_SETSERIALKEYS(void)
954 {
955 
956 }
957 
958 void
959 Test_SPI_SETSOUNDSENTRY(void)
960 {
961 
962 }
963 
964 void
965 Test_SPI_SETHIGHCONTRAST(void)
966 {
967 
968 }
969 
970 void
971 Test_SPI_SETKEYBOARDPREF(void)
972 {
973 
974 }
975 
976 //	Test_SPI_SETSCREENREADER();
977 ///	Test_SPI_SETANIMATION();
978 //	Test_SPI_SETFONTSMOOTHING();
979 //	Test_SPI_SETDRAGWIDTH();
980 //	Test_SPI_SETDRAGHEIGHT();
981 //	Test_SPI_SETHANDHELD();
982 //	Test_SPI_SETLOWPOWERTIMEOUT();
983 //	Test_SPI_SETPOWEROFFTIMEOUT();
984 //	Test_SPI_SETLOWPOWERACTIVE();
985 //	Test_SPI_SETPOWEROFFACTIVE();
986 //	Test_SPI_SETCURSORS();
987 //	Test_SPI_SETICONS();
988 //	Test_SPI_SETDEFAULTINPUTLANG();
989 //	Test_SPI_SETLANGTOGGLE();
990 //	Test_SPI_GETWINDOWSEXTENSION();
991 //	Test_SPI_SETMOUSETRAILS();
992 //	Test_SPI_SETSNAPTODEFBUTTON();
993 //	Test_SPI_GETSCREENSAVERRUNNING();
994 //	Test_SPI_SETMOUSEHOVERWIDTH();
995 //	Test_SPI_SETMOUSEHOVERHEIGHT();
996 //	Test_SPI_SETMOUSEHOVERTIME();
997 //	Test_SPI_SETWHEELSCROLLLINES();
998 //	Test_SPI_SETMENUSHOWDELAY();
999 //	Test_SPI_SETWHEELSCROLLCHARS();
1000 //	Test_SPI_SETSHOWIMEUI();
1001 //	Test_SPI_SETMOUSESPEED();
1002 //	Test_SPI_GETSCREENSAVERRUNNING();
1003 //	Test_SPI_SETAUDIODESCRIPTION();
1004 //	Test_SPI_SETSCREENSAVESECURE();
1005 //	Test_SPI_SETACTIVEWINDOWTRACKING();
1006 
1007 void
1008 Test_SPI_SETMENUANIMATION(void)
1009 {
1010 	BOOL bOrig, bTemp = 0;
1011 	DWORD dwUserPrefMask;
1012 	DWORD cbSize;
1013 
1014 	/* Get original values */
1015 	NtUserSystemParametersInfo(SPI_GETMENUANIMATION, 0, &bOrig, 0);
1016 
1017 	/* Value 0 */
1018 	NtUserSystemParametersInfo(SPI_SETMENUANIMATION, 0, NULL, SPIF_UPDATEINIFILE);
1019 	NtUserSystemParametersInfo(SPI_GETMENUANIMATION, 0, &bTemp, 0);
1020 	TEST(bTemp == 0);
1021 	cbSize = sizeof(dwUserPrefMask);
1022 	TEST(QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPrefMask, &cbSize, NULL) == ERROR_SUCCESS);
1023 	TEST((dwUserPrefMask & UPM_MENUANIMATION) == 0);
1024 
1025 	/* Value 1 */
1026 	NtUserSystemParametersInfo(SPI_SETMENUANIMATION, 0, (PVOID)1, SPIF_UPDATEINIFILE);
1027 	NtUserSystemParametersInfo(SPI_GETMENUANIMATION, 0, &bTemp, 0);
1028 	TEST(bTemp == 1);
1029 	cbSize = sizeof(dwUserPrefMask);
1030 	TEST(QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPrefMask, &cbSize, NULL) == ERROR_SUCCESS);
1031 	TEST((dwUserPrefMask & UPM_MENUANIMATION) != 0);
1032 
1033 
1034 	/* Restore original values */
1035 	NtUserSystemParametersInfo(SPI_SETMENUANIMATION, 0, (PVOID)bOrig, SPIF_UPDATEINIFILE);
1036 }
1037 
1038 //	Test_SPI_SETCOMBOBOXANIMATION();
1039 //	Test_SPI_SETLISTBOXSMOOTHSCROLLING();
1040 //	Test_SPI_SETGRADIENTCAPTIONS();
1041 
1042 void
1043 Test_SPI_SETKEYBOARDCUES(void)
1044 {
1045     Test_UserPref(SPI_GETKEYBOARDCUES, SPI_SETKEYBOARDCUES, UPM_KEYBOARDCUES);
1046 }
1047 
1048 //	Test_SPI_SETACTIVEWNDTRKZORDER();
1049 //	Test_SPI_SETHOTTRACKING();
1050 //	Test_SPI_SETMENUFADE();
1051 //	Test_SPI_SETSELECTIONFADE();
1052 //	Test_SPI_SETTOOLTIPANIMATION();
1053 //	Test_SPI_SETTOOLTIPFADE();
1054 //	Test_SPI_SETCURSORSHADOW();
1055 //	Test_SPI_SETMOUSESONAR();
1056 
1057 void
1058 Test_SPI_SETMOUSECLICKLOCK(void)
1059 {
1060     Test_UserPref(SPI_GETMOUSECLICKLOCK, SPI_SETMOUSECLICKLOCK, UPM_CLICKLOCK);
1061 }
1062 
1063 //	Test_SPI_SETMOUSEVANISH();
1064 //	Test_SPI_SETFLATMENU();
1065 //	Test_SPI_SETDROPSHADOW();
1066 //	Test_SPI_SETBLOCKSENDINPUTRESETS();
1067 //	Test_SPI_GETSETUIEFFECTS();
1068 //	Test_SPI_SETDISABLEOVERLAPPEDCONTENT();
1069 //	Test_SPI_SETCLIENTAREAANIMATION();
1070 //	Test_SPI_SETCLEARTYPE();
1071 //	Test_SPI_SETSPEECHRECOGNITION();
1072 //	Test_SPI_SETFOREGROUNDLOCKTIMEOUT();
1073 //	Test_SPI_SETACTIVEWNDTRKTIMEOUT();
1074 //	Test_SPI_SETFOREGROUNDFLASHCOUNT();
1075 //	Test_SPI_SETCARETWIDTH();
1076 //	Test_SPI_SETMOUSECLICKLOCKTIME();
1077 //	Test_SPI_SETFONTSMOOTHINGTYPE();
1078 //	Test_SPI_SETFONTSMOOTHINGCONTRAST();
1079 //	Test_SPI_SETFOCUSBORDERWIDTH();
1080 //	Test_SPI_SETFOCUSBORDERHEIGHT();
1081 //	Test_SPI_SETFONTSMOOTHINGORIENTATION();
1082 
1083 
1084 START_TEST(NtUserSystemParametersInfo)
1085 {
1086 	HWND hWnd;
1087 
1088 	hWnd = CreateTestWindow();
1089 	ASSERT(hWnd);
1090 
1091 	Test_NtUserSystemParametersInfo_Params();
1092 	Test_NtUserSystemParametersInfo_fWinIni();
1093     Test_NtUserSystemParametersInfo_Winsta();
1094 
1095 	Test_SPI_SETBEEP();
1096     Test_SPI_SETMOUSE();
1097     Test_SPI_SETBORDER();
1098 //	Test_SPI_SETKEYBOARDSPEED();
1099 //	Test_SPI_LANGDRIVER();
1100 //	Test_SPI_ICONHORIZONTALSPACING();
1101 //	Test_SPI_SETSCREENSAVETIMEOUT();
1102 //	Test_SPI_SETSCREENSAVEACTIVE();
1103 //	Test_SPI_SETGRIDGRANULARITY();
1104 	Test_SPI_SETDESKWALLPAPER();
1105 //	Test_SPI_SETDESKPATTERN();
1106 //	Test_SPI_SETKEYBOARDDELAY();
1107 //	Test_SPI_ICONVERTICALSPACING();
1108 //	Test_SPI_SETICONTITLEWRAP();
1109 //	Test_SPI_SETMENUDROPALIGNMENT();
1110 //	Test_SPI_SETDOUBLECLKWIDTH();
1111 //	Test_SPI_SETDOUBLECLKHEIGHT();
1112 //	Test_SPI_SETDOUBLECLICKTIME();
1113 	Test_SPI_SETMOUSEBUTTONSWAP();
1114 	Test_SPI_SETICONTITLELOGFONT();
1115 	Test_SPI_SETFASTTASKSWITCH();
1116 	Test_SPI_SETDRAGFULLWINDOWS();
1117 	Test_SPI_SETNONCLIENTMETRICS();
1118 	Test_SPI_SETMINIMIZEDMETRICS();
1119 	Test_SPI_SETICONMETRICS();
1120 	Test_SPI_SETWORKAREA();
1121 	Test_SPI_SETPENWINDOWS();
1122 	Test_SPI_SETFILTERKEYS();
1123 	Test_SPI_SETTOGGLEKEYS();
1124 	Test_SPI_SETMOUSEKEYS();
1125 	Test_SPI_SETSHOWSOUNDS();
1126 	Test_SPI_SETSTICKYKEYS();
1127 	Test_SPI_SETACCESSTIMEOUT();
1128 	Test_SPI_SETSERIALKEYS();
1129 	Test_SPI_SETSOUNDSENTRY();
1130 	Test_SPI_SETHIGHCONTRAST();
1131 	Test_SPI_SETKEYBOARDPREF();
1132 //	Test_SPI_SETSCREENREADER();
1133 ///	Test_SPI_SETANIMATION();
1134 //	Test_SPI_SETFONTSMOOTHING();
1135 //	Test_SPI_SETDRAGWIDTH();
1136 //	Test_SPI_SETDRAGHEIGHT();
1137 //	Test_SPI_SETHANDHELD();
1138 //	Test_SPI_SETLOWPOWERTIMEOUT();
1139 //	Test_SPI_SETPOWEROFFTIMEOUT();
1140 //	Test_SPI_SETLOWPOWERACTIVE();
1141 //	Test_SPI_SETPOWEROFFACTIVE();
1142 //	Test_SPI_SETCURSORS();
1143 //	Test_SPI_SETICONS();
1144 //	Test_SPI_SETDEFAULTINPUTLANG();
1145 //	Test_SPI_SETLANGTOGGLE();
1146 //	Test_SPI_GETWINDOWSEXTENSION();
1147 //	Test_SPI_SETMOUSETRAILS();
1148 //	Test_SPI_SETSNAPTODEFBUTTON();
1149 //	Test_SPI_GETSCREENSAVERRUNNING();
1150 //	Test_SPI_SETMOUSEHOVERWIDTH();
1151 //	Test_SPI_SETMOUSEHOVERHEIGHT();
1152 //	Test_SPI_SETMOUSEHOVERTIME();
1153 //	Test_SPI_SETWHEELSCROLLLINES();
1154 //	Test_SPI_SETMENUSHOWDELAY();
1155 //	Test_SPI_SETWHEELSCROLLCHARS();
1156 //	Test_SPI_SETSHOWIMEUI();
1157 //	Test_SPI_SETMOUSESPEED();
1158 //	Test_SPI_GETSCREENSAVERRUNNING();
1159 //	Test_SPI_SETAUDIODESCRIPTION();
1160 //	Test_SPI_SETSCREENSAVESECURE();
1161 //	Test_SPI_SETACTIVEWINDOWTRACKING();
1162 	Test_SPI_SETMENUANIMATION();
1163 //	Test_SPI_SETCOMBOBOXANIMATION();
1164 //	Test_SPI_SETLISTBOXSMOOTHSCROLLING();
1165 //	Test_SPI_SETGRADIENTCAPTIONS();
1166 	Test_SPI_SETKEYBOARDCUES();
1167 //	Test_SPI_SETACTIVEWNDTRKZORDER();
1168 //	Test_SPI_SETHOTTRACKING();
1169 //	Test_SPI_SETMENUFADE();
1170 //	Test_SPI_SETSELECTIONFADE();
1171 //	Test_SPI_SETTOOLTIPANIMATION();
1172 //	Test_SPI_SETTOOLTIPFADE();
1173 //	Test_SPI_SETCURSORSHADOW();
1174 //	Test_SPI_SETMOUSESONAR();
1175 	Test_SPI_SETMOUSECLICKLOCK();
1176 //	Test_SPI_SETMOUSEVANISH();
1177 //	Test_SPI_SETFLATMENU();
1178 //	Test_SPI_SETDROPSHADOW();
1179 //	Test_SPI_SETBLOCKSENDINPUTRESETS();
1180 //	Test_SPI_GETSETUIEFFECTS();
1181 //	Test_SPI_SETDISABLEOVERLAPPEDCONTENT();
1182 //	Test_SPI_SETCLIENTAREAANIMATION();
1183 //	Test_SPI_SETCLEARTYPE();
1184 //	Test_SPI_SETSPEECHRECOGNITION();
1185 //	Test_SPI_SETFOREGROUNDLOCKTIMEOUT();
1186 //	Test_SPI_SETACTIVEWNDTRKTIMEOUT();
1187 //	Test_SPI_SETFOREGROUNDFLASHCOUNT();
1188 //	Test_SPI_SETCARETWIDTH();
1189 //	Test_SPI_SETMOUSECLICKLOCKTIME();
1190 //	Test_SPI_SETFONTSMOOTHINGTYPE();
1191 //	Test_SPI_SETFONTSMOOTHINGCONTRAST();
1192 //	Test_SPI_SETFOCUSBORDERWIDTH();
1193 //	Test_SPI_SETFOCUSBORDERHEIGHT();
1194 //	Test_SPI_SETFONTSMOOTHINGORIENTATION();
1195 
1196 	DestroyWindow(hWnd);
1197 }
1198