static const WCHAR* KEY_MOUSE = L"Control Panel\\Mouse";
//static const WCHAR* VAL_MOUSE1 = L"MouseThreshold1";
//static const WCHAR* VAL_MOUSE2 = L"MouseThreshold2";
//static const WCHAR* VAL_MOUSE3 = L"MouseSpeed";
//static const WCHAR* VAL_DBLCLKWIDTH = L"DoubleClickWidth";
//static const WCHAR* VAL_DBLCLKHEIGHT = L"DoubleClickHeight";
//static const WCHAR* VAL_DBLCLKTIME = L"DoubleClickSpeed";
static const WCHAR* VAL_SWAP = L"SwapMouseButtons";

static const WCHAR* KEY_DESKTOP = L"Control Panel\\Desktop";
//static const WCHAR* VAL_SCRTO = L"ScreenSaveTimeOut";
//static const WCHAR* VAL_SCRACT = L"ScreenSaveActive";
//static const WCHAR* VAL_GRID = L"GridGranularity";
//static const WCHAR* VAL_DRAG = L"DragFullWindows";
//static const WCHAR* VAL_DRAGHEIGHT = L"DragHeight";
//static const WCHAR* VAL_DRAGWIDTH = L"DragWidth";
//static const WCHAR* VAL_FNTSMOOTH = L"FontSmoothing";
static const WCHAR* VAL_PREFMASK = L"UserPreferencesMask";

enum
{
    UPM_ACTIVEWINDOWTRACKING = 0x01,
    UPM_MENUANIMATION = 0x02,
    UPM_COMBOBOXANIMATION = 0x04,
    UPM_LISTBOXSMOOTHSCROLLING = 0x08,
    UPM_GRADIENTCAPTIONS = 0x10,
    UPM_KEYBOARDCUES = 0x20,
    UPM_ACTIVEWNDTRKZORDER = 0x40,
    UPM_HOTTRACKING = 0x80,
    UPM_RESERVED = 0x100,
    UPM_MENUFADE = 0x200,
    UPM_SELECTIONFADE = 0x400,
    UPM_TOOLTIPANIMATION = 0x800,
    UPM_TOOLTIPFADE = 0x1000,
    UPM_CURSORSHADOW = 0x2000,
    UPM_CLICKLOCK = 0x8000,
    // room for more
    UPM_UIEFFECTS = 0x80000000,
    UPM_DEFAULT = 0x80003E9E
} USERPREFMASKS;


//static const WCHAR* KEY_MDALIGN = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows";
//static const WCHAR* VAL_MDALIGN = L"MenuDropAlignment";

static const WCHAR* KEY_METRIC = L"Control Panel\\Desktop\\WindowMetrics";
//static const WCHAR* VAL_BORDER = L"BorderWidth";
//static const WCHAR* VAL_ICONSPC = L"IconSpacing";
//static const WCHAR* VAL_ICONVSPC = L"IconVerticalspacing";
//static const WCHAR* VAL_ITWRAP = L"IconTitleWrap";

static const WCHAR* KEY_SOUND = L"Control Panel\\Sound";
static const WCHAR* VAL_BEEP = L"Beep";

//static const WCHAR* KEY_KBD = L"Control Panel\\Keyboard";
//static const WCHAR* VAL_KBDSPD = L"KeyboardSpeed";
//static const WCHAR* VAL_KBDDELAY = L"KeyboardDelay";

//static const WCHAR* KEY_SHOWSNDS = L"Control Panel\\Accessibility\\ShowSounds";
//static const WCHAR* KEY_KDBPREF = L"Control Panel\\Accessibility\\Keyboard Preference";
//static const WCHAR* KEY_SCRREAD = L"Control Panel\\Accessibility\\Blind Access";
//static const WCHAR* VAL_ON = L"On";

LONG
QueryUserRegValueW(PCWSTR pszSubKey, PCWSTR pszValueName, PVOID pData, LPDWORD cbSize, LPDWORD pType)
{
	HKEY hKey;
	LONG ret;

	RegOpenKeyExW(HKEY_CURRENT_USER, pszSubKey, 0, KEY_QUERY_VALUE, &hKey);
	ret = RegQueryValueExW(hKey, pszValueName, NULL, pType, (LPBYTE)pData, cbSize);
	RegCloseKey(hKey);
	return ret;
}


HWND
CreateTestWindow()
{
	WNDCLASSA wc;

	wc.style = 0;
	wc.lpfnWndProc = DefWindowProcA;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = g_hInstance;
	wc.hIcon = NULL;
	wc.hCursor = NULL;
	wc.hbrBackground = NULL;
	wc.lpszMenuName = NULL;
	wc.lpszClassName = "testclass";

	RegisterClassA(&wc);
	return CreateWindowA("testclass",
	                     "testwnd",
	                     WS_VISIBLE,
	                     0,
	                     0,
	                     50,
	                     30,
	                     NULL,
	                     NULL,
	                     g_hInstance,
	                     0);
}

void
Test_NtUserSystemParametersInfo_Params(PTESTINFO pti)
{
//	UINT uint;
	DWORD data[1000];
	UINT i, uint;
	ACCESSTIMEOUT ato;
	/* Test normal */
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(SPI_GETFOCUSBORDERHEIGHT, 0, &uint, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);

	/* Test invalid SPI code */
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(7, 0, &data, 0) == FALSE);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* Test wrong cbSize member */
	ato.cbSize = 1;
	SetLastError(0xdeadbeef);
	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 0, &ato, 0) == FALSE);
	TEST(GetLastError() == 0xdeadbeef);
