From 60a5ee6560a2048d31e694dee147465bd89a366f Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Sun, 25 Feb 2018 19:37:48 +0300 Subject: [PATCH] kernel32/tests: Add more tests for VerifyVersionInfo(). New tests cases by Sebastian Lackner. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/kernel32/tests/version.c | 636 ++++++++++++++++++++++++++-------- 1 file changed, 494 insertions(+), 142 deletions(-) diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c index 7b1359878eb..8360994de0c 100644 --- a/dlls/kernel32/tests/version.c +++ b/dlls/kernel32/tests/version.c @@ -163,15 +163,445 @@ static void test_GetVersionEx(void) static void test_VerifyVersionInfo(void) { - OSVERSIONINFOEXA info; - BOOL ret; - DWORD servicepack, error; - - if(!pVerifyVersionInfoA || !pVerSetConditionMask) + enum srcversion_mode { - win_skip("Needed functions not available\n"); - return; - } + SRCVERSION_ZERO = 0, + SRCVERSION_CURRENT = 1, + SRCVERSION_INC_MINOR = 2, + SRCVERSION_INC_SP_MINOR = 3, + SRCVERSION_INC_SP_MAJOR = 4, + SRCVERSION_DEC_SP_MAJOR = 5, + SRCVERSION_DEC_MAJOR = 6, + SRCVERSION_INC_BUILD = 7, + SRCVERSION_REQUIRES_SP = 0x1000, + }; + + struct verify_version_test + { + DWORD verifymask; /* Type mask for VerifyVersionInfo() */ + DWORD srcinfo; /* The way current version info is modified. */ + DWORD err; /* Error code on failure, 0 on success. */ + + DWORD typemask1; + DWORD condition1; + DWORD typemask2; + DWORD condition2; + DWORD typemask3; + DWORD condition3; + DWORD typemask4; + DWORD condition4; + + BOOL todo; + } verify_version_tests[] = + { + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_MINOR, + 0, + + VER_MAJORVERSION, VER_EQUAL, + VER_MINORVERSION, VER_LESS, + 0, 0, + 0, 0, + TRUE, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_MINOR, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + VER_MINORVERSION, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_CURRENT, + 0, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + VER_MINORVERSION, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_CURRENT, + 0, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + VER_MINORVERSION, VER_AND, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_MINOR, + 0, + + VER_MAJORVERSION, VER_LESS_EQUAL, + VER_MINORVERSION, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_MINOR, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_AND, + VER_MINORVERSION, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_MINOR, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_OR, + VER_MINORVERSION, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MINOR, + ERROR_OLD_WIN_VERSION, + + VER_MINORVERSION, VER_EQUAL, + VER_SERVICEPACKMINOR, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MINOR, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_EQUAL, + VER_SERVICEPACKMINOR, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_EQUAL, + VER_SERVICEPACKMAJOR, VER_EQUAL, + }, + { + VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MINOR, + 0, + + VER_SERVICEPACKMAJOR, VER_EQUAL, + VER_SERVICEPACKMINOR, VER_LESS, + 0, 0, + 0, 0, + TRUE, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MINOR, + ERROR_OLD_WIN_VERSION, + + VER_SERVICEPACKMAJOR, VER_EQUAL, + VER_SERVICEPACKMINOR, VER_LESS, + }, + { + VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MINOR, + 0, + + VER_MINORVERSION, VER_EQUAL, + VER_SERVICEPACKMAJOR, VER_EQUAL, + VER_SERVICEPACKMINOR, VER_LESS, + 0, 0, + TRUE, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MINOR, + ERROR_OLD_WIN_VERSION, + + VER_MINORVERSION, VER_EQUAL, + VER_SERVICEPACKMAJOR, VER_EQUAL, + VER_SERVICEPACKMINOR, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MINOR, + 0, + + VER_MAJORVERSION, VER_EQUAL, + VER_MINORVERSION, VER_EQUAL, + VER_SERVICEPACKMAJOR, VER_EQUAL, + VER_SERVICEPACKMINOR, VER_LESS, + TRUE, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MINOR, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_EQUAL, + VER_MINORVERSION, VER_GREATER_EQUAL, + VER_SERVICEPACKMAJOR, VER_EQUAL, + VER_SERVICEPACKMINOR, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + 0, + + VER_MAJORVERSION, VER_LESS_EQUAL, + VER_SERVICEPACKMAJOR, VER_GREATER, + }, + { + VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_EQUAL, + VER_SERVICEPACKMAJOR, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + ERROR_OLD_WIN_VERSION, + + VER_MINORVERSION, VER_EQUAL, + VER_SERVICEPACKMAJOR, VER_LESS, + }, + { + VER_MAJORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + 0, + + VER_MAJORVERSION, VER_EQUAL, + VER_SERVICEPACKMAJOR, VER_LESS, + 0, 0, + 0, 0, + TRUE, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_EQUAL, + VER_SERVICEPACKMAJOR, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + 0, + + VER_MAJORVERSION, VER_EQUAL, + VER_MINORVERSION, VER_EQUAL, + VER_SERVICEPACKMAJOR, VER_LESS, + 0, 0, + TRUE + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + VER_SERVICEPACKMAJOR, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_DEC_MAJOR, + 0, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + VER_SERVICEPACKMAJOR, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_CURRENT, + 0, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + VER_SERVICEPACKMAJOR, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + VER_MINORVERSION, VER_EQUAL, + VER_SERVICEPACKMAJOR, VER_LESS, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + VER_MINORVERSION, VER_GREATER_EQUAL, + VER_SERVICEPACKMAJOR, VER_LESS_EQUAL, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + VER_SERVICEPACKMAJOR, VER_AND, + }, + { + VER_MAJORVERSION | VER_MINORVERSION, + SRCVERSION_ZERO, + 0, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER, + SRCVERSION_ZERO, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + }, + { + VER_SUITENAME, + SRCVERSION_ZERO, + 0, + + VER_SUITENAME, VER_AND, + }, + { + VER_SUITENAME, + SRCVERSION_ZERO, + 0, + + VER_SUITENAME, VER_OR, + }, + { + VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MINOR, + ERROR_OLD_WIN_VERSION, + + VER_MINORVERSION, VER_GREATER_EQUAL, + }, + { + VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + 0, + + VER_MINORVERSION, VER_LESS, + }, + { + VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + 0, + + VER_MINORVERSION, VER_LESS_EQUAL, + }, + { + VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + ERROR_OLD_WIN_VERSION, + + VER_MINORVERSION, VER_EQUAL, + }, + { + VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_SP_MAJOR, + ERROR_OLD_WIN_VERSION, + + VER_MINORVERSION, VER_GREATER_EQUAL, + }, + { + VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_MINOR, + ERROR_OLD_WIN_VERSION, + + VER_MINORVERSION, VER_GREATER_EQUAL, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_MINOR, + ERROR_OLD_WIN_VERSION, + + VER_MINORVERSION, VER_GREATER_EQUAL, + }, + { + VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_CURRENT, + 0, + + VER_MINORVERSION, VER_GREATER_EQUAL, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_BUILD, + ERROR_OLD_WIN_VERSION, + + VER_MINORVERSION, VER_GREATER_EQUAL, + }, + { + VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_INC_BUILD, + 0, + + VER_MINORVERSION, VER_GREATER_EQUAL, + }, + { + VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_DEC_SP_MAJOR | SRCVERSION_REQUIRES_SP, + 0, + + VER_MINORVERSION, VER_GREATER, + }, + { + VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_DEC_SP_MAJOR | SRCVERSION_REQUIRES_SP, + 0, + + VER_MINORVERSION, VER_GREATER_EQUAL, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_DEC_SP_MAJOR | SRCVERSION_REQUIRES_SP, + ERROR_OLD_WIN_VERSION, + + VER_MAJORVERSION, VER_EQUAL, + VER_SERVICEPACKMAJOR, VER_GREATER, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_DEC_SP_MAJOR | SRCVERSION_REQUIRES_SP, + 0, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + VER_MINORVERSION, VER_EQUAL, + VER_SERVICEPACKMAJOR, VER_GREATER, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_DEC_SP_MAJOR | SRCVERSION_REQUIRES_SP, + 0, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + VER_MINORVERSION, VER_LESS_EQUAL, + VER_SERVICEPACKMAJOR, VER_GREATER, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_DEC_SP_MAJOR | SRCVERSION_REQUIRES_SP, + 0, + + VER_MAJORVERSION, VER_GREATER_EQUAL, + VER_MINORVERSION, VER_AND, + VER_SERVICEPACKMAJOR, VER_GREATER, + }, + { + VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + SRCVERSION_DEC_SP_MAJOR | SRCVERSION_REQUIRES_SP, + ERROR_OLD_WIN_VERSION, + + VER_SERVICEPACKMAJOR, VER_GREATER, + VER_SERVICEPACKMINOR, VER_EQUAL, + }, + }; + + OSVERSIONINFOEXA info; + DWORD servicepack; + unsigned int i; + BOOL ret; /* Before we start doing some tests we should check what the version of * the ServicePack is. Tests on a box with no ServicePack will fail otherwise. @@ -179,13 +609,15 @@ static void test_VerifyVersionInfo(void) info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); GetVersionExA((OSVERSIONINFOA *)&info); servicepack = info.wServicePackMajor; + if (servicepack == 0) + skip("There is no ServicePack on this system. Some tests will be skipped.\n"); /* Win8.1+ returns Win8 version in GetVersionEx when there's no app manifest targeting 8.1 */ if (info.dwMajorVersion == 6 && info.dwMinorVersion == 2) { RTL_OSVERSIONINFOEXW rtlinfo; rtlinfo.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW); - ok(SUCCEEDED(pRtlGetVersion(&rtlinfo)), "RtlGetVersion failed\n"); + ok(!pRtlGetVersion(&rtlinfo), "RtlGetVersion failed\n"); if (rtlinfo.dwMajorVersion != 6 || rtlinfo.dwMinorVersion != 2) { @@ -194,34 +626,65 @@ static void test_VerifyVersionInfo(void) } } - memset(&info, 0, sizeof(info)); + for (i = 0; i < sizeof(verify_version_tests)/sizeof(verify_version_tests[0]); i++) + { + struct verify_version_test *test = &verify_version_tests[i]; + DWORD srcinfo = test->srcinfo; + ULONGLONG mask; - ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION, - pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL)); - ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + if (servicepack == 0 && srcinfo & SRCVERSION_REQUIRES_SP) + continue; + srcinfo &= ~SRCVERSION_REQUIRES_SP; - SetLastError(0xdeadbeef); - ret = pVerifyVersionInfoA(&info, VER_BUILDNUMBER | VER_MAJORVERSION | - VER_MINORVERSION/* | VER_PLATFORMID | VER_SERVICEPACKMAJOR | - VER_SERVICEPACKMINOR | VER_SUITENAME | VER_PRODUCT_TYPE */, - pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL)); - error = GetLastError(); - ok(!ret, "VerifyVersionInfoA succeeded\n"); - ok(error == ERROR_OLD_WIN_VERSION, - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); + info.dwOSVersionInfoSize = sizeof(info); + GetVersionExA((OSVERSIONINFOA *)&info); - /* tests special handling of VER_SUITENAME */ + switch (srcinfo) + { + case SRCVERSION_ZERO: + memset(&info, 0, sizeof(info)); + break; + case SRCVERSION_INC_MINOR: + info.dwMinorVersion++; + break; + case SRCVERSION_INC_SP_MINOR: + info.wServicePackMinor++; + break; + case SRCVERSION_INC_SP_MAJOR: + info.wServicePackMajor++; + break; + case SRCVERSION_DEC_SP_MAJOR: + info.wServicePackMajor--; + break; + case SRCVERSION_DEC_MAJOR: + info.dwMajorVersion--; + break; + case SRCVERSION_INC_BUILD: + info.dwBuildNumber++; + break; + default: + ; + } - ret = pVerifyVersionInfoA(&info, VER_SUITENAME, - pVerSetConditionMask(0, VER_SUITENAME, VER_AND)); - ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + mask = VerSetConditionMask(0, test->typemask1, test->condition1); + if (test->typemask2) + mask = VerSetConditionMask(mask, test->typemask2, test->condition2); + if (test->typemask3) + mask = VerSetConditionMask(mask, test->typemask3, test->condition3); + if (test->typemask4) + mask = VerSetConditionMask(mask, test->typemask4, test->condition4); - ret = pVerifyVersionInfoA(&info, VER_SUITENAME, - pVerSetConditionMask(0, VER_SUITENAME, VER_OR)); - ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = VerifyVersionInfoA(&info, test->verifymask, mask); + todo_wine_if(test->todo) + { + ok(test->err ? !ret : ret, "%u: unexpected return value %d.\n", i, ret); + if (!ret) + ok(GetLastError() == test->err, "%u: unexpected error code %d, expected %d.\n", i, GetLastError(), test->err); + } + } /* test handling of version numbers */ - /* v3.10 is always less than v4.x even * if the minor version is tested */ info.dwMajorVersion = 3; @@ -245,124 +708,13 @@ static void test_VerifyVersionInfo(void) VER_MAJORVERSION, VER_GREATER_EQUAL)); ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); - GetVersionExA((OSVERSIONINFOA *)&info); - info.wServicePackMinor++; - SetLastError(0xdeadbeef); - ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, - pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - error = GetLastError(); - ok(!ret, "VerifyVersionInfoA succeeded\n"); - ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some wink2 */, - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); - - if (servicepack == 0) - { - skip("There is no ServicePack on this system\n"); - } - else - { - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); - GetVersionExA((OSVERSIONINFOA *)&info); - info.wServicePackMajor--; - ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, - pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER)); - ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); - - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); - GetVersionExA((OSVERSIONINFOA *)&info); - info.wServicePackMajor--; - ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, - pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); - } - - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); - GetVersionExA((OSVERSIONINFOA *)&info); - info.wServicePackMajor++; - ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, - pVerSetConditionMask(0, VER_MINORVERSION, VER_LESS)); - ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); - - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); - GetVersionExA((OSVERSIONINFOA *)&info); - info.wServicePackMajor++; - ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, - pVerSetConditionMask(0, VER_MINORVERSION, VER_LESS_EQUAL)); - ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); - - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); - GetVersionExA((OSVERSIONINFOA *)&info); - info.wServicePackMajor--; - SetLastError(0xdeadbeef); - ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, - pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL)); - error = GetLastError(); - ok(!ret, "VerifyVersionInfoA succeeded\n"); - ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); - - /* test the failure hierarchy for the four version fields */ - - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); - GetVersionExA((OSVERSIONINFOA *)&info); - info.wServicePackMajor++; - SetLastError(0xdeadbeef); - ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, - pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - error = GetLastError(); - ok(!ret, "VerifyVersionInfoA succeeded\n"); - ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); - - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); - GetVersionExA((OSVERSIONINFOA *)&info); - info.dwMinorVersion++; - SetLastError(0xdeadbeef); - ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, - pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - error = GetLastError(); - ok(!ret, "VerifyVersionInfoA succeeded\n"); - ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); - - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); - GetVersionExA((OSVERSIONINFOA *)&info); - info.dwMajorVersion++; - SetLastError(0xdeadbeef); - ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, - pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - error = GetLastError(); - ok(!ret, "VerifyVersionInfoA succeeded\n"); - ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); - - ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, - pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); - - info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); - GetVersionExA((OSVERSIONINFOA *)&info); - info.dwBuildNumber++; - SetLastError(0xdeadbeef); - ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, - pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - error = GetLastError(); - ok(!ret, "VerifyVersionInfoA succeeded\n"); - ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); - - ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, - pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); - ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); - /* test bad dwOSVersionInfoSize */ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); GetVersionExA((OSVERSIONINFOA *)&info); info.dwOSVersionInfoSize = 0; ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL)); - ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); } START_TEST(version)