Reactos
1/*
2 * versionhelpers.h
3 *
4 * Inline helper functions for Windows version detection
5 *
6 * This file is part of the ReactOS PSDK package.
7 *
8 * Contributors:
9 * Created by Timo Kreuzer <timo.kreuzer@reactos.org>
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 */
22
23#pragma once
24#define _versionhelpers_H_INCLUDED_
25
26#include <specstrings.h>
27
28#ifdef __cplusplus
29#define VERSIONHELPERAPI inline bool
30#else
31#define VERSIONHELPERAPI FORCEINLINE BOOL
32#endif
33
34VERSIONHELPERAPI
35IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor)
36{
37 OSVERSIONINFOEXW osvi = { sizeof(osvi), wMajorVersion, wMinorVersion, 0, 0, {0}, wServicePackMajor, 0, 0, 0, 0 };
38 DWORDLONG dwlConditionMask = VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL);
39 dwlConditionMask = VerSetConditionMask(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
40 dwlConditionMask = VerSetConditionMask(dwlConditionMask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
41
42 return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
43}
44
45VERSIONHELPERAPI
46IsWindowsXPOrGreater()
47{
48 return IsWindowsVersionOrGreater(5, 1, 0);
49}
50
51VERSIONHELPERAPI
52IsWindowsXPSP1OrGreater()
53{
54 return IsWindowsVersionOrGreater(5, 1, 1);
55}
56
57VERSIONHELPERAPI
58IsWindowsXPSP2OrGreater()
59{
60 return IsWindowsVersionOrGreater(5, 1, 2);
61}
62
63VERSIONHELPERAPI
64IsWindowsXPSP3OrGreater()
65{
66 return IsWindowsVersionOrGreater(5, 1, 3);
67}
68
69VERSIONHELPERAPI
70IsWindowsVistaOrGreater()
71{
72 return IsWindowsVersionOrGreater(6, 0, 0);
73}
74
75VERSIONHELPERAPI
76IsWindowsVistaSP1OrGreater()
77{
78 return IsWindowsVersionOrGreater(6, 0, 1);
79}
80
81VERSIONHELPERAPI
82IsWindowsVistaSP2OrGreater()
83{
84 return IsWindowsVersionOrGreater(6, 0, 2);
85}
86
87VERSIONHELPERAPI
88IsWindows7OrGreater()
89{
90 return IsWindowsVersionOrGreater(6, 1, 0);
91}
92
93VERSIONHELPERAPI
94IsWindows7SP1OrGreater()
95{
96 return IsWindowsVersionOrGreater(6, 1, 1);
97}
98
99VERSIONHELPERAPI
100IsWindows8OrGreater()
101{
102 return IsWindowsVersionOrGreater(6, 2, 0);
103}
104
105VERSIONHELPERAPI
106IsWindows8Point1OrGreater()
107{
108 return IsWindowsVersionOrGreater(6, 3, 0);
109}
110
111VERSIONHELPERAPI
112IsWindowsThresholdOrGreater()
113{
114 return IsWindowsVersionOrGreater(10, 0, 0);
115}
116
117VERSIONHELPERAPI
118IsWindows10OrGreater()
119{
120 return IsWindowsVersionOrGreater(10, 0, 0);
121}
122
123VERSIONHELPERAPI
124IsWindowsServer()
125{
126 OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0, 0, VER_NT_WORKSTATION };
127 DWORDLONG const dwlConditionMask = VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL);
128 return VerifyVersionInfoW(&osvi, VER_PRODUCT_TYPE, dwlConditionMask) == FALSE;
129}
130
131VERSIONHELPERAPI
132IsActiveSessionCountLimited()
133{
134 OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0, 0, 0, 0 };
135 DWORDLONG dwlConditionMask = VerSetConditionMask(0, VER_SUITENAME, VER_AND);
136 BOOL fSuiteTerminal, fSuiteSingleUserTS;
137
138 osvi.wSuiteMask = VER_SUITE_TERMINAL;
139 fSuiteTerminal = VerifyVersionInfoW(&osvi, VER_SUITENAME, dwlConditionMask);
140
141 osvi.wSuiteMask = VER_SUITE_SINGLEUSERTS;
142 fSuiteSingleUserTS = VerifyVersionInfoW(&osvi, VER_SUITENAME, dwlConditionMask);
143
144 return !(fSuiteTerminal & !fSuiteSingleUserTS);
145}
146
147#ifdef __REACTOS__
148VERSIONHELPERAPI
149IsReactOS()
150{
151 /* Hardcoded SharedUserData and PAGE_SIZE to avoid NDK includes */
152 return *(UINT*)((ULONG_PTR)0x7FFE0000 + 4096 - sizeof(ULONG)) == 0x8EAC705;
153}
154#endif // __REACTOS__