#if 0
	/* Test undocumented, but valid SPI codes */
	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(0x1010, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] <= 1);
	TEST(data[1] == 0xdeadbeef);

	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(0x1011, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] == 0xbeefdead);
	TEST(data[1] == 0xbeefdead);
	data[0] = 0;
	NtUserSystemParametersInfo(0x1010, 0, &data, 0);
	TEST(data[0] == 1);

	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(0x1028, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] != 0xdeadbeef);
	TEST(data[1] == 0xdeadbeef);

	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(0x1029, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] == 0xbeefdead);
	TEST(data[1] == 0xbeefdead);

	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(0x102A, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] != 0xdeadbeef);
	TEST(data[1] == 0xdeadbeef);

	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4139, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] == 0xbeefdead);
	TEST(data[1] == 0xbeefdead);

	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4140, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] != 0xdeadbeef);
	TEST(data[1] == 0xdeadbeef);

	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4141, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] == 0xbeefdead);
	TEST(data[1] == 0xbeefdead);

	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4142, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] != 0xdeadbeef);
	TEST(data[1] == 0xdeadbeef);

	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4143, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] == 0xbeefdead);
	TEST(data[1] == 0xbeefdead);

	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4144, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] != 0xdeadbeef);
	TEST(data[1] == 0xdeadbeef);

	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4145, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] == 0xbeefdead);
	TEST(data[1] == 0xbeefdead);

	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4146, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] != 0xdeadbeef);
	TEST(data[1] == 0xdeadbeef);

	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4147, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] == 0xbeefdead);
	TEST(data[1] == 0xbeefdead);

	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4148, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] != 0xdeadbeef);
	TEST(data[1] == 0xdeadbeef);

	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4149, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] == 0xbeefdead);
	TEST(data[1] == 0xbeefdead);

	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4150, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] != 0xdeadbeef);
	TEST(data[1] == 0xdeadbeef);

	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4151, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] == 0xbeefdead);
	TEST(data[1] == 0xbeefdead);

	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4152, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] != 0xdeadbeef);
	TEST(data[1] == 0xdeadbeef);

	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4153, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] == 0xbeefdead);
	TEST(data[1] == 0xbeefdead);

	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4154, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] != 0xdeadbeef);
	TEST(data[1] == 0xdeadbeef);

	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4155, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] == 0xbeefdead);
	TEST(data[1] == 0xbeefdead);

	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4156, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] != 0xdeadbeef);
	TEST(data[1] == 0xdeadbeef);

	for(i = 0; i < 1000; i++) data[i] = 0xbeefdead;
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(4157, 0, &data, 0) == TRUE);
	TEST(GetLastError() == ERROR_SUCCESS);
	TEST(data[0] == 0xbeefdead);
	TEST(data[1] == 0xbeefdead);
#endif
	/* Test invalid pointer */
	SetLastError(ERROR_SUCCESS);
	TEST(NtUserSystemParametersInfo(SPI_GETFOCUSBORDERHEIGHT, 0, (PVOID)0x80000000, 0) == FALSE);
	TEST(GetLastError() == ERROR_NOACCESS);
	for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef;

	/* test wrong bools */
}

void
Test_NtUserSystemParametersInfo_Winsta(PTESTINFO pti)
{
    HWINSTA hwinsta, hwinstaOld;
    INT ai[20];
    BOOL bRet;
//    INT i;

    hwinstaOld = GetProcessWindowStation();
    hwinsta = CreateWindowStation(NULL, 0, READ_CONTROL, NULL);
    SetProcessWindowStation(hwinsta);
    printf("hwinstaOld=%p, hwinsta=%p\n", hwinstaOld, hwinsta);

#if 1 // currently Winsta stuff is broken in ros
    TEST(SystemParametersInfoA(SPI_GETBEEP, 0, ai, 0) == 0);
    TEST(GetLastError() == ERROR_ACCESS_DENIED);
    TEST(SystemParametersInfoA(SPI_SETBEEP, 0, ai, 0) == 0);
    TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
    TEST(SystemParametersInfoA(SPI_GETMOUSE, 0, ai, 0) == 0);
    TEST(GetLastError() == ERROR_ACCESS_DENIED);
    TEST(SystemParametersInfoA(SPI_SETMOUSE, 0, ai, 0) == 0);
    TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
    TEST(SystemParametersInfoA(SPI_GETBORDER, 0, ai, 0) == 0);
    TEST(GetLastError() == ERROR_ACCESS_DENIED);
    TEST(SystemParametersInfoA(SPI_SETBORDER, 0, ai, 0) == 0);
    TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
    TEST(SystemParametersInfoA(SPI_GETKEYBOARDSPEED, 0, ai, 0) == 0);
    TEST(GetLastError() == ERROR_ACCESS_DENIED);
    TEST(SystemParametersInfoA(SPI_SETKEYBOARDSPEED, 0, ai, 0) == 0);
    TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
    TEST(SystemParametersInfoA(SPI_ICONHORIZONTALSPACING, 0, ai, 0) == 0);
    TEST(GetLastError() == ERROR_ACCESS_DENIED);
    TEST(SystemParametersInfoA(SPI_ICONHORIZONTALSPACING, 32, 0, 0) == 0);
    TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
    TEST(SystemParametersInfoA(SPI_GETSCREENSAVETIMEOUT, 0, ai, 0) == 0);
    TEST(GetLastError() == ERROR_ACCESS_DENIED);
    TEST(SystemParametersInfoA(SPI_SETSCREENSAVETIMEOUT, 0, ai, 0) == 0);
    TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
    TEST(SystemParametersInfoA(SPI_GETKEYBOARDCUES, 0, &bRet, 0) == 0);
    TEST(GetLastError() == ERROR_ACCESS_DENIED);
    TEST(SystemParametersInfoA(SPI_SETKEYBOARDCUES, 0, (PVOID)1, 0) == 0);
    TEST(GetLastError() == ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION);
#endif

    SetProcessWindowStation(hwinstaOld);
}

void
Test_NtUserSystemParametersInfo_fWinIni(PTESTINFO pti)
{
	ACCESSTIMEOUT ato;
//	UINT uFocusBorderHeight;
	WCHAR Buffer[6];
	DWORD cbSize;

	ato.cbSize = sizeof(ato);
	NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 0, &ato, 0);
	ato.iTimeOutMSec++;
	NtUserSystemParametersInfo(SPI_SETACCESSTIMEOUT, 0, &ato, 0);
	ato.iTimeOutMSec--;

