/* * @implemented */ BOOL WINAPI VerifyVersionInfoW(IN LPOSVERSIONINFOEXW lpVersionInformation, IN DWORD dwTypeMask, IN DWORDLONG dwlConditionMask) { NTSTATUS Status; Status = RtlVerifyVersionInfo((PRTL_OSVERSIONINFOEXW)lpVersionInformation, dwTypeMask, dwlConditionMask); switch (Status) { case STATUS_INVALID_PARAMETER: SetLastError(ERROR_BAD_ARGUMENTS); return FALSE; case STATUS_REVISION_MISMATCH: DPRINT1("VerifyVersionInfo -- Version mismatch\n"); SetLastError(ERROR_OLD_WIN_VERSION); return FALSE; default: /* RtlVerifyVersionInfo shouldn't report any other failure code! */ ASSERT(NT_SUCCESS(Status)); return TRUE; } }
VOID DetectOSVersion() /*++ Routine Description: This routine determines the OS version and initializes some globals used in the sample. Arguments: None Return value: None. On failure, global variables stay at default value --*/ { RTL_OSVERSIONINFOEXW VersionInfo = {0}; NTSTATUS Status; ULONGLONG ConditionMask = 0; // // Set VersionInfo to Win7's version number and then use // RtlVerifVersionInfo to see if this is win8 or greater. // VersionInfo.dwOSVersionInfoSize = sizeof(VersionInfo); VersionInfo.dwMajorVersion = 6; VersionInfo.dwMinorVersion = 1; VER_SET_CONDITION(ConditionMask, VER_MAJORVERSION, VER_LESS_EQUAL); VER_SET_CONDITION(ConditionMask, VER_MINORVERSION, VER_LESS_EQUAL); Status = RtlVerifyVersionInfo(&VersionInfo, VER_MAJORVERSION | VER_MINORVERSION, ConditionMask); if (NT_SUCCESS(Status)) { g_IsWin8OrGreater = FALSE; InfoPrint("DetectOSVersion: This machine is running Windows 7 or an older OS."); } else if (Status == STATUS_REVISION_MISMATCH) { g_IsWin8OrGreater = TRUE; InfoPrint("DetectOSVersion: This machine is running Windows 8 or a newer OS."); } else { ErrorPrint("RtlVerifyVersionInfo returned unexpected error status 0x%x.", Status); // // default action is to assume this is not win8 // g_IsWin8OrGreater = FALSE; } }
// Checks whether we are on at least the specified build of Windows 10 // BOOL _glfwIsWindows10BuildOrGreaterWin32(WORD build) { OSVERSIONINFOEXW osvi = { sizeof(osvi), 10, 0, build }; DWORD mask = VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER; ULONGLONG cond = VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL); cond = VerSetConditionMask(cond, VER_MINORVERSION, VER_GREATER_EQUAL); cond = VerSetConditionMask(cond, VER_BUILDNUMBER, VER_GREATER_EQUAL); // HACK: Use RtlVerifyVersionInfo instead of VerifyVersionInfoW as the // latter lies unless the user knew to embedd a non-default manifest // announcing support for Windows 10 via supportedOS GUID return RtlVerifyVersionInfo(&osvi, mask, cond) == 0; }
/****************************************************************************** * VerifyVersionInfoW (KERNEL32.@) */ BOOL WINAPI VerifyVersionInfoW( LPOSVERSIONINFOEXW lpVersionInfo, DWORD dwTypeMask, DWORDLONG dwlConditionMask) { switch(RtlVerifyVersionInfo( lpVersionInfo, dwTypeMask, dwlConditionMask )) { case STATUS_INVALID_PARAMETER: SetLastError( ERROR_BAD_ARGUMENTS ); return FALSE; case STATUS_REVISION_MISMATCH: SetLastError( ERROR_OLD_WIN_VERSION ); return FALSE; } return TRUE; }
/* * @implemented */ BOOL WINAPI VerifyVersionInfoW(IN LPOSVERSIONINFOEXW lpVersionInformation, IN DWORD dwTypeMask, IN DWORDLONG dwlConditionMask) { NTSTATUS Status; Status = RtlVerifyVersionInfo((PRTL_OSVERSIONINFOEXW)lpVersionInformation, dwTypeMask, dwlConditionMask); switch (Status) { case STATUS_INVALID_PARAMETER: SetLastError(ERROR_BAD_ARGUMENTS); return FALSE; case STATUS_REVISION_MISMATCH: if (lpVersionInformation) { DPRINT1("VerifyVersionInfo -- Version mismatch(%d.%d.%d:%d)\n", (dwTypeMask & VER_MAJORVERSION) ? lpVersionInformation->dwMajorVersion : -1, (dwTypeMask & VER_MINORVERSION) ? lpVersionInformation->dwMinorVersion : -1, (dwTypeMask & VER_BUILDNUMBER) ? lpVersionInformation->dwBuildNumber : -1, (dwTypeMask & VER_PLATFORMID) ? lpVersionInformation->dwPlatformId : -1); } else { DPRINT1("VerifyVersionInfo -- Version mismatch(NULL)\n"); } SetLastError(ERROR_OLD_WIN_VERSION); return FALSE; default: /* RtlVerifyVersionInfo shouldn't report any other failure code! */ ASSERT(NT_SUCCESS(Status)); return TRUE; } }