text: /******************************************************************
  *                                                                 *
  *  VersionHelpers.h -- This module defines helper functions to    *
  *                      promote version check with proper          *
  *                      comparisons.                               *
  *                                                                 *
  *  Copyright (c) Microsoft Corp.  All rights reserved.            *
  *                                                                 *
  ******************************************************************/
  #ifndef _versionhelpers_H_INCLUDED_
  #define _versionhelpers_H_INCLUDED_
  
  #include <winapifamily.h>
  
  #ifdef _MSC_VER
  #pragma once
  #endif  // _MSC_VER
  
  #pragma region Application Family
  #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
  
  #include <specstrings.h>    // for _In_, etc.
  
  #if !defined(__midl) && !defined(SORTPP_PASS)
  
  #if (NTDDI_VERSION >= NTDDI_WINXP)
  
  #ifdef __cplusplus
  
  #define VERSIONHELPERAPI inline bool
  
  #else  // __cplusplus
  
  #define VERSIONHELPERAPI FORCEINLINE BOOL
  
  #endif // __cplusplus
  
  VERSIONHELPERAPI
  IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor)
  {
      OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 };
      DWORDLONG        const dwlConditionMask = VerSetConditionMask(
          VerSetConditionMask(
          VerSetConditionMask(
              0, VER_MAJORVERSION, VER_GREATER_EQUAL),
                 VER_MINORVERSION, VER_GREATER_EQUAL),
                 VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
  
      osvi.dwMajorVersion = wMajorVersion;
      osvi.dwMinorVersion = wMinorVersion;
      osvi.wServicePackMajor = wServicePackMajor;
  
      return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
  }
  
  VERSIONHELPERAPI
  IsWindowsXPOrGreater()
  {
      return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0);
  }
  
  VERSIONHELPERAPI
  IsWindowsXPSP1OrGreater()
  {
      return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 1);
  }
  
  VERSIONHELPERAPI
  IsWindowsXPSP2OrGreater()
  {
      return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 2);
  }
  
  VERSIONHELPERAPI
  IsWindowsXPSP3OrGreater()
  {
      return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 3);
  }
  
  VERSIONHELPERAPI
  IsWindowsVistaOrGreater()
  {
      return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0);
  }
  
  VERSIONHELPERAPI
  IsWindowsVistaSP1OrGreater()
  {
      return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 1);
  }
  
  VERSIONHELPERAPI
  IsWindowsVistaSP2OrGreater()
  {
      return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 2);
  }
  
  VERSIONHELPERAPI
  IsWindows7OrGreater()
  {
      return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0);
  }
  
  VERSIONHELPERAPI
  IsWindows7SP1OrGreater()
  {
      return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 1);
  }
  
  VERSIONHELPERAPI
  IsWindows8OrGreater()
  {
      return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0);
  }
  
  VERSIONHELPERAPI
  IsWindows8Point1OrGreater()
  {
      return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0);
  }
  
  VERSIONHELPERAPI
  IsWindowsServer()
  {
      OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0, 0, VER_NT_WORKSTATION };
      DWORDLONG        const dwlConditionMask = VerSetConditionMask( 0, VER_PRODUCT_TYPE, VER_EQUAL );
  
      return !VerifyVersionInfoW(&osvi, VER_PRODUCT_TYPE, dwlConditionMask);
  }
  
  #endif // NTDDI_VERSION
  
  #endif // defined(__midl)
  
  #endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
  #pragma endregion
  
  #endif // _VERSIONHELPERS_H_INCLUDED_
  