//	NtUserSystemParametersInfo(SPI_GETFOCUSBORDERHEIGHT, 0, &uFocusBorderHeight, 0);
//	NtUserSystemParametersInfo(SPI_SETFOCUSBORDERHEIGHT, 0, &uFocusBorderHeight, SPIF_UPDATEINIFILE);

	NtUserSystemParametersInfo(SPI_SETACCESSTIMEOUT, 0, &ato, 0);

	cbSize = 6;
	QueryUserRegValueW(L"Control Panel\\Accessibility\\TimeOut", L"TimeToWait", &Buffer, &cbSize, NULL);

}

void
Test_MetricKey(PTESTINFO pti, PCWSTR pwszVal, INT iVal)
{
	WCHAR szReg[10];
	DWORD cbSize;

	cbSize = sizeof(szReg);
	TESTX(QueryUserRegValueW(KEY_METRIC, pwszVal, &szReg, &cbSize, NULL) == ERROR_SUCCESS, "Value=%S\n", pwszVal);
	TESTX(_wcsicmp(szReg, L"1") == 0, "Value=%S\n", pwszVal);

}

INT
Test_UserPref(PTESTINFO pti, UINT uiGet, UINT uiSet, DWORD dwPrefMask)
{
	BOOL bOrig, bTemp = 0;
	DWORD dwUserPref, dwUserPrefOrg;
	DWORD cbSize;

	/* Get original values */
	NtUserSystemParametersInfo(uiGet, 0, &bOrig, 0);
	cbSize = sizeof(dwUserPrefOrg);
	QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPrefOrg, &cbSize, NULL);

	/* Value 0 */
	NtUserSystemParametersInfo(uiSet, 0, NULL, SPIF_UPDATEINIFILE);
	NtUserSystemParametersInfo(uiGet, 0, &bTemp, 0);
	TEST(bTemp == 0);
	cbSize = sizeof(dwUserPref);
	TEST(QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPref, &cbSize, NULL) == ERROR_SUCCESS);
	TEST((dwUserPref & dwPrefMask) == 0);
	TEST((dwUserPref & (~dwPrefMask)) == (dwUserPrefOrg & (~dwPrefMask)));

	/* Value 1 without Registry */
	NtUserSystemParametersInfo(uiSet, 0, (PVOID)1, 0);
	NtUserSystemParametersInfo(uiGet, 0, &bTemp, 0);
	TEST(bTemp == 1);
	cbSize = sizeof(dwUserPref);
	TEST(QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPref, &cbSize, NULL) == ERROR_SUCCESS);
	TEST((dwUserPref & dwPrefMask) == 0);
	TEST((dwUserPref & (~dwPrefMask)) == (dwUserPrefOrg & (~dwPrefMask)));

	/* Value 2 without Registry */
	NtUserSystemParametersInfo(uiSet, 0, (PVOID)2, 0);
	NtUserSystemParametersInfo(uiGet, 0, &bTemp, 0);
	TEST(bTemp == 1);
	cbSize = sizeof(dwUserPref);
	TEST(QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPref, &cbSize, NULL) == ERROR_SUCCESS);
	TEST((dwUserPref & dwPrefMask) == 0);
	TEST((dwUserPref & (~dwPrefMask)) == (dwUserPrefOrg & (~dwPrefMask)));

	/* Value 1 with Registry */
	NtUserSystemParametersInfo(uiSet, 0, (PVOID)1, SPIF_UPDATEINIFILE);
	NtUserSystemParametersInfo(uiGet, 0, &bTemp, 0);
	TEST(bTemp == 1);
	cbSize = sizeof(dwUserPref);
	TEST(QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPref, &cbSize, NULL) == ERROR_SUCCESS);
	TEST((dwUserPref & dwPrefMask) == dwPrefMask);
	TEST((dwUserPref & (~dwPrefMask)) == (dwUserPrefOrg & (~dwPrefMask)));

	/* Restore original value */
	NtUserSystemParametersInfo(uiSet, 0, (PVOID)bOrig, SPIF_UPDATEINIFILE);

    return APISTATUS_NORMAL;
}


/******************************************************************************/

