Author: mjansen Date: Wed Dec 14 19:19:57 2016 New Revision: 73453
URL: http://svn.reactos.org/svn/reactos?rev=73453&view=rev Log: [APPSHIM_APITEST] Update display mode shim tests to show some difference in versions + add extra tests. CORE-11927
Modified: trunk/rostests/apitests/appshim/CMakeLists.txt trunk/rostests/apitests/appshim/dispmode.c
Modified: trunk/rostests/apitests/appshim/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/appshim/CMakeList... ============================================================================== --- trunk/rostests/apitests/appshim/CMakeLists.txt [iso-8859-1] (original) +++ trunk/rostests/apitests/appshim/CMakeLists.txt [iso-8859-1] Wed Dec 14 19:19:57 2016 @@ -8,5 +8,5 @@
add_executable(appshim_apitest ${SOURCE}) set_module_type(appshim_apitest win32cui) -add_importlibs(appshim_apitest msvcrt kernel32 ntdll) +add_importlibs(appshim_apitest version msvcrt kernel32 ntdll) add_cd_file(TARGET appshim_apitest DESTINATION reactos/bin FOR all)
Modified: trunk/rostests/apitests/appshim/dispmode.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/appshim/dispmode.... ============================================================================== --- trunk/rostests/apitests/appshim/dispmode.c [iso-8859-1] (original) +++ trunk/rostests/apitests/appshim/dispmode.c [iso-8859-1] Wed Dec 14 19:19:57 2016 @@ -28,33 +28,99 @@ #include <strsafe.h> #include "wine/test.h"
-extern DWORD get_host_winver(void); -static DWORD g_WinVersion; +static DWORD g_Version; #define WINVER_ANY 0 -#define WINVER_VISTA 0x0600
/* apphelp.dll */ static BOOL(WINAPI* pSdbGetAppPatchDir)(PVOID, LPWSTR, DWORD);
-/* aclayers.dll */ +/* aclayers.dll / acgenral.dll */ static PVOID(WINAPI* pGetHookAPIs)(LPCSTR, LPCWSTR, PDWORD); static BOOL(WINAPI* pNotifyShims)(DWORD fdwReason, PVOID ptr);
- -static LONG g_Count; +DWORD get_module_version(HMODULE mod) +{ + DWORD dwVersion = 0; + HRSRC hResInfo = FindResource(mod, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION); + DWORD dwSize = SizeofResource(mod, hResInfo); + if (hResInfo && dwSize) + { + VS_FIXEDFILEINFO *lpFfi; + UINT uLen; + + HGLOBAL hResData = LoadResource(mod, hResInfo); + LPVOID pRes = LockResource(hResData); + HLOCAL pResCopy = LocalAlloc(LMEM_FIXED, dwSize); + + CopyMemory(pResCopy, pRes, dwSize); + FreeResource(hResData); + + if (VerQueryValueW(pResCopy, L"\", (LPVOID*)&lpFfi, &uLen)) + { + dwVersion = (HIWORD(lpFfi->dwProductVersionMS) << 8) | LOWORD(lpFfi->dwProductVersionMS); + if (!dwVersion) + dwVersion = (HIWORD(lpFfi->dwFileVersionMS) << 8) | LOWORD(lpFfi->dwFileVersionMS); + } + + LocalFree(pResCopy); + } + + return dwVersion; +} + +static LONG g_ChangeCount; static DEVMODEA g_LastDevmode; static DWORD g_LastFlags;
static LONG (WINAPI *pChangeDisplaySettingsA)(_In_opt_ PDEVMODEA lpDevMode, _In_ DWORD dwflags); LONG WINAPI mChangeDisplaySettingsA(_In_opt_ PDEVMODEA lpDevMode, _In_ DWORD dwflags) { - g_Count++; + g_ChangeCount++; g_LastDevmode = *lpDevMode; g_LastFlags = dwflags;
return DISP_CHANGE_FAILED; } + +static LONG g_EnumCount; +static BOOL bFix = TRUE; + +static BOOL (WINAPI *pEnumDisplaySettingsA)(_In_opt_ LPCSTR lpszDeviceName, _In_ DWORD iModeNum, _Inout_ PDEVMODEA lpDevMode); +BOOL WINAPI mEnumDisplaySettingsA(_In_opt_ LPCSTR lpszDeviceName, _In_ DWORD iModeNum, _Inout_ PDEVMODEA lpDevMode) +{ + g_EnumCount++; + if (pEnumDisplaySettingsA(lpszDeviceName, iModeNum, lpDevMode)) + { + if (bFix) + { + if (lpDevMode && lpDevMode->dmBitsPerPel == 8) + { + trace("Running at 8bpp, faking 16\n"); + lpDevMode->dmBitsPerPel = 16; + } + if (lpDevMode && lpDevMode->dmPelsWidth == 640 && lpDevMode->dmPelsHeight == 480) + { + trace("Running at 640x480, faking 800x600\n"); + lpDevMode->dmPelsWidth = 800; + lpDevMode->dmPelsHeight = 600; + } + } + else + { + if (lpDevMode) + { + lpDevMode->dmBitsPerPel = 8; + lpDevMode->dmPelsWidth = 640; + lpDevMode->dmPelsHeight = 480; + } + } + return TRUE; + } + return FALSE; +} + +
static LONG g_ThemeCount; static DWORD g_LastThemeFlags; @@ -77,33 +143,146 @@
static void pre_8bit(void) { - g_Count = 0; + g_ChangeCount = 0; memset(&g_LastDevmode, 0, sizeof(g_LastDevmode)); g_LastFlags = 0xffffffff; + g_EnumCount = 0; +} + +static void pre_8bit_2(void) +{ + bFix = FALSE; + + pre_8bit(); }
static void post_8bit(void) { - ok_int(g_Count, 1); + ok_int(g_ChangeCount, 1); ok_hex(g_LastDevmode.dmFields & DM_BITSPERPEL, DM_BITSPERPEL); ok_int(g_LastDevmode.dmBitsPerPel, 8); ok_hex(g_LastFlags, CDS_FULLSCREEN); + ok_int(g_EnumCount, 1); +} + +static void post_8bit_2(void) +{ + ok_int(g_ChangeCount, 0); + ok_hex(g_LastFlags, 0xffffffff); + ok_int(g_EnumCount, 1); + + bFix = TRUE; +} + +static void post_8bit_no(void) +{ + if (g_Version == _WIN32_WINNT_WS03) + { + ok_int(g_ChangeCount, 1); + ok_hex(g_LastDevmode.dmFields & DM_BITSPERPEL, DM_BITSPERPEL); + ok_int(g_LastDevmode.dmBitsPerPel, 8); + ok_hex(g_LastFlags, CDS_FULLSCREEN); + ok_int(g_EnumCount, 1); + } + else + { + ok_int(g_ChangeCount, 0); + ok_hex(g_LastFlags, 0xffffffff); + ok_int(g_EnumCount, 0); + } + + bFix = TRUE; +} + +static void post_8bit_2_no(void) +{ + if (g_Version == _WIN32_WINNT_WS03) + { + ok_int(g_ChangeCount, 0); + ok_hex(g_LastFlags, 0xffffffff); + ok_int(g_EnumCount, 1); + } + else + { + ok_int(g_ChangeCount, 0); + ok_hex(g_LastFlags, 0xffffffff); + ok_int(g_EnumCount, 0); + } + + bFix = TRUE; }
static void pre_640(void) { - g_Count = 0; + g_ChangeCount = 0; memset(&g_LastDevmode, 0, sizeof(g_LastDevmode)); g_LastFlags = 0xffffffff; + g_EnumCount = 0; +} + +static void pre_640_2(void) +{ + bFix = FALSE; + + pre_640(); }
static void post_640(void) { - ok_int(g_Count, 1); + ok_int(g_ChangeCount, 1); ok_hex(g_LastDevmode.dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT), (DM_PELSWIDTH | DM_PELSHEIGHT)); ok_int(g_LastDevmode.dmPelsWidth, 640); ok_int(g_LastDevmode.dmPelsHeight, 480); ok_hex(g_LastFlags, CDS_FULLSCREEN); + ok_int(g_EnumCount, 1); +} + +static void post_640_2(void) +{ + ok_int(g_ChangeCount, 0); + ok_hex(g_LastFlags, 0xffffffff); + ok_int(g_EnumCount, 1); + + bFix = TRUE; +} + +static void post_640_no(void) +{ + if (g_Version == _WIN32_WINNT_WS03) + { + ok_int(g_ChangeCount, 1); + ok_hex(g_LastDevmode.dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT), (DM_PELSWIDTH | DM_PELSHEIGHT)); + ok_int(g_LastDevmode.dmPelsWidth, 640); + ok_int(g_LastDevmode.dmPelsHeight, 480); + ok_hex(g_LastFlags, CDS_FULLSCREEN); + ok_int(g_EnumCount, 1); + } + else + { + ok_int(g_ChangeCount, 0); + ok_hex(g_LastFlags, 0xffffffff); + ok_int(g_EnumCount, 0); + } + + bFix = TRUE; +} + +static void post_640_2_no(void) +{ + if (g_Version == _WIN32_WINNT_WS03) + { + ok_int(g_ChangeCount, 0); + ok_hex(g_LastFlags, 0xffffffff); + ok_int(g_EnumCount, 1); + } + else + { + ok_int(g_ChangeCount, 0); + ok_hex(g_LastFlags, 0xffffffff); + ok_int(g_EnumCount, 0); + } + + bFix = TRUE; }
static void pre_theme(void) @@ -116,6 +295,20 @@ { ok_int(g_ThemeCount, 1); ok_hex(g_LastThemeFlags, 0); +} + +static void post_theme_no(void) +{ + if (g_Version == _WIN32_WINNT_WS03) + { + ok_int(g_ThemeCount, 1); + ok_hex(g_LastThemeFlags, 0); + } + else + { + ok_int(g_ThemeCount, 0); + ok_hex(g_LastThemeFlags, 0xffffffff); + } }
static PIMAGE_IMPORT_DESCRIPTOR FindImportDescriptor(PBYTE DllBase, PCSTR DllName) @@ -173,7 +366,8 @@
static BOOL hook_disp(HMODULE dll) { - return RedirectIat(dll, "user32.dll", "ChangeDisplaySettingsA", (ULONG_PTR)mChangeDisplaySettingsA, (ULONG_PTR*)&pChangeDisplaySettingsA); + return RedirectIat(dll, "user32.dll", "ChangeDisplaySettingsA", (ULONG_PTR)mChangeDisplaySettingsA, (ULONG_PTR*)&pChangeDisplaySettingsA) && + RedirectIat(dll, "user32.dll", "EnumDisplaySettingsA", (ULONG_PTR)mEnumDisplaySettingsA, (ULONG_PTR*)&pEnumDisplaySettingsA); }
static BOOL hook_theme(HMODULE dll) @@ -182,7 +376,7 @@ }
-static void test_one(LPCSTR shim, DWORD dwReason, void(*pre)(), void(*post)()) +static void test_one(LPCSTR shim, DWORD dwReason, void(*pre)(), void(*post)(), void(*second)(void)) { DWORD num_shims = 0; WCHAR wide_shim[50] = { 0 }; @@ -196,7 +390,7 @@ hook = pGetHookAPIs("", wide_shim, &num_shims); if (hook == NULL) { - skip("Skipping tests for layers (%s) not present in this os (0x%x)\n", shim, g_WinVersion); + skip("Skipping tests for layers (%s) not present in this os (0x%x)\n", shim, g_Version); return; } ok(hook != NULL, "Expected hook to be a valid pointer for %s\n", shim); @@ -209,8 +403,20 @@
if (post) post(); -} - + + /* Invoking it a second time does not call the init functions again! */ + if (pre && second) + { + pre(); + + ret = pNotifyShims(dwReason, NULL); + ok(ret != 0, "Expected pNotifyShims to succeed (%i)\n", ret); + + second(); + } +} + +/* In 2k3 0, 2, 4, 6, 8 are not guarded against re-initializations! */ static struct test_info { const char* name; @@ -220,14 +426,22 @@ BOOL(*hook)(HMODULE); void(*pre)(void); void(*post)(void); + void(*second)(void); } tests[] = { - { "Force8BitColor", L"\aclayers.dll", WINVER_ANY, 1, hook_disp, pre_8bit, post_8bit }, - { "Force8BitColor", L"\aclayers.dll", WINVER_VISTA, 100, hook_disp, pre_8bit, post_8bit }, - { "Force640x480", L"\aclayers.dll", WINVER_ANY, 1, hook_disp, pre_640, post_640 }, - { "Force640x480", L"\aclayers.dll", WINVER_VISTA, 100, hook_disp, pre_640, post_640 }, - { "DisableThemes", L"\acgenral.dll", WINVER_ANY, 1, hook_theme, pre_theme, post_theme }, - { "DisableThemes", L"\acgenral.dll", WINVER_VISTA, 100, hook_theme, pre_theme, post_theme }, + /* Success */ + { "Force8BitColor", L"\aclayers.dll", WINVER_ANY, 1, hook_disp, pre_8bit, post_8bit, post_8bit_no }, + { "Force8BitColor", L"\aclayers.dll", _WIN32_WINNT_VISTA, 100, hook_disp, pre_8bit, post_8bit, post_8bit_no }, + { "Force640x480", L"\aclayers.dll", WINVER_ANY, 1, hook_disp, pre_640, post_640, post_640_no }, + { "Force640x480", L"\aclayers.dll", _WIN32_WINNT_VISTA, 100, hook_disp, pre_640, post_640, post_640_no }, + { "DisableThemes", L"\acgenral.dll", WINVER_ANY, 1, hook_theme, pre_theme, post_theme, post_theme_no }, + { "DisableThemes", L"\acgenral.dll", _WIN32_WINNT_VISTA, 100, hook_theme, pre_theme, post_theme, post_theme_no }, + + /* No need to change anything */ + { "Force8BitColor", L"\aclayers.dll", WINVER_ANY, 1, hook_disp, pre_8bit_2, post_8bit_2, post_8bit_2_no }, + { "Force8BitColor", L"\aclayers.dll", _WIN32_WINNT_VISTA, 100, hook_disp, pre_8bit_2, post_8bit_2, post_8bit_2_no }, + { "Force640x480", L"\aclayers.dll", WINVER_ANY, 1, hook_disp, pre_640_2, post_640_2, post_640_2_no }, + { "Force640x480", L"\aclayers.dll", _WIN32_WINNT_VISTA, 100, hook_disp, pre_640_2, post_640_2, post_640_2_no }, };
@@ -248,14 +462,25 @@ return; }
- ret = tests[n].hook(dll); - if (ret) - { - test_one(tests[n].name, tests[n].reason, tests[n].pre, tests[n].post); - } - else - { - ok(0, "Unable to redirect functions!\n"); + g_Version = get_module_version(dll); + + if (!g_Version) + { + g_Version = _WIN32_WINNT_WS03; + trace("Module %s has no version, faking 2k3\n", wine_dbgstr_w(tests[n].dll)); + } + + if (g_Version >= tests[n].winver) + { + ret = tests[n].hook(dll); + if (ret) + { + test_one(tests[n].name, tests[n].reason, tests[n].pre, tests[n].post, tests[n].second); + } + else + { + ok(0, "Unable to redirect functions!\n"); + } } FreeLibrary(dll); if (unload) @@ -279,8 +504,6 @@ skip("apphelp.dll not loaded, or does not export SdbGetAppPatchDir\n"); return; } - - g_WinVersion = get_host_winver();
argc = winetest_get_mainargs(&argv); if (argc < 3) @@ -296,9 +519,6 @@ for (n = 0; n < _countof(tests); ++n) { LONG failures = winetest_get_failures(); - - if (g_WinVersion < tests[n].winver) - continue;
if (dll == NULL) { @@ -322,10 +542,8 @@ } }
- if (failures != winetest_get_failures()) - { - trace("Failures from %d (%s)\n", n, tests[n].name); - } + ok(failures == winetest_get_failures(), "Last %u failures are from %d (%s)\n", + winetest_get_failures() - failures, n, tests[n].name); } } else