WindowsVersion.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* vim: set ts=8 sts=2 et sw=2 tw=80: */
  3. /* This Source Code Form is subject to the terms of the Mozilla Public
  4. * License, v. 2.0. If a copy of the MPL was not distributed with this
  5. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6. #ifndef mozilla_WindowsVersion_h
  7. #define mozilla_WindowsVersion_h
  8. #include "mozilla/Attributes.h"
  9. #include <stdint.h>
  10. #include <windows.h>
  11. namespace mozilla {
  12. inline bool
  13. IsWindowsVersionOrLater(uint32_t aVersion)
  14. {
  15. static uint32_t minVersion = 0;
  16. static uint32_t maxVersion = UINT32_MAX;
  17. if (minVersion >= aVersion) {
  18. return true;
  19. }
  20. if (aVersion >= maxVersion) {
  21. return false;
  22. }
  23. OSVERSIONINFOEX info;
  24. ZeroMemory(&info, sizeof(OSVERSIONINFOEX));
  25. info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
  26. info.dwMajorVersion = aVersion >> 24;
  27. info.dwMinorVersion = (aVersion >> 16) & 0xFF;
  28. info.wServicePackMajor = (aVersion >> 8) & 0xFF;
  29. info.wServicePackMinor = aVersion & 0xFF;
  30. DWORDLONG conditionMask = 0;
  31. VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
  32. VER_SET_CONDITION(conditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
  33. VER_SET_CONDITION(conditionMask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
  34. VER_SET_CONDITION(conditionMask, VER_SERVICEPACKMINOR, VER_GREATER_EQUAL);
  35. if (VerifyVersionInfo(&info,
  36. VER_MAJORVERSION | VER_MINORVERSION |
  37. VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
  38. conditionMask)) {
  39. minVersion = aVersion;
  40. return true;
  41. }
  42. maxVersion = aVersion;
  43. return false;
  44. }
  45. inline bool
  46. IsWindowsBuildOrLater(uint32_t aBuild)
  47. {
  48. static uint32_t minBuild = 0;
  49. static uint32_t maxBuild = UINT32_MAX;
  50. if (minBuild >= aBuild) {
  51. return true;
  52. }
  53. if (aBuild >= maxBuild) {
  54. return false;
  55. }
  56. OSVERSIONINFOEX info;
  57. ZeroMemory(&info, sizeof(OSVERSIONINFOEX));
  58. info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
  59. info.dwBuildNumber = aBuild;
  60. DWORDLONG conditionMask = 0;
  61. VER_SET_CONDITION(conditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
  62. if (VerifyVersionInfo(&info, VER_BUILDNUMBER, conditionMask)) {
  63. minBuild = aBuild;
  64. return true;
  65. }
  66. maxBuild = aBuild;
  67. return false;
  68. }
  69. #if defined(_M_X64) || defined(_M_AMD64)
  70. // We support only Win7 or later on Win64.
  71. MOZ_ALWAYS_INLINE bool
  72. IsXPSP3OrLater()
  73. {
  74. return true;
  75. }
  76. MOZ_ALWAYS_INLINE bool
  77. IsWin2003OrLater()
  78. {
  79. return true;
  80. }
  81. MOZ_ALWAYS_INLINE bool
  82. IsWin2003SP2OrLater()
  83. {
  84. return true;
  85. }
  86. MOZ_ALWAYS_INLINE bool
  87. IsVistaOrLater()
  88. {
  89. return true;
  90. }
  91. MOZ_ALWAYS_INLINE bool
  92. IsVistaSP1OrLater()
  93. {
  94. return true;
  95. }
  96. MOZ_ALWAYS_INLINE bool
  97. IsWin7OrLater()
  98. {
  99. return true;
  100. }
  101. #else
  102. MOZ_ALWAYS_INLINE bool
  103. IsXPSP3OrLater()
  104. {
  105. return IsWindowsVersionOrLater(0x05010300ul);
  106. }
  107. MOZ_ALWAYS_INLINE bool
  108. IsWin2003OrLater()
  109. {
  110. return IsWindowsVersionOrLater(0x05020000ul);
  111. }
  112. MOZ_ALWAYS_INLINE bool
  113. IsWin2003SP2OrLater()
  114. {
  115. return IsWindowsVersionOrLater(0x05020200ul);
  116. }
  117. MOZ_ALWAYS_INLINE bool
  118. IsVistaOrLater()
  119. {
  120. return IsWindowsVersionOrLater(0x06000000ul);
  121. }
  122. MOZ_ALWAYS_INLINE bool
  123. IsVistaSP1OrLater()
  124. {
  125. return IsWindowsVersionOrLater(0x06000100ul);
  126. }
  127. MOZ_ALWAYS_INLINE bool
  128. IsWin7OrLater()
  129. {
  130. return IsWindowsVersionOrLater(0x06010000ul);
  131. }
  132. #endif
  133. MOZ_ALWAYS_INLINE bool
  134. IsWin7SP1OrLater()
  135. {
  136. return IsWindowsVersionOrLater(0x06010100ul);
  137. }
  138. MOZ_ALWAYS_INLINE bool
  139. IsWin8OrLater()
  140. {
  141. return IsWindowsVersionOrLater(0x06020000ul);
  142. }
  143. MOZ_ALWAYS_INLINE bool
  144. IsWin8Point1OrLater()
  145. {
  146. return IsWindowsVersionOrLater(0x06030000ul);
  147. }
  148. MOZ_ALWAYS_INLINE bool
  149. IsWin10OrLater()
  150. {
  151. return IsWindowsVersionOrLater(0x0a000000ul);
  152. }
  153. MOZ_ALWAYS_INLINE bool
  154. IsNotWin7PreRTM()
  155. {
  156. return IsWin7SP1OrLater() || !IsWin7OrLater() ||
  157. IsWindowsBuildOrLater(7600);
  158. }
  159. } // namespace mozilla
  160. #endif /* mozilla_WindowsVersion_h */