void
Test_SPI_SETBEEP(PTESTINFO pti)
{
	BOOL bOrig, bTemp = 0;
	WCHAR szReg[10];
	DWORD cbSize;

	/* Get original value */
	NtUserSystemParametersInfo(SPI_GETBEEP, 0, &bOrig, 0);

	/* Value 0 */
	NtUserSystemParametersInfo(SPI_SETBEEP, 0, NULL, SPIF_UPDATEINIFILE);
	NtUserSystemParametersInfo(SPI_GETBEEP, 0, &bTemp, 0);
	TEST(bTemp == 0);
	cbSize = sizeof(szReg);
	TEST(QueryUserRegValueW(KEY_SOUND, VAL_BEEP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
	TEST(_wcsicmp(szReg, L"No") == 0);

	/* Value 1 */
	NtUserSystemParametersInfo(SPI_SETBEEP, 1, NULL, SPIF_UPDATEINIFILE);
	NtUserSystemParametersInfo(SPI_GETBEEP, 0, &bTemp, 0);
	TEST(bTemp == 1);
	cbSize = sizeof(szReg);
	TEST(QueryUserRegValueW(KEY_SOUND, VAL_BEEP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
	TEST(_wcsicmp(szReg, L"Yes") == 0);

	/* Value 2 */
	NtUserSystemParametersInfo(SPI_SETBEEP, 2, NULL, SPIF_UPDATEINIFILE);
	NtUserSystemParametersInfo(SPI_GETBEEP, 0, &bTemp, 0);
	TEST(bTemp == 1);
	cbSize = sizeof(szReg);
	TEST(QueryUserRegValueW(KEY_SOUND, VAL_BEEP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
	TEST(_wcsicmp(szReg, L"Yes") == 0);

	/* Restore original value */
	NtUserSystemParametersInfo(SPI_SETBEEP, 0, &bOrig, SPIF_UPDATEINIFILE);
}

void
Test_SPI_SETMOUSE(PTESTINFO pti)
{
	INT aiOrig[3], aiTemp[3];

	/* Get original value */
	NtUserSystemParametersInfo(SPI_GETMOUSE, 0, aiOrig, 0);

	/* Test uiParam value */
	TEST(NtUserSystemParametersInfo(SPI_GETMOUSE, 0, aiTemp, 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_GETMOUSE, 1, aiTemp, 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_GETMOUSE, -1, aiTemp, 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_GETMOUSE, 0xdeadbeef, aiTemp, 0) == 1);

    /* Set modified values */
    aiTemp[0] = aiOrig[0] + 1;
    aiTemp[1] = aiOrig[1] - 1;
    aiTemp[2] = aiOrig[2] + 2;
	NtUserSystemParametersInfo(SPI_SETMOUSE, 2, aiTemp, SPIF_UPDATEINIFILE);
    aiTemp[0] = aiTemp[1] = aiTemp[2] = 0;

    /* Get new values */
	NtUserSystemParametersInfo(SPI_GETMOUSE, 0, aiTemp, 0);

    /* Test modified values */
    TEST(aiTemp[0] == aiOrig[0] + 1);
    TEST(aiTemp[1] == aiOrig[1] - 1);
    TEST(aiTemp[2] == aiOrig[2] + 2);

    // FIXME: Test registry values

	/* Restore original value */
	NtUserSystemParametersInfo(SPI_SETMOUSE, 0, aiOrig, SPIF_UPDATEINIFILE);
}

void
Test_SPI_SETBORDER(PTESTINFO pti)
{
	INT iOrig, iTemp = 0;

	/* Get original value */
	NtUserSystemParametersInfo(SPI_GETBORDER, 0, &iOrig, 0);

	/* Value 0 */
	NtUserSystemParametersInfo(SPI_SETBORDER, 0, NULL, SPIF_UPDATEINIFILE);
	NtUserSystemParametersInfo(SPI_GETBORDER, 0, &iTemp, 0);
	TEST(iTemp == 1);
	TEST(GetSystemMetrics(SM_CXBORDER) == 1);

	/* Value 1 */
	NtUserSystemParametersInfo(SPI_SETBORDER, 1, NULL, SPIF_UPDATEINIFILE);
	NtUserSystemParametersInfo(SPI_GETBORDER, 0, &iTemp, 0);
	TEST(iTemp == 1);
//	Test_MetricKey(pti, VAL_BORDER, 1);

	/* Value 2 */
	NtUserSystemParametersInfo(SPI_SETBORDER, 2, NULL, SPIF_UPDATEINIFILE);
	NtUserSystemParametersInfo(SPI_GETBORDER, 0, &iTemp, 0);
	TEST(iTemp == 2);
	TEST(GetSystemMetrics(SM_CXBORDER) == 1);

	/* Restore original value */
	NtUserSystemParametersInfo(SPI_SETBORDER, iOrig, NULL, SPIF_UPDATEINIFILE);

}

//	Test_SPI_SETKEYBOARDSPEED(pti);
//	Test_SPI_LANGDRIVER(pti);
//	Test_SPI_ICONHORIZONTALSPACING(pti);
//	Test_SPI_SETSCREENSAVETIMEOUT(pti);
//	Test_SPI_SETSCREENSAVEACTIVE(pti);
//	Test_SPI_SETGRIDGRANULARITY(pti);

void
Test_SPI_SETDESKWALLPAPER(PTESTINFO pti)
{
    UNICODE_STRING ustrOld, ustrNew;
    WCHAR szOld[MAX_PATH];
    WCHAR szNew[MAX_PATH];

	/* Get old Wallpaper */
	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, szOld, 0) == 1);
    RtlInitUnicodeString(&ustrOld, szOld);

	/* Set no Wallpaper */
	TEST(NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, L"", 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, szNew, 0) == 1);
	TEST(szNew[0] == 0);

    /* Set no Wallpaper 2 */
    RtlInitUnicodeString(&ustrNew, L"");
	TEST(NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &ustrNew, 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, szNew, 0) == 1);
	TEST(szNew[0] == 0);

    /* Reset Wallpaper */
	TEST(NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, NULL, 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, szNew, 0) == 1);
	TEST(wcscmp(szNew, szOld) == 0);

    /* Set new Wallpaper */
    RtlInitUnicodeString(&ustrNew, L"test.bmp");
	TEST(NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &ustrNew, 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, szNew, 0) == 1);
	TEST(wcscmp(szNew, L"test.bmp") == 0);

	/* Get Wallpaper, too small buffer  */
	szNew[0] = 0; szNew[1] = 0; szNew[2] = 0;
	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, 3, szNew, 0) == 1);
    TEST(szNew[0] != 0);
    TEST(szNew[1] != 0);
    TEST(szNew[2] != 0);

    /* Set invalid Wallpaper */
    SetLastError(0xdeadbeef);
    RtlInitUnicodeString(&ustrNew, L"*#!!-&");
	TEST(NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &ustrNew, 0) == 0);
	TEST(GetLastError() == ERROR_FILE_NOT_FOUND);
	TEST(NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, szNew, 0) == 1);
	TEST(wcscmp(szNew, L"*#!!-&") == 0);

	/* Restore old Wallpaper */
	TEST(NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, MAX_PATH, &ustrOld, SPIF_UPDATEINIFILE) == 1);

}

//	Test_SPI_SETDESKPATTERN(pti);
//	Test_SPI_SETKEYBOARDDELAY(pti);
//	Test_SPI_ICONVERTICALSPACING(pti);
//	Test_SPI_SETICONTITLEWRAP(pti);
//	Test_SPI_SETMENUDROPALIGNMENT(pti);
//	Test_SPI_SETDOUBLECLKWIDTH(pti);
//	Test_SPI_SETDOUBLECLKHEIGHT(pti);
//	Test_SPI_SETDOUBLECLICKTIME(pti);

