BOOL CALLBACK VersionCheckInitOnceCallback(PINIT_ONCE, PVOID, PVOID*) { typedef NTSTATUS(WINAPI * pfnRtlGetVersion)(PRTL_OSVERSIONINFOEXW lpVersionInformation); NTSTATUS status = STATUS_DLL_NOT_FOUND; HMODULE hNTDll = LoadLibraryW(L"ntdll.dll"); OVR_ASSERT(hNTDll); if (hNTDll) { status = STATUS_ENTRYPOINT_NOT_FOUND; pfnRtlGetVersion pRtlGetVersion = (pfnRtlGetVersion)GetProcAddress(hNTDll, "RtlGetVersion"); OVR_ASSERT(pRtlGetVersion); if (pRtlGetVersion) { RTL_OSVERSIONINFOEXW OSVersionInfoEx; OSVersionInfoEx.dwOSVersionInfoSize = sizeof(OSVersionInfoEx); status = pRtlGetVersion(&OSVersionInfoEx); OVR_ASSERT(status == 0); if (status == 0) { OSVersion = OSVersionInfoEx.dwMajorVersion * 100 + OSVersionInfoEx.dwMinorVersion; OSBuildNumber = OSVersionInfoEx.dwBuildNumber; } } FreeLibrary(hNTDll); } if (status != 0) { LogError("[VersionCheckInitOnceCallback] Failed to obtain OS version information. 0x%08x\n", status); } return (status == 0); }
static void test_VerifyVersionInfo(void) { OSVERSIONINFOEXA info; BOOL ret; DWORD servicepack, error; if(!pVerifyVersionInfoA || !pVerSetConditionMask) { win_skip("Needed functions not available\n"); return; } /* 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. */ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); GetVersionExA((OSVERSIONINFOA *)&info); servicepack = info.wServicePackMajor; /* 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"); if (rtlinfo.dwMajorVersion != 6 || rtlinfo.dwMinorVersion != 2) { win_skip("GetVersionEx and VerifyVersionInfo are faking values\n"); return; } } memset(&info, 0, sizeof(info)); ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION, pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL)); ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); 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); /* tests special handling of VER_SUITENAME */ ret = pVerifyVersionInfoA(&info, VER_SUITENAME, pVerSetConditionMask(0, VER_SUITENAME, VER_AND)); ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ret = pVerifyVersionInfoA(&info, VER_SUITENAME, pVerSetConditionMask(0, VER_SUITENAME, VER_OR)); ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); /* test handling of version numbers */ /* v3.10 is always less than v4.x even * if the minor version is tested */ info.dwMajorVersion = 3; info.dwMinorVersion = 10; ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL), VER_MAJORVERSION, VER_GREATER_EQUAL)); ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); info.dwMinorVersion = 0; info.wServicePackMajor = 10; ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL), VER_MAJORVERSION, VER_GREATER_EQUAL)); ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); info.wServicePackMajor = 0; info.wServicePackMinor = 10; ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL), 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()); }