michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef mozilla_WindowsVersion_h michael@0: #define mozilla_WindowsVersion_h michael@0: michael@0: #include "mozilla/Attributes.h" michael@0: #include michael@0: #include michael@0: michael@0: namespace mozilla michael@0: { michael@0: inline bool michael@0: IsWindowsVersionOrLater(uint32_t aVersion) michael@0: { michael@0: static uint32_t minVersion = 0; michael@0: static uint32_t maxVersion = UINT32_MAX; michael@0: michael@0: if (minVersion >= aVersion) { michael@0: return true; michael@0: } michael@0: michael@0: if (aVersion >= maxVersion) { michael@0: return false; michael@0: } michael@0: michael@0: OSVERSIONINFOEX info; michael@0: ZeroMemory(&info, sizeof(OSVERSIONINFOEX)); michael@0: info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); michael@0: info.dwMajorVersion = aVersion >> 24; michael@0: info.dwMinorVersion = (aVersion >> 16) & 0xFF; michael@0: info.wServicePackMajor = (aVersion >> 8) & 0xFF; michael@0: info.wServicePackMinor = aVersion & 0xFF; michael@0: michael@0: DWORDLONG conditionMask = 0; michael@0: VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL); michael@0: VER_SET_CONDITION(conditionMask, VER_MINORVERSION, VER_GREATER_EQUAL); michael@0: VER_SET_CONDITION(conditionMask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL); michael@0: VER_SET_CONDITION(conditionMask, VER_SERVICEPACKMINOR, VER_GREATER_EQUAL); michael@0: michael@0: if (VerifyVersionInfo(&info, michael@0: VER_MAJORVERSION | VER_MINORVERSION | michael@0: VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, michael@0: conditionMask)) { michael@0: minVersion = aVersion; michael@0: return true; michael@0: } michael@0: michael@0: maxVersion = aVersion; michael@0: return false; michael@0: } michael@0: michael@0: inline bool michael@0: IsWindowsBuildOrLater(uint32_t aBuild) michael@0: { michael@0: static uint32_t minBuild = 0; michael@0: static uint32_t maxBuild = UINT32_MAX; michael@0: michael@0: if (minBuild >= aBuild) { michael@0: return true; michael@0: } michael@0: michael@0: if (aBuild >= maxBuild) { michael@0: return false; michael@0: } michael@0: michael@0: OSVERSIONINFOEX info; michael@0: ZeroMemory(&info, sizeof(OSVERSIONINFOEX)); michael@0: info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); michael@0: info.dwBuildNumber = aBuild; michael@0: michael@0: DWORDLONG conditionMask = 0; michael@0: VER_SET_CONDITION(conditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL); michael@0: michael@0: if (VerifyVersionInfo(&info, VER_BUILDNUMBER, conditionMask)) { michael@0: minBuild = aBuild; michael@0: return true; michael@0: } michael@0: michael@0: maxBuild = aBuild; michael@0: return false; michael@0: } michael@0: michael@0: MOZ_ALWAYS_INLINE bool michael@0: IsXPSP3OrLater() michael@0: { return IsWindowsVersionOrLater(0x05010300ul); } michael@0: michael@0: MOZ_ALWAYS_INLINE bool michael@0: IsWin2003OrLater() michael@0: { return IsWindowsVersionOrLater(0x05020000ul); } michael@0: michael@0: MOZ_ALWAYS_INLINE bool michael@0: IsWin2003SP2OrLater() michael@0: { return IsWindowsVersionOrLater(0x05020200ul); } michael@0: michael@0: MOZ_ALWAYS_INLINE bool michael@0: IsVistaOrLater() michael@0: { return IsWindowsVersionOrLater(0x06000000ul); } michael@0: michael@0: MOZ_ALWAYS_INLINE bool michael@0: IsVistaSP1OrLater() michael@0: { return IsWindowsVersionOrLater(0x06000100ul); } michael@0: michael@0: MOZ_ALWAYS_INLINE bool michael@0: IsWin7OrLater() michael@0: { return IsWindowsVersionOrLater(0x06010000ul); } michael@0: michael@0: MOZ_ALWAYS_INLINE bool michael@0: IsWin7SP1OrLater() michael@0: { return IsWindowsVersionOrLater(0x06010100ul); } michael@0: michael@0: MOZ_ALWAYS_INLINE bool michael@0: IsWin8OrLater() michael@0: { return IsWindowsVersionOrLater(0x06020000ul); } michael@0: michael@0: MOZ_ALWAYS_INLINE bool michael@0: IsNotWin7PreRTM() michael@0: { michael@0: return IsWin7SP1OrLater() || !IsWin7OrLater() || michael@0: IsWindowsBuildOrLater(7600); michael@0: } michael@0: } michael@0: michael@0: #endif /* mozilla_WindowsVersion_h */