INT
Test_SPI_SETMOUSEBUTTONSWAP(PTESTINFO pti)
{
	BOOL bOrig, bTemp = 0;
	WCHAR szReg[10];
	DWORD cbSize;

	/* Get original value */
	bOrig = GetSystemMetrics(SM_SWAPBUTTON);

	/* Value 0 */
	NtUserSystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 0, NULL, SPIF_UPDATEINIFILE);
	bTemp = GetSystemMetrics(SM_SWAPBUTTON);
	TEST(bTemp == 0);
	cbSize = sizeof(szReg);
	TEST(QueryUserRegValueW(KEY_MOUSE, VAL_SWAP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
	TEST(_wcsicmp(szReg, L"0") == 0);

	/* Value 1 */
	NtUserSystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 1, NULL, SPIF_UPDATEINIFILE);
	bTemp = GetSystemMetrics(SM_SWAPBUTTON);
	TEST(bTemp == 1);
	cbSize = sizeof(szReg);
	TEST(QueryUserRegValueW(KEY_MOUSE, VAL_SWAP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
	TEST(_wcsicmp(szReg, L"1") == 0);

	/* Value 2 */
	NtUserSystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 2, NULL, SPIF_UPDATEINIFILE);
	bTemp = GetSystemMetrics(SM_SWAPBUTTON);
	TEST(bTemp == 1);
	cbSize = sizeof(szReg);
	TEST(QueryUserRegValueW(KEY_MOUSE, VAL_SWAP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
	TEST(_wcsicmp(szReg, L"2") == 0);

	/* Value -1 */
	NtUserSystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, -1, NULL, SPIF_UPDATEINIFILE);
	bTemp = GetSystemMetrics(SM_SWAPBUTTON);
	TEST(bTemp == 1);
	cbSize = sizeof(szReg);
	TEST(QueryUserRegValueW(KEY_MOUSE, VAL_SWAP, &szReg, &cbSize, NULL) == ERROR_SUCCESS);
	TEST(_wcsicmp(szReg, L"-1") == 0);

	/* Restore original value */
	NtUserSystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, bOrig, 0, SPIF_UPDATEINIFILE);

    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETICONTITLELOGFONT(PTESTINFO pti)
{
    LOGFONTW lfOrig;
    struct
    {
        LOGFONTW lf;
        DWORD dwRedzone;
    } buf;

	/* Get original value */
	ASSERT(NtUserSystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(lfOrig), &lfOrig, 0));

    /* Test uiParam == 0 */
    memset(&buf, 0, sizeof(buf));
    buf.lf.lfFaceName[LF_FACESIZE-1] = 33;
    buf.dwRedzone = 0xdeadbeef;
	TEST(NtUserSystemParametersInfo(SPI_GETICONTITLELOGFONT, 0, &buf.lf, 0) == 1);
    TEST(buf.lf.lfHeight != 0);
    TEST(buf.lf.lfWeight != 0);
    TEST(buf.lf.lfFaceName[0] != 0);
    TEST(buf.lf.lfFaceName[LF_FACESIZE-1] == 0);
    TEST(buf.dwRedzone == 0xdeadbeef);

    /* Test uiParam < sizeof(LOGFONTW) */
    memset(&buf, 0, sizeof(buf));
    buf.lf.lfFaceName[LF_FACESIZE-1] = 33;
    buf.dwRedzone = 0xdeadbeef;
	TEST(NtUserSystemParametersInfo(SPI_GETICONTITLELOGFONT, 8, &buf.lf, 0) == 1);
    TEST(buf.lf.lfHeight != 0);
    TEST(buf.lf.lfWeight != 0);
    TEST(buf.lf.lfFaceName[0] != 0);
    TEST(buf.lf.lfFaceName[LF_FACESIZE-1] == 0);
    TEST(buf.dwRedzone == 0xdeadbeef);

    /* Test uiParam < 0 */
	TEST(NtUserSystemParametersInfo(SPI_GETICONTITLELOGFONT, -1, &buf.lf, 0) == 1);

    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETFASTTASKSWITCH(PTESTINFO pti)
{
    char buf[10];
	TEST(NtUserSystemParametersInfo(SPI_SETFASTTASKSWITCH, 0, 0, 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_SETFASTTASKSWITCH, 0, buf, 0) == 1);

    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETDRAGFULLWINDOWS(PTESTINFO pti)
{
    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETNONCLIENTMETRICS(PTESTINFO pti)
{
    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETMINIMIZEDMETRICS(PTESTINFO pti)
{
    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETICONMETRICS(PTESTINFO pti)
{
    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETWORKAREA(PTESTINFO pti)
{
    RECT rcOrig, rc;

    /* Get the original value */
	ASSERT(NtUserSystemParametersInfo(SPI_GETWORKAREA, 0, &rcOrig, 0) == 1);

    /* Change value */
    rc = rcOrig;
    rc.left += 1;
    rc.top += 2;
    rc.right -= 3;
    rc.bottom -= 2;
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 1, &rc, 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, sizeof(RECT), &rc, 0) == 1);

	TEST(NtUserSystemParametersInfo(SPI_GETWORKAREA, 1, &rc, 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_GETWORKAREA, -1, &rc, 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_GETWORKAREA, 0xdeadbeef, &rc, 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_GETWORKAREA, 0, (PVOID)0xdeadbeef, 0) == 0);

    /* Test values */
    rc = rcOrig; rc.left = -1;
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
    rc = rcOrig; rc.top = -1;
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
    rc = rcOrig; rc.top = 10; rc.bottom = 11;
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 1);
    rc = rcOrig; rc.top = 10; rc.bottom = 10;
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
    rc = rcOrig; rc.top = 10; rc.bottom = 9;
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
    rc = rcOrig; rc.left = 10; rc.right = 11;
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 1);
    rc = rcOrig; rc.left = 10; rc.right = 10;
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
    rc = rcOrig; rc.left = 10; rc.right = 9;
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
    rc = rcOrig; rc.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN);
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 1);
    rc = rcOrig; rc.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN)+1;
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);
    rc = rcOrig; rc.right = GetSystemMetrics(SM_CXVIRTUALSCREEN);
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 1);
    rc = rcOrig; rc.right = GetSystemMetrics(SM_CXVIRTUALSCREEN)+1;
	TEST(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rc, 0) == 0);

    /* Restore original value */
	ASSERT(NtUserSystemParametersInfo(SPI_SETWORKAREA, 0, &rcOrig, 0) == 1);

    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETPENWINDOWS(PTESTINFO pti)
{
    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETFILTERKEYS(PTESTINFO pti)
{
    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETTOGGLEKEYS(PTESTINFO pti)
{
    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETMOUSEKEYS(PTESTINFO pti)
{
    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETSHOWSOUNDS(PTESTINFO pti)
{
    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETSTICKYKEYS(PTESTINFO pti)
{
	STICKYKEYS skOrig, sk;

    /* Get original values */
	skOrig.cbSize = sizeof(STICKYKEYS);
	ASSERT(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, 0, &skOrig, 0) == 1);

	sk.cbSize = sizeof(STICKYKEYS)+1;
	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, 0, &sk, 0) == 0);

	sk.cbSize = sizeof(STICKYKEYS)-1;
	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, 0, &sk, 0) == 0);

	sk.cbSize = sizeof(STICKYKEYS);
	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, 1, &sk, 0) == 0);
	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, -1, &sk, 0) == 0);
	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, sk.cbSize, &sk, 0) == 1);
	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, sk.cbSize-1, &sk, 0) == 0);
	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, sk.cbSize+1, &sk, 0) == 0);

    sk = skOrig;
    sk.dwFlags = (skOrig.dwFlags ^ 1);
	TEST(NtUserSystemParametersInfo(SPI_SETSTICKYKEYS, sk.cbSize+1, &sk, 0) == 0);
	TEST(NtUserSystemParametersInfo(SPI_SETSTICKYKEYS, sk.cbSize-1, &sk, 0) == 0);
	TEST(NtUserSystemParametersInfo(SPI_SETSTICKYKEYS, sk.cbSize, &sk, 0) == 1);

    sk = skOrig;
	TEST(NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, 0, &sk, 0) == 1);
    TEST(sk.dwFlags == (skOrig.dwFlags ^ 1));

    /* Restore original values */
	skOrig.cbSize = sizeof(STICKYKEYS);
	ASSERT(NtUserSystemParametersInfo(SPI_SETSTICKYKEYS, 0, &skOrig, 0) == 1);

	return APISTATUS_NORMAL;
}

