From 3979f7432dac4776a071f5e66e53c0477303afd6 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 9 Aug 2009 11:27:25 +0000 Subject: [PATCH] win32knapi: More / improved tests for NtUserSystemParametersInfo, NtGdiSelectBrush, NtGdiSelectBitmap, NtGdiGetFontResourceInfoInternalW, NtGdiDoPalette svn path=/trunk/; revision=42552 --- .../w32knapi/ntgdi/NtGdiCreateDIBSection.c | 5 + .../apitests/w32knapi/ntgdi/NtGdiDoPalette.c | 63 ++ .../ntgdi/NtGdiGetFontResourceInfoInternalW.c | 10 +- .../w32knapi/ntgdi/NtGdiSelectBitmap.c | 40 + .../w32knapi/ntgdi/NtGdiSelectBrush.c | 20 + .../w32knapi/ntuser/NtUserSelectPalette.c | 56 ++ .../ntuser/NtUserSystemParametersInfo.c | 839 +++++++++++++++++- rostests/apitests/w32knapi/testlist.c | 2 + rostests/apitests/w32knapi/w32knapi.c | 17 + rostests/apitests/w32knapi/w32knapi.h | 1 + 10 files changed, 996 insertions(+), 57 deletions(-) diff --git a/rostests/apitests/w32knapi/ntgdi/NtGdiCreateDIBSection.c b/rostests/apitests/w32knapi/ntgdi/NtGdiCreateDIBSection.c index e032bb44c23..9375ef2300f 100644 --- a/rostests/apitests/w32knapi/ntgdi/NtGdiCreateDIBSection.c +++ b/rostests/apitests/w32knapi/ntgdi/NtGdiCreateDIBSection.c @@ -171,23 +171,28 @@ Test_NtGdiCreateDIBSection(PTESTINFO pti) pbih->biBitCount = 4; hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits); TEST(hbmp != 0); + if (hbmp) DeleteObject(hbmp); pbih->biBitCount = 8; hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits); TEST(hbmp != 0); + if (hbmp) DeleteObject(hbmp); cjHeader = pbih->biSize; pbih->biBitCount = 16; hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits); TEST(hbmp != 0); + if (hbmp) DeleteObject(hbmp); pbih->biBitCount = 24; hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits); TEST(hbmp != 0); + if (hbmp) DeleteObject(hbmp); pbih->biBitCount = 32; hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits); TEST(hbmp != 0); + if (hbmp) DeleteObject(hbmp); /* Test BI_BITFIELDS */ cEntries = 3; diff --git a/rostests/apitests/w32knapi/ntgdi/NtGdiDoPalette.c b/rostests/apitests/w32knapi/ntgdi/NtGdiDoPalette.c index 619adb927ca..26ee94a848a 100644 --- a/rostests/apitests/w32knapi/ntgdi/NtGdiDoPalette.c +++ b/rostests/apitests/w32knapi/ntgdi/NtGdiDoPalette.c @@ -206,6 +206,69 @@ Test_NtGdiDoPalette_GetBIBColorTable(PTESTINFO pti) INT Test_NtGdiDoPalette_SetDIBColorTable(PTESTINFO pti) { + HDC hdc; + HBITMAP hbmp; + BYTE *pjBits; + + struct + { + BITMAPINFOHEADER bmiHeader; + ULONG bmiColors[10]; + } bmi; + + hdc = CreateCompatibleDC(0); + ASSERT(hdc); + + bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmi.bmiHeader.biWidth = 10; + bmi.bmiHeader.biHeight = 10; + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biBitCount = 8; + bmi.bmiHeader.biCompression = BI_RGB; + bmi.bmiHeader.biSizeImage = 0; + bmi.bmiHeader.biXPelsPerMeter = 1; + bmi.bmiHeader.biYPelsPerMeter = 1; + bmi.bmiHeader.biClrUsed = 9; + bmi.bmiHeader.biClrImportant = 9; + bmi.bmiColors[0] = 0x000000; + bmi.bmiColors[1] = 0x202020; + bmi.bmiColors[2] = 0x404040; + bmi.bmiColors[3] = 0x606060; + bmi.bmiColors[4] = 0x808080; + bmi.bmiColors[5] = 0xA0A0A0; + bmi.bmiColors[6] = 0xC0C0C0; + bmi.bmiColors[7] = 0xE0E0E0; + bmi.bmiColors[8] = 0xffffff; + hbmp = CreateDIBSection(hdc, (BITMAPINFO*)&bmi, DIB_PAL_COLORS, (PVOID*)&pjBits, NULL, 0); + ASSERT(hbmp); + ASSERT(pjBits); + + SelectObject(hdc, hbmp); + + + pjBits[0] = 8; + pjBits[1] = 1; + pjBits[2] = 2; + pjBits[3] = 3; + + bmi.bmiColors[8] = 0x000000; + bmi.bmiColors[7] = 0x202020; + bmi.bmiColors[6] = 0x404040; + bmi.bmiColors[5] = 0x606060; + bmi.bmiColors[4] = 0x808080; + bmi.bmiColors[3] = 0xA0A0A0; + bmi.bmiColors[2] = 0xC0C0C0; + bmi.bmiColors[1] = 0xE0E0E0; + bmi.bmiColors[0] = 0xffffff; + TEST(NtGdiDoPalette(hdc, 0, 9, &bmi.bmiColors, GdiPalSetColorTable, FALSE) == 9); + + SetDCPenColor(hdc, 0xE0E0E0); + SetDCBrushColor(hdc, 0x202020); + Rectangle(hdc, 0, 0, 10, 10); + + DeleteDC(hdc); + DeleteObject(hbmp); + return APISTATUS_NORMAL; } diff --git a/rostests/apitests/w32knapi/ntgdi/NtGdiGetFontResourceInfoInternalW.c b/rostests/apitests/w32knapi/ntgdi/NtGdiGetFontResourceInfoInternalW.c index 0effcc8b247..ab6dd24fdcb 100644 --- a/rostests/apitests/w32knapi/ntgdi/NtGdiGetFontResourceInfoInternalW.c +++ b/rostests/apitests/w32knapi/ntgdi/NtGdiGetFontResourceInfoInternalW.c @@ -2,18 +2,12 @@ INT Test_NtGdiGetFontResourceInfoInternalW(PTESTINFO pti) { - WCHAR szFullFileName[MAX_PATH+1]; BOOL bRet; DWORD dwBufSize; LOGFONTW logfont; UNICODE_STRING NtFileName; - GetCurrentDirectoryW(MAX_PATH, szFullFileName); - wcscat(szFullFileName, L"\\test.otf"); - - ASSERT(AddFontResourceW(szFullFileName) != 0); - - ASSERT(RtlDosPathNameToNtPathName_U(szFullFileName, + ASSERT(RtlDosPathNameToNtPathName_U(L".\\test.otf", &NtFileName, NULL, NULL)); @@ -36,7 +30,7 @@ Test_NtGdiGetFontResourceInfoInternalW(PTESTINFO pti) printf("lfWidth = %ld\n", logfont.lfWidth); printf("lfFaceName = %ls\n", logfont.lfFaceName); - RemoveFontResourceW(szFullFileName); +// RemoveFontResourceW(szFullFileName); return APISTATUS_NORMAL; } diff --git a/rostests/apitests/w32knapi/ntgdi/NtGdiSelectBitmap.c b/rostests/apitests/w32knapi/ntgdi/NtGdiSelectBitmap.c index 98261768691..c45243e50e2 100644 --- a/rostests/apitests/w32knapi/ntgdi/NtGdiSelectBitmap.c +++ b/rostests/apitests/w32knapi/ntgdi/NtGdiSelectBitmap.c @@ -1,3 +1,41 @@ + +INT +Test_SelectDIBSection(PTESTINFO pti) +{ + HDC hdc; + HBITMAP hbmp; + struct + { + BITMAPINFOHEADER bmiHeader; + RGBQUAD bmiColors[100]; + } bmi; + PBITMAPINFO pbmi = (PBITMAPINFO)&bmi; + PVOID pvBits; + + hdc = CreateCompatibleDC(0); + ASSERT(hdc); + + bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmi.bmiHeader.biWidth = 2; + bmi.bmiHeader.biHeight = 2; + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biBitCount = 1; + bmi.bmiHeader.biCompression = BI_RGB; + bmi.bmiHeader.biSizeImage = 0; + bmi.bmiHeader.biXPelsPerMeter = 100; + bmi.bmiHeader.biYPelsPerMeter = 100; + bmi.bmiHeader.biClrUsed = 2; + bmi.bmiHeader.biClrImportant = 2; + + hbmp = CreateDIBSection(hdc, pbmi, DIB_PAL_COLORS, &pvBits, NULL, 0); + ASSERT(hbmp); + + TEST(NtGdiSelectBitmap(hdc, hbmp) != 0); + + return 0; +} + + INT Test_NtGdiSelectBitmap(PTESTINFO pti) { @@ -68,6 +106,8 @@ Test_NtGdiSelectBitmap(PTESTINFO pti) DeleteObject(hBmp); DeleteDC(hDC); + Test_SelectDIBSection(pti); + return APISTATUS_NORMAL; } diff --git a/rostests/apitests/w32knapi/ntgdi/NtGdiSelectBrush.c b/rostests/apitests/w32knapi/ntgdi/NtGdiSelectBrush.c index d332e9af39f..ba39232165f 100644 --- a/rostests/apitests/w32knapi/ntgdi/NtGdiSelectBrush.c +++ b/rostests/apitests/w32knapi/ntgdi/NtGdiSelectBrush.c @@ -3,6 +3,7 @@ Test_NtGdiSelectBrush(PTESTINFO pti) { HDC hDC; HBRUSH hBrush, hOldBrush; + DC_ATTR *pdcattr; hDC = CreateDCW(L"DISPLAY", NULL, NULL, NULL); @@ -39,6 +40,25 @@ Test_NtGdiSelectBrush(PTESTINFO pti) TEST(hOldBrush == hBrush); TEST(GetLastError() == ERROR_SUCCESS); + /* Begin with a white brush */ + NtGdiSelectBrush(hDC, GetStockObject(WHITE_BRUSH)); + /* Select a brush in user mode */ + SelectObject(hDC, GetStockObject(BLACK_BRUSH)); + /* See what we get returned */ + hOldBrush = NtGdiSelectBrush(hDC, GetStockObject(WHITE_BRUSH)); + TEST(hOldBrush == GetStockObject(BLACK_BRUSH)); + + + /* Begin with a white brush */ + NtGdiSelectBrush(hDC, GetStockObject(WHITE_BRUSH)); + + pdcattr = GetHandleUserData(hDC); + /* Change the brush in user mode, without setting flags */ + pdcattr->hbrush = (HBRUSH)12345; + + hOldBrush = NtGdiSelectBrush(hDC, GetStockObject(BLACK_BRUSH)); + TEST(hOldBrush == (HBRUSH)12345); + DeleteDC(hDC); diff --git a/rostests/apitests/w32knapi/ntuser/NtUserSelectPalette.c b/rostests/apitests/w32knapi/ntuser/NtUserSelectPalette.c index 892c4f860c0..dac693c39a0 100644 --- a/rostests/apitests/w32knapi/ntuser/NtUserSelectPalette.c +++ b/rostests/apitests/w32knapi/ntuser/NtUserSelectPalette.c @@ -88,5 +88,61 @@ Test_NtUserSelectPalette(PTESTINFO pti) TEST(hOldPal != 0); + +#if 0 + RealizePalette(hDC); + + GetClientRect(hWnd, &rect); + FillRect(hDC, &rect, GetSysColorBrush(COLOR_BTNSHADOW)); + + TEST(GetNearestColor(hDC, RGB(0,0,0)) == RGB(0,0,0)); + TEST(GetNearestColor(hDC, RGB(0,0,1)) == RGB(0,0,1)); + + ReleaseDC(hWnd, hDC); + DestroyWindow(hWnd); + RECT rect; + HBITMAP hBmp; + + + BITMAPINFOHEADER bmih = {sizeof(BITMAPINFOHEADER), // biSize + 3, // biWidth + 3, // biHeight + 1, // biPlanes + 8, // biBitCount + BI_RGB, // biCompression + 0, // biSizeImage + 92, // biXPelsPerMeter + 92, // biYPelsPerMeter + 6, // biClrUsed + 6}; // biClrImportant + BYTE bits[3][3] = {{0,1,2},{3,4,5},{6,1,2}}; + + struct + { + BITMAPINFOHEADER bmih; + RGBQUAD colors[6]; + } bmi = {{sizeof(BITMAPINFOHEADER),3,3,1,8,BI_RGB,0,92,92,6,6}, + {{0,0,0,0},{255,255,255,0},{255,0,0,0}, + {0,255,0,0},{0,0,255,0},{128,128,128,0}}}; + + hBmp = CreateDIBitmap(hCompDC, &bmih, CBM_INIT, &bits, (BITMAPINFO*)&bmi, DIB_RGB_COLORS); + ASSERT(hBmp); + + SetLastError(0); + TEST(NtGdiSelectBitmap(hCompDC, hBmp)); + hOldPal = NtUserSelectPalette(hCompDC, hPal, 0); + TEST(hOldPal != NULL); + RealizePalette(hCompDC); + + TEST(GetNearestColor(hCompDC, RGB(0,0,0)) == RGB(0,0,0)); + TEST(GetNearestColor(hCompDC, RGB(0,0,1)) == RGB(0,0,0)); + TEST(GetNearestColor(hCompDC, RGB(100,0,0)) == RGB(0,0,0)); + TEST(GetNearestColor(hCompDC, RGB(250,250,250)) == RGB(255,255,255)); + TEST(GetNearestColor(hCompDC, RGB(120,100,110)) == RGB(128,128,128)); + +printf("nearest = 0x%x\n", GetNearestColor(hCompDC, RGB(120,100,110))); +#endif + + return APISTATUS_NORMAL; } diff --git a/rostests/apitests/w32knapi/ntuser/NtUserSystemParametersInfo.c b/rostests/apitests/w32knapi/ntuser/NtUserSystemParametersInfo.c index 8eda902c0a6..6814e561e4c 100644 --- a/rostests/apitests/w32knapi/ntuser/NtUserSystemParametersInfo.c +++ b/rostests/apitests/w32knapi/ntuser/NtUserSystemParametersInfo.c @@ -1,6 +1,48 @@ +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"; +#define PREFMASK_MENUANIM 0x2 +#define PREFMASK_KBDCUES 0x20 + +//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(LPWSTR pszSubKey, LPWSTR pszValueName, PVOID pData, LPDWORD cbSize, LPDWORD pType) +QueryUserRegValueW(PCWSTR pszSubKey, PCWSTR pszValueName, PVOID pData, LPDWORD cbSize, LPDWORD pType) { HKEY hKey; LONG ret; @@ -40,24 +82,6 @@ CreateTestWindow() NULL, g_hInstance, 0); - -} - -void -Test_SPI_87_88(PTESTINFO pti) -{ - DWORD dwRet = 0xdeadbeef; - - TEST(NtUserSystemParametersInfo(87, 0, &dwRet, 0) == TRUE); - TEST(dwRet == 0xdeadbeef); - dwRet++; - TEST(NtUserSystemParametersInfo(87, 0, &dwRet, 0) == TRUE); - - - dwRet--; - TEST(NtUserSystemParametersInfo(87, 0, &dwRet, 0) == TRUE); - - } void @@ -67,7 +91,6 @@ Test_NtUserSystemParametersInfo_Params(PTESTINFO pti) DWORD data[1000]; UINT i, uint; ACCESSTIMEOUT ato; -#if 1 /* Test normal */ SetLastError(ERROR_SUCCESS); TEST(NtUserSystemParametersInfo(SPI_GETFOCUSBORDERHEIGHT, 0, &uint, 0) == TRUE); @@ -80,45 +103,45 @@ Test_NtUserSystemParametersInfo_Params(PTESTINFO pti) /* Test wrong cbSize member */ ato.cbSize = 1; - SetLastError(ERROR_SUCCESS); + SetLastError(0xdeadbeef); TEST(NtUserSystemParametersInfo(SPI_GETACCESSTIMEOUT, 0, &ato, 0) == FALSE); - TEST(GetLastError() == ERROR_SUCCESS); -#endif + 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(4112, 0, &data, 0) == TRUE); + 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(4113, 0, &data, 0) == TRUE); + TEST(NtUserSystemParametersInfo(0x1011, 0, &data, 0) == TRUE); TEST(GetLastError() == ERROR_SUCCESS); TEST(data[0] == 0xbeefdead); TEST(data[1] == 0xbeefdead); data[0] = 0; - NtUserSystemParametersInfo(4112, 0, &data, 0); + NtUserSystemParametersInfo(0x1010, 0, &data, 0); TEST(data[0] == 1); for(i = 0; i < 1000; i++) data[i] = 0xdeadbeef; SetLastError(ERROR_SUCCESS); - TEST(NtUserSystemParametersInfo(4136, 0, &data, 0) == TRUE); + 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(4137, 0, &data, 0) == TRUE); + 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(4138, 0, &data, 0) == TRUE); + TEST(NtUserSystemParametersInfo(0x102A, 0, &data, 0) == TRUE); TEST(GetLastError() == ERROR_SUCCESS); TEST(data[0] != 0xdeadbeef); TEST(data[1] == 0xdeadbeef); @@ -255,7 +278,7 @@ Test_NtUserSystemParametersInfo_Params(PTESTINFO pti) 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); @@ -265,6 +288,53 @@ Test_NtUserSystemParametersInfo_Params(PTESTINFO pti) /* 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) { @@ -290,7 +360,67 @@ Test_NtUserSystemParametersInfo_fWinIni(PTESTINFO pti) } void -Test_SPI_GETSETBEEP(PTESTINFO pti) +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 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]; @@ -304,7 +434,7 @@ Test_SPI_GETSETBEEP(PTESTINFO pti) NtUserSystemParametersInfo(SPI_GETBEEP, 0, &bTemp, 0); TEST(bTemp == 0); cbSize = sizeof(szReg); - TEST(QueryUserRegValueW(L"Control Panel\\Sound", L"Beep", &szReg, &cbSize, NULL) == ERROR_SUCCESS); + TEST(QueryUserRegValueW(KEY_SOUND, VAL_BEEP, &szReg, &cbSize, NULL) == ERROR_SUCCESS); TEST(_wcsicmp(szReg, L"No") == 0); /* Value 1 */ @@ -312,7 +442,7 @@ Test_SPI_GETSETBEEP(PTESTINFO pti) NtUserSystemParametersInfo(SPI_GETBEEP, 0, &bTemp, 0); TEST(bTemp == 1); cbSize = sizeof(szReg); - TEST(QueryUserRegValueW(L"Control Panel\\Sound", L"Beep", &szReg, &cbSize, NULL) == ERROR_SUCCESS); + TEST(QueryUserRegValueW(KEY_SOUND, VAL_BEEP, &szReg, &cbSize, NULL) == ERROR_SUCCESS); TEST(_wcsicmp(szReg, L"Yes") == 0); /* Value 2 */ @@ -320,39 +450,555 @@ Test_SPI_GETSETBEEP(PTESTINFO pti) NtUserSystemParametersInfo(SPI_GETBEEP, 0, &bTemp, 0); TEST(bTemp == 1); cbSize = sizeof(szReg); - TEST(QueryUserRegValueW(L"Control Panel\\Sound", L"Beep", &szReg, &cbSize, NULL) == ERROR_SUCCESS); + 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); } -INT +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 */ -// NtUserSystemParametersInfo(SPI_GET_DESKWALLPAPER, 0, + 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); -// TEST(NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &hNewWallPaper, 0) == 0); - return 0; + return APISTATUS_NORMAL; } INT -Test_SPI_GETSTICKYKEYS(PTESTINFO pti) +Test_SPI_SETDRAGFULLWINDOWS(PTESTINFO pti) { - STICKYKEYS sk; + 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); - NtUserSystemParametersInfo(SPI_GETSTICKYKEYS, 0, &sk, 0); - printf("sk.dwFlags = %lx\n", sk.dwFlags); + 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 & PREFMASK_MENUANIM) == 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 & PREFMASK_MENUANIM) != 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, PREFMASK_KBDCUES); +} + +// 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); + + INT Test_NtUserSystemParametersInfo(PTESTINFO pti) { @@ -360,16 +1006,111 @@ Test_NtUserSystemParametersInfo(PTESTINFO pti) hWnd = CreateTestWindow(); ASSERT(hWnd); - Test_NtUserSystemParametersInfo_Params(pti); + Test_NtUserSystemParametersInfo_Params(pti); Test_NtUserSystemParametersInfo_fWinIni(pti); - - Test_SPI_GETSETBEEP(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_GETSTICKYKEYS(pti); - - Test_SPI_87_88(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); diff --git a/rostests/apitests/w32knapi/testlist.c b/rostests/apitests/w32knapi/testlist.c index 67b8f2c672b..b38e66bf0b5 100644 --- a/rostests/apitests/w32knapi/testlist.c +++ b/rostests/apitests/w32knapi/testlist.c @@ -58,6 +58,7 @@ #include "ntuser/NtUserSetTimer.c" #include "ntuser/NtUserSystemParametersInfo.c" #include "ntuser/NtUserToUnicodeEx.c" +#include "ntuser/NtUserUpdatePerUserSystemParameters.c" /* The List of tests */ TESTENTRY TestList[] = @@ -121,6 +122,7 @@ TESTENTRY TestList[] = { L"NtUserSetTimer", Test_NtUserSetTimer }, { L"NtUserSystemParametersInfo", Test_NtUserSystemParametersInfo }, { L"NtUserToUnicodeEx", Test_NtUserToUnicodeEx }, + { L"NtUserUpdatePerUserSystemParameters", Test_NtUserUpdatePerUserSystemParameters }, }; /* The function that gives us the number of tests */ diff --git a/rostests/apitests/w32knapi/w32knapi.c b/rostests/apitests/w32knapi/w32knapi.c index ec065810f89..1835c830aea 100644 --- a/rostests/apitests/w32knapi/w32knapi.c +++ b/rostests/apitests/w32knapi/w32knapi.c @@ -29,6 +29,23 @@ IsHandleValid(HGDIOBJ hobj) return TRUE; } +PVOID +GetHandleUserData(HGDIOBJ hobj) +{ + USHORT Index = (ULONG_PTR)hobj; + PGDI_TABLE_ENTRY pentry = &GdiHandleTable[Index]; + + if (pentry->KernelData == NULL || + pentry->KernelData < (PVOID)0x80000000 || + (USHORT)pentry->FullUnique != (USHORT)((ULONG_PTR)hobj >> 16)) + { + return NULL; + } + + return pentry->UserData; +} + + static DWORD WINAPI IntSyscall(FARPROC proc, UINT cParams, PVOID pFirstParam) { diff --git a/rostests/apitests/w32knapi/w32knapi.h b/rostests/apitests/w32knapi/w32knapi.h index b6d0178c502..2821787814a 100644 --- a/rostests/apitests/w32knapi/w32knapi.h +++ b/rostests/apitests/w32knapi/w32knapi.h @@ -38,6 +38,7 @@ extern HMODULE g_hModule; extern PGDI_TABLE_ENTRY GdiHandleTable; BOOL IsHandleValid(HGDIOBJ hobj); +PVOID GetHandleUserData(HGDIOBJ hobj); DWORD Syscall(LPWSTR lpszFunction, int cParams, void* pParams); BOOL InitOsVersion(); extern UINT g_OsIdx; -- 2.17.1