INT
Test_SPI_SETACCESSTIMEOUT(PTESTINFO pti)
{
    ACCESSTIMEOUT atoOrig, atoTmp;

    /* Get original values */
    atoOrig.cbSize = sizeof(ACCESSTIMEOUT);
	ASSERT(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 0, &atoOrig, 0) == 1);

    atoTmp.cbSize = sizeof(ACCESSTIMEOUT) - 1;
	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 0, &atoTmp, 0) == 0);
    atoTmp.cbSize = sizeof(ACCESSTIMEOUT) + 1;
	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 0, &atoTmp, 0) == 0);
    atoTmp.cbSize = sizeof(ACCESSTIMEOUT);
	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 0, &atoTmp, 0) == 1);
    atoTmp.cbSize = sizeof(ACCESSTIMEOUT);
	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 1, &atoTmp, 0) == 0);
    atoTmp.cbSize = sizeof(ACCESSTIMEOUT);
	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, -1, &atoTmp, 0) == 0);
    atoTmp.cbSize = sizeof(ACCESSTIMEOUT);
	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, sizeof(ACCESSTIMEOUT), &atoTmp, 0) == 1);
    atoTmp.cbSize = sizeof(ACCESSTIMEOUT);
	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, sizeof(ACCESSTIMEOUT)-1, &atoTmp, 0) == 0);
    atoTmp.cbSize = sizeof(ACCESSTIMEOUT);
	TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, sizeof(ACCESSTIMEOUT)+1, &atoTmp, 0) == 0);

    /* Restore original values */
	ASSERT(NtUserSystemParametersInfo(SPI_SETACCESSTIMEOUT, sizeof(atoOrig), &atoOrig, 0) == 1);

    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETSERIALKEYS(PTESTINFO pti)
{
    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETSOUNDSENTRY(PTESTINFO pti)
{
    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETHIGHCONTRAST(PTESTINFO pti)
{
    return APISTATUS_NORMAL;
}

INT
Test_SPI_SETKEYBOARDPREF(PTESTINFO pti)
{
    return APISTATUS_NORMAL;
}

//	Test_SPI_SETSCREENREADER(pti);
///	Test_SPI_SETANIMATION(pti);
//	Test_SPI_SETFONTSMOOTHING(pti);
//	Test_SPI_SETDRAGWIDTH(pti);
//	Test_SPI_SETDRAGHEIGHT(pti);
//	Test_SPI_SETHANDHELD(pti);
//	Test_SPI_SETLOWPOWERTIMEOUT(pti);
//	Test_SPI_SETPOWEROFFTIMEOUT(pti);
//	Test_SPI_SETLOWPOWERACTIVE(pti);
//	Test_SPI_SETPOWEROFFACTIVE(pti);
//	Test_SPI_SETCURSORS(pti);
//	Test_SPI_SETICONS(pti);
//	Test_SPI_SETDEFAULTINPUTLANG(pti);
//	Test_SPI_SETLANGTOGGLE(pti);
//	Test_SPI_GETWINDOWSEXTENSION(pti);
//	Test_SPI_SETMOUSETRAILS(pti);
//	Test_SPI_SETSNAPTODEFBUTTON(pti);
//	Test_SPI_GETSCREENSAVERRUNNING(pti);
//	Test_SPI_SETMOUSEHOVERWIDTH(pti);
//	Test_SPI_SETMOUSEHOVERHEIGHT(pti);
//	Test_SPI_SETMOUSEHOVERTIME(pti);
//	Test_SPI_SETWHEELSCROLLLINES(pti);
//	Test_SPI_SETMENUSHOWDELAY(pti);
//	Test_SPI_SETWHEELSCROLLCHARS(pti);
//	Test_SPI_SETSHOWIMEUI(pti);
//	Test_SPI_SETMOUSESPEED(pti);
//	Test_SPI_GETSCREENSAVERRUNNING(pti);
//	Test_SPI_SETAUDIODESCRIPTION(pti);
//	Test_SPI_SETSCREENSAVESECURE(pti);
//	Test_SPI_SETACTIVEWINDOWTRACKING(pti);

INT
Test_SPI_SETMENUANIMATION(PTESTINFO pti)
{
	BOOL bOrig, bTemp = 0;
	DWORD dwUserPrefMask;
	DWORD cbSize;

	/* Get original values */
	NtUserSystemParametersInfo(SPI_GETMENUANIMATION, 0, &bOrig, 0);

	/* Value 0 */
	NtUserSystemParametersInfo(SPI_SETMENUANIMATION, 0, NULL, SPIF_UPDATEINIFILE);
	NtUserSystemParametersInfo(SPI_GETMENUANIMATION, 0, &bTemp, 0);
	TEST(bTemp == 0);
	cbSize = sizeof(dwUserPrefMask);
	TEST(QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPrefMask, &cbSize, NULL) == ERROR_SUCCESS);
	TEST((dwUserPrefMask & UPM_MENUANIMATION) == 0);

	/* Value 1 */
	NtUserSystemParametersInfo(SPI_SETMENUANIMATION, 0, (PVOID)1, SPIF_UPDATEINIFILE);
	NtUserSystemParametersInfo(SPI_GETMENUANIMATION, 0, &bTemp, 0);
	TEST(bTemp == 1);
	cbSize = sizeof(dwUserPrefMask);
	TEST(QueryUserRegValueW(KEY_DESKTOP, VAL_PREFMASK, &dwUserPrefMask, &cbSize, NULL) == ERROR_SUCCESS);
	TEST((dwUserPrefMask & UPM_MENUANIMATION) != 0);


	/* Restore original values */
	NtUserSystemParametersInfo(SPI_SETMENUANIMATION, 0, (PVOID)bOrig, SPIF_UPDATEINIFILE);

    return APISTATUS_NORMAL;
}

//	Test_SPI_SETCOMBOBOXANIMATION(pti);
//	Test_SPI_SETLISTBOXSMOOTHSCROLLING(pti);
//	Test_SPI_SETGRADIENTCAPTIONS(pti);

INT
Test_SPI_SETKEYBOARDCUES(PTESTINFO pti)
{
    return Test_UserPref(pti, SPI_GETKEYBOARDCUES, SPI_SETKEYBOARDCUES, UPM_KEYBOARDCUES);
}

//	Test_SPI_SETACTIVEWNDTRKZORDER(pti);
//	Test_SPI_SETHOTTRACKING(pti);
//	Test_SPI_SETMENUFADE(pti);
//	Test_SPI_SETSELECTIONFADE(pti);
//	Test_SPI_SETTOOLTIPANIMATION(pti);
//	Test_SPI_SETTOOLTIPFADE(pti);
//	Test_SPI_SETCURSORSHADOW(pti);
//	Test_SPI_SETMOUSESONAR(pti);

INT
Test_SPI_SETMOUSECLICKLOCK(PTESTINFO pti)
{
    return Test_UserPref(pti, SPI_GETMOUSECLICKLOCK, SPI_SETMOUSECLICKLOCK, UPM_CLICKLOCK);
}

//	Test_SPI_SETMOUSEVANISH(pti);
//	Test_SPI_SETFLATMENU(pti);
//	Test_SPI_SETDROPSHADOW(pti);
//	Test_SPI_SETBLOCKSENDINPUTRESETS(pti);
//	Test_SPI_GETSETUIEFFECTS(pti);
//	Test_SPI_SETDISABLEOVERLAPPEDCONTENT(pti);
//	Test_SPI_SETCLIENTAREAANIMATION(pti);
//	Test_SPI_SETCLEARTYPE(pti);
//	Test_SPI_SETSPEECHRECOGNITION(pti);
//	Test_SPI_SETFOREGROUNDLOCKTIMEOUT(pti);
//	Test_SPI_SETACTIVEWNDTRKTIMEOUT(pti);
//	Test_SPI_SETFOREGROUNDFLASHCOUNT(pti);
//	Test_SPI_SETCARETWIDTH(pti);
//	Test_SPI_SETMOUSECLICKLOCKTIME(pti);
//	Test_SPI_SETFONTSMOOTHINGTYPE(pti);
//	Test_SPI_SETFONTSMOOTHINGCONTRAST(pti);
//	Test_SPI_SETFOCUSBORDERWIDTH(pti);
//	Test_SPI_SETFOCUSBORDERHEIGHT(pti);
//	Test_SPI_SETFONTSMOOTHINGORIENTATION(pti);


INT
Test_NtUserSystemParametersInfo(PTESTINFO pti)
{
	HWND hWnd;

	hWnd = CreateTestWindow();
	ASSERT(hWnd);

	Test_NtUserSystemParametersInfo_Params(pti);
	Test_NtUserSystemParametersInfo_fWinIni(pti);
    Test_NtUserSystemParametersInfo_Winsta(pti);

	Test_SPI_SETBEEP(pti);
    Test_SPI_SETMOUSE(pti);
    Test_SPI_SETBORDER(pti);
//	Test_SPI_SETKEYBOARDSPEED(pti);
//	Test_SPI_LANGDRIVER(pti);
//	Test_SPI_ICONHORIZONTALSPACING(pti);
//	Test_SPI_SETSCREENSAVETIMEOUT(pti);
//	Test_SPI_SETSCREENSAVEACTIVE(pti);
//	Test_SPI_SETGRIDGRANULARITY(pti);
	Test_SPI_SETDESKWALLPAPER(pti);
//	Test_SPI_SETDESKPATTERN(pti);
//	Test_SPI_SETKEYBOARDDELAY(pti);
//	Test_SPI_ICONVERTICALSPACING(pti);
//	Test_SPI_SETICONTITLEWRAP(pti);
//	Test_SPI_SETMENUDROPALIGNMENT(pti);
//	Test_SPI_SETDOUBLECLKWIDTH(pti);
//	Test_SPI_SETDOUBLECLKHEIGHT(pti);
//	Test_SPI_SETDOUBLECLICKTIME(pti);
	Test_SPI_SETMOUSEBUTTONSWAP(pti);
	Test_SPI_SETICONTITLELOGFONT(pti);
	Test_SPI_SETFASTTASKSWITCH(pti);
	Test_SPI_SETDRAGFULLWINDOWS(pti);
	Test_SPI_SETNONCLIENTMETRICS(pti);
	Test_SPI_SETMINIMIZEDMETRICS(pti);
	Test_SPI_SETICONMETRICS(pti);
	Test_SPI_SETWORKAREA(pti);
	Test_SPI_SETPENWINDOWS(pti);
	Test_SPI_SETFILTERKEYS(pti);
	Test_SPI_SETTOGGLEKEYS(pti);
	Test_SPI_SETMOUSEKEYS(pti);
	Test_SPI_SETSHOWSOUNDS(pti);
	Test_SPI_SETSTICKYKEYS(pti);
	Test_SPI_SETACCESSTIMEOUT(pti);
	Test_SPI_SETSERIALKEYS(pti);
	Test_SPI_SETSOUNDSENTRY(pti);
	Test_SPI_SETHIGHCONTRAST(pti);
	Test_SPI_SETKEYBOARDPREF(pti);
//	Test_SPI_SETSCREENREADER(pti);
///	Test_SPI_SETANIMATION(pti);
//	Test_SPI_SETFONTSMOOTHING(pti);
//	Test_SPI_SETDRAGWIDTH(pti);
//	Test_SPI_SETDRAGHEIGHT(pti);
//	Test_SPI_SETHANDHELD(pti);
//	Test_SPI_SETLOWPOWERTIMEOUT(pti);
//	Test_SPI_SETPOWEROFFTIMEOUT(pti);
//	Test_SPI_SETLOWPOWERACTIVE(pti);
//	Test_SPI_SETPOWEROFFACTIVE(pti);
//	Test_SPI_SETCURSORS(pti);
//	Test_SPI_SETICONS(pti);
//	Test_SPI_SETDEFAULTINPUTLANG(pti);
//	Test_SPI_SETLANGTOGGLE(pti);
//	Test_SPI_GETWINDOWSEXTENSION(pti);
//	Test_SPI_SETMOUSETRAILS(pti);
//	Test_SPI_SETSNAPTODEFBUTTON(pti);
//	Test_SPI_GETSCREENSAVERRUNNING(pti);
//	Test_SPI_SETMOUSEHOVERWIDTH(pti);
//	Test_SPI_SETMOUSEHOVERHEIGHT(pti);
//	Test_SPI_SETMOUSEHOVERTIME(pti);
//	Test_SPI_SETWHEELSCROLLLINES(pti);
//	Test_SPI_SETMENUSHOWDELAY(pti);
//	Test_SPI_SETWHEELSCROLLCHARS(pti);
//	Test_SPI_SETSHOWIMEUI(pti);
//	Test_SPI_SETMOUSESPEED(pti);
//	Test_SPI_GETSCREENSAVERRUNNING(pti);
//	Test_SPI_SETAUDIODESCRIPTION(pti);
//	Test_SPI_SETSCREENSAVESECURE(pti);
//	Test_SPI_SETACTIVEWINDOWTRACKING(pti);
	Test_SPI_SETMENUANIMATION(pti);
//	Test_SPI_SETCOMBOBOXANIMATION(pti);
//	Test_SPI_SETLISTBOXSMOOTHSCROLLING(pti);
//	Test_SPI_SETGRADIENTCAPTIONS(pti);
	Test_SPI_SETKEYBOARDCUES(pti);
//	Test_SPI_SETACTIVEWNDTRKZORDER(pti);
//	Test_SPI_SETHOTTRACKING(pti);
//	Test_SPI_SETMENUFADE(pti);
//	Test_SPI_SETSELECTIONFADE(pti);
//	Test_SPI_SETTOOLTIPANIMATION(pti);
//	Test_SPI_SETTOOLTIPFADE(pti);
//	Test_SPI_SETCURSORSHADOW(pti);
//	Test_SPI_SETMOUSESONAR(pti);
	Test_SPI_SETMOUSECLICKLOCK(pti);
//	Test_SPI_SETMOUSEVANISH(pti);
//	Test_SPI_SETFLATMENU(pti);
//	Test_SPI_SETDROPSHADOW(pti);
//	Test_SPI_SETBLOCKSENDINPUTRESETS(pti);
//	Test_SPI_GETSETUIEFFECTS(pti);
//	Test_SPI_SETDISABLEOVERLAPPEDCONTENT(pti);
//	Test_SPI_SETCLIENTAREAANIMATION(pti);
//	Test_SPI_SETCLEARTYPE(pti);
//	Test_SPI_SETSPEECHRECOGNITION(pti);
//	Test_SPI_SETFOREGROUNDLOCKTIMEOUT(pti);
//	Test_SPI_SETACTIVEWNDTRKTIMEOUT(pti);
//	Test_SPI_SETFOREGROUNDFLASHCOUNT(pti);
//	Test_SPI_SETCARETWIDTH(pti);
//	Test_SPI_SETMOUSECLICKLOCKTIME(pti);
//	Test_SPI_SETFONTSMOOTHINGTYPE(pti);
//	Test_SPI_SETFONTSMOOTHINGCONTRAST(pti);
//	Test_SPI_SETFOCUSBORDERWIDTH(pti);
//	Test_SPI_SETFOCUSBORDERHEIGHT(pti);
//	Test_SPI_SETFONTSMOOTHINGORIENTATION(pti);

	DestroyWindow(hWnd);

	return APISTATUS_NORMAL;
}