1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _
3*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| |
4*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___
6*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker *
8*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Steve Holme, <[email protected]>.
9*6236dae4SAndroid Build Coastguard Worker *
10*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker *
14*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker *
18*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker *
21*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker *
23*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker
25*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h"
26*6236dae4SAndroid Build Coastguard Worker
27*6236dae4SAndroid Build Coastguard Worker #if defined(_WIN32)
28*6236dae4SAndroid Build Coastguard Worker
29*6236dae4SAndroid Build Coastguard Worker #include <curl/curl.h>
30*6236dae4SAndroid Build Coastguard Worker #include "version_win32.h"
31*6236dae4SAndroid Build Coastguard Worker #include "warnless.h"
32*6236dae4SAndroid Build Coastguard Worker
33*6236dae4SAndroid Build Coastguard Worker /* The last 2 #include files should be in this order */
34*6236dae4SAndroid Build Coastguard Worker #ifdef BUILDING_LIBCURL
35*6236dae4SAndroid Build Coastguard Worker #include "curl_memory.h"
36*6236dae4SAndroid Build Coastguard Worker #endif
37*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h"
38*6236dae4SAndroid Build Coastguard Worker
39*6236dae4SAndroid Build Coastguard Worker /* This Unicode version struct works for VerifyVersionInfoW (OSVERSIONINFOEXW)
40*6236dae4SAndroid Build Coastguard Worker and RtlVerifyVersionInfo (RTLOSVERSIONINFOEXW) */
41*6236dae4SAndroid Build Coastguard Worker struct OUR_OSVERSIONINFOEXW {
42*6236dae4SAndroid Build Coastguard Worker ULONG dwOSVersionInfoSize;
43*6236dae4SAndroid Build Coastguard Worker ULONG dwMajorVersion;
44*6236dae4SAndroid Build Coastguard Worker ULONG dwMinorVersion;
45*6236dae4SAndroid Build Coastguard Worker ULONG dwBuildNumber;
46*6236dae4SAndroid Build Coastguard Worker ULONG dwPlatformId;
47*6236dae4SAndroid Build Coastguard Worker WCHAR szCSDVersion[128];
48*6236dae4SAndroid Build Coastguard Worker USHORT wServicePackMajor;
49*6236dae4SAndroid Build Coastguard Worker USHORT wServicePackMinor;
50*6236dae4SAndroid Build Coastguard Worker USHORT wSuiteMask;
51*6236dae4SAndroid Build Coastguard Worker UCHAR wProductType;
52*6236dae4SAndroid Build Coastguard Worker UCHAR wReserved;
53*6236dae4SAndroid Build Coastguard Worker };
54*6236dae4SAndroid Build Coastguard Worker
55*6236dae4SAndroid Build Coastguard Worker /*
56*6236dae4SAndroid Build Coastguard Worker * curlx_verify_windows_version()
57*6236dae4SAndroid Build Coastguard Worker *
58*6236dae4SAndroid Build Coastguard Worker * This is used to verify if we are running on a specific Windows version.
59*6236dae4SAndroid Build Coastguard Worker *
60*6236dae4SAndroid Build Coastguard Worker * Parameters:
61*6236dae4SAndroid Build Coastguard Worker *
62*6236dae4SAndroid Build Coastguard Worker * majorVersion [in] - The major version number.
63*6236dae4SAndroid Build Coastguard Worker * minorVersion [in] - The minor version number.
64*6236dae4SAndroid Build Coastguard Worker * buildVersion [in] - The build version number. If 0, this parameter is
65*6236dae4SAndroid Build Coastguard Worker * ignored.
66*6236dae4SAndroid Build Coastguard Worker * platform [in] - The optional platform identifier.
67*6236dae4SAndroid Build Coastguard Worker * condition [in] - The test condition used to specifier whether we are
68*6236dae4SAndroid Build Coastguard Worker * checking a version less than, equal to or greater than
69*6236dae4SAndroid Build Coastguard Worker * what is specified in the major and minor version
70*6236dae4SAndroid Build Coastguard Worker * numbers.
71*6236dae4SAndroid Build Coastguard Worker *
72*6236dae4SAndroid Build Coastguard Worker * Returns TRUE if matched; otherwise FALSE.
73*6236dae4SAndroid Build Coastguard Worker */
curlx_verify_windows_version(const unsigned int majorVersion,const unsigned int minorVersion,const unsigned int buildVersion,const PlatformIdentifier platform,const VersionCondition condition)74*6236dae4SAndroid Build Coastguard Worker bool curlx_verify_windows_version(const unsigned int majorVersion,
75*6236dae4SAndroid Build Coastguard Worker const unsigned int minorVersion,
76*6236dae4SAndroid Build Coastguard Worker const unsigned int buildVersion,
77*6236dae4SAndroid Build Coastguard Worker const PlatformIdentifier platform,
78*6236dae4SAndroid Build Coastguard Worker const VersionCondition condition)
79*6236dae4SAndroid Build Coastguard Worker {
80*6236dae4SAndroid Build Coastguard Worker bool matched = FALSE;
81*6236dae4SAndroid Build Coastguard Worker
82*6236dae4SAndroid Build Coastguard Worker #if defined(CURL_WINDOWS_UWP)
83*6236dae4SAndroid Build Coastguard Worker /* We have no way to determine the Windows version from Windows apps,
84*6236dae4SAndroid Build Coastguard Worker so let's assume we are running on the target Windows version. */
85*6236dae4SAndroid Build Coastguard Worker const WORD fullVersion = MAKEWORD(minorVersion, majorVersion);
86*6236dae4SAndroid Build Coastguard Worker const WORD targetVersion = (WORD)_WIN32_WINNT;
87*6236dae4SAndroid Build Coastguard Worker
88*6236dae4SAndroid Build Coastguard Worker (void)buildVersion;
89*6236dae4SAndroid Build Coastguard Worker
90*6236dae4SAndroid Build Coastguard Worker switch(condition) {
91*6236dae4SAndroid Build Coastguard Worker case VERSION_LESS_THAN:
92*6236dae4SAndroid Build Coastguard Worker matched = targetVersion < fullVersion;
93*6236dae4SAndroid Build Coastguard Worker break;
94*6236dae4SAndroid Build Coastguard Worker
95*6236dae4SAndroid Build Coastguard Worker case VERSION_LESS_THAN_EQUAL:
96*6236dae4SAndroid Build Coastguard Worker matched = targetVersion <= fullVersion;
97*6236dae4SAndroid Build Coastguard Worker break;
98*6236dae4SAndroid Build Coastguard Worker
99*6236dae4SAndroid Build Coastguard Worker case VERSION_EQUAL:
100*6236dae4SAndroid Build Coastguard Worker matched = targetVersion == fullVersion;
101*6236dae4SAndroid Build Coastguard Worker break;
102*6236dae4SAndroid Build Coastguard Worker
103*6236dae4SAndroid Build Coastguard Worker case VERSION_GREATER_THAN_EQUAL:
104*6236dae4SAndroid Build Coastguard Worker matched = targetVersion >= fullVersion;
105*6236dae4SAndroid Build Coastguard Worker break;
106*6236dae4SAndroid Build Coastguard Worker
107*6236dae4SAndroid Build Coastguard Worker case VERSION_GREATER_THAN:
108*6236dae4SAndroid Build Coastguard Worker matched = targetVersion > fullVersion;
109*6236dae4SAndroid Build Coastguard Worker break;
110*6236dae4SAndroid Build Coastguard Worker }
111*6236dae4SAndroid Build Coastguard Worker
112*6236dae4SAndroid Build Coastguard Worker if(matched && (platform == PLATFORM_WINDOWS)) {
113*6236dae4SAndroid Build Coastguard Worker /* we are always running on PLATFORM_WINNT */
114*6236dae4SAndroid Build Coastguard Worker matched = FALSE;
115*6236dae4SAndroid Build Coastguard Worker }
116*6236dae4SAndroid Build Coastguard Worker #elif !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_WIN2K) || \
117*6236dae4SAndroid Build Coastguard Worker (_WIN32_WINNT < _WIN32_WINNT_WIN2K)
118*6236dae4SAndroid Build Coastguard Worker OSVERSIONINFO osver;
119*6236dae4SAndroid Build Coastguard Worker
120*6236dae4SAndroid Build Coastguard Worker memset(&osver, 0, sizeof(osver));
121*6236dae4SAndroid Build Coastguard Worker osver.dwOSVersionInfoSize = sizeof(osver);
122*6236dae4SAndroid Build Coastguard Worker
123*6236dae4SAndroid Build Coastguard Worker /* Find out Windows version */
124*6236dae4SAndroid Build Coastguard Worker if(GetVersionEx(&osver)) {
125*6236dae4SAndroid Build Coastguard Worker /* Verify the Operating System version number */
126*6236dae4SAndroid Build Coastguard Worker switch(condition) {
127*6236dae4SAndroid Build Coastguard Worker case VERSION_LESS_THAN:
128*6236dae4SAndroid Build Coastguard Worker if(osver.dwMajorVersion < majorVersion ||
129*6236dae4SAndroid Build Coastguard Worker (osver.dwMajorVersion == majorVersion &&
130*6236dae4SAndroid Build Coastguard Worker osver.dwMinorVersion < minorVersion) ||
131*6236dae4SAndroid Build Coastguard Worker (buildVersion != 0 &&
132*6236dae4SAndroid Build Coastguard Worker (osver.dwMajorVersion == majorVersion &&
133*6236dae4SAndroid Build Coastguard Worker osver.dwMinorVersion == minorVersion &&
134*6236dae4SAndroid Build Coastguard Worker osver.dwBuildNumber < buildVersion)))
135*6236dae4SAndroid Build Coastguard Worker matched = TRUE;
136*6236dae4SAndroid Build Coastguard Worker break;
137*6236dae4SAndroid Build Coastguard Worker
138*6236dae4SAndroid Build Coastguard Worker case VERSION_LESS_THAN_EQUAL:
139*6236dae4SAndroid Build Coastguard Worker if(osver.dwMajorVersion < majorVersion ||
140*6236dae4SAndroid Build Coastguard Worker (osver.dwMajorVersion == majorVersion &&
141*6236dae4SAndroid Build Coastguard Worker osver.dwMinorVersion < minorVersion) ||
142*6236dae4SAndroid Build Coastguard Worker (osver.dwMajorVersion == majorVersion &&
143*6236dae4SAndroid Build Coastguard Worker osver.dwMinorVersion == minorVersion &&
144*6236dae4SAndroid Build Coastguard Worker (buildVersion == 0 ||
145*6236dae4SAndroid Build Coastguard Worker osver.dwBuildNumber <= buildVersion)))
146*6236dae4SAndroid Build Coastguard Worker matched = TRUE;
147*6236dae4SAndroid Build Coastguard Worker break;
148*6236dae4SAndroid Build Coastguard Worker
149*6236dae4SAndroid Build Coastguard Worker case VERSION_EQUAL:
150*6236dae4SAndroid Build Coastguard Worker if(osver.dwMajorVersion == majorVersion &&
151*6236dae4SAndroid Build Coastguard Worker osver.dwMinorVersion == minorVersion &&
152*6236dae4SAndroid Build Coastguard Worker (buildVersion == 0 ||
153*6236dae4SAndroid Build Coastguard Worker osver.dwBuildNumber == buildVersion))
154*6236dae4SAndroid Build Coastguard Worker matched = TRUE;
155*6236dae4SAndroid Build Coastguard Worker break;
156*6236dae4SAndroid Build Coastguard Worker
157*6236dae4SAndroid Build Coastguard Worker case VERSION_GREATER_THAN_EQUAL:
158*6236dae4SAndroid Build Coastguard Worker if(osver.dwMajorVersion > majorVersion ||
159*6236dae4SAndroid Build Coastguard Worker (osver.dwMajorVersion == majorVersion &&
160*6236dae4SAndroid Build Coastguard Worker osver.dwMinorVersion > minorVersion) ||
161*6236dae4SAndroid Build Coastguard Worker (osver.dwMajorVersion == majorVersion &&
162*6236dae4SAndroid Build Coastguard Worker osver.dwMinorVersion == minorVersion &&
163*6236dae4SAndroid Build Coastguard Worker (buildVersion == 0 ||
164*6236dae4SAndroid Build Coastguard Worker osver.dwBuildNumber >= buildVersion)))
165*6236dae4SAndroid Build Coastguard Worker matched = TRUE;
166*6236dae4SAndroid Build Coastguard Worker break;
167*6236dae4SAndroid Build Coastguard Worker
168*6236dae4SAndroid Build Coastguard Worker case VERSION_GREATER_THAN:
169*6236dae4SAndroid Build Coastguard Worker if(osver.dwMajorVersion > majorVersion ||
170*6236dae4SAndroid Build Coastguard Worker (osver.dwMajorVersion == majorVersion &&
171*6236dae4SAndroid Build Coastguard Worker osver.dwMinorVersion > minorVersion) ||
172*6236dae4SAndroid Build Coastguard Worker (buildVersion != 0 &&
173*6236dae4SAndroid Build Coastguard Worker (osver.dwMajorVersion == majorVersion &&
174*6236dae4SAndroid Build Coastguard Worker osver.dwMinorVersion == minorVersion &&
175*6236dae4SAndroid Build Coastguard Worker osver.dwBuildNumber > buildVersion)))
176*6236dae4SAndroid Build Coastguard Worker matched = TRUE;
177*6236dae4SAndroid Build Coastguard Worker break;
178*6236dae4SAndroid Build Coastguard Worker }
179*6236dae4SAndroid Build Coastguard Worker
180*6236dae4SAndroid Build Coastguard Worker /* Verify the platform identifier (if necessary) */
181*6236dae4SAndroid Build Coastguard Worker if(matched) {
182*6236dae4SAndroid Build Coastguard Worker switch(platform) {
183*6236dae4SAndroid Build Coastguard Worker case PLATFORM_WINDOWS:
184*6236dae4SAndroid Build Coastguard Worker if(osver.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS)
185*6236dae4SAndroid Build Coastguard Worker matched = FALSE;
186*6236dae4SAndroid Build Coastguard Worker break;
187*6236dae4SAndroid Build Coastguard Worker
188*6236dae4SAndroid Build Coastguard Worker case PLATFORM_WINNT:
189*6236dae4SAndroid Build Coastguard Worker if(osver.dwPlatformId != VER_PLATFORM_WIN32_NT)
190*6236dae4SAndroid Build Coastguard Worker matched = FALSE;
191*6236dae4SAndroid Build Coastguard Worker break;
192*6236dae4SAndroid Build Coastguard Worker
193*6236dae4SAndroid Build Coastguard Worker default: /* like platform == PLATFORM_DONT_CARE */
194*6236dae4SAndroid Build Coastguard Worker break;
195*6236dae4SAndroid Build Coastguard Worker }
196*6236dae4SAndroid Build Coastguard Worker }
197*6236dae4SAndroid Build Coastguard Worker }
198*6236dae4SAndroid Build Coastguard Worker #else
199*6236dae4SAndroid Build Coastguard Worker ULONGLONG cm = 0;
200*6236dae4SAndroid Build Coastguard Worker struct OUR_OSVERSIONINFOEXW osver;
201*6236dae4SAndroid Build Coastguard Worker BYTE majorCondition;
202*6236dae4SAndroid Build Coastguard Worker BYTE minorCondition;
203*6236dae4SAndroid Build Coastguard Worker BYTE buildCondition;
204*6236dae4SAndroid Build Coastguard Worker BYTE spMajorCondition;
205*6236dae4SAndroid Build Coastguard Worker BYTE spMinorCondition;
206*6236dae4SAndroid Build Coastguard Worker DWORD dwTypeMask = VER_MAJORVERSION | VER_MINORVERSION |
207*6236dae4SAndroid Build Coastguard Worker VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR;
208*6236dae4SAndroid Build Coastguard Worker
209*6236dae4SAndroid Build Coastguard Worker typedef LONG (APIENTRY *RTLVERIFYVERSIONINFO_FN)
210*6236dae4SAndroid Build Coastguard Worker (struct OUR_OSVERSIONINFOEXW *, ULONG, ULONGLONG);
211*6236dae4SAndroid Build Coastguard Worker static RTLVERIFYVERSIONINFO_FN pRtlVerifyVersionInfo;
212*6236dae4SAndroid Build Coastguard Worker static bool onetime = TRUE; /* safe because first call is during init */
213*6236dae4SAndroid Build Coastguard Worker
214*6236dae4SAndroid Build Coastguard Worker if(onetime) {
215*6236dae4SAndroid Build Coastguard Worker pRtlVerifyVersionInfo = CURLX_FUNCTION_CAST(RTLVERIFYVERSIONINFO_FN,
216*6236dae4SAndroid Build Coastguard Worker (GetProcAddress(GetModuleHandleA("ntdll"), "RtlVerifyVersionInfo")));
217*6236dae4SAndroid Build Coastguard Worker onetime = FALSE;
218*6236dae4SAndroid Build Coastguard Worker }
219*6236dae4SAndroid Build Coastguard Worker
220*6236dae4SAndroid Build Coastguard Worker switch(condition) {
221*6236dae4SAndroid Build Coastguard Worker case VERSION_LESS_THAN:
222*6236dae4SAndroid Build Coastguard Worker majorCondition = VER_LESS;
223*6236dae4SAndroid Build Coastguard Worker minorCondition = VER_LESS;
224*6236dae4SAndroid Build Coastguard Worker buildCondition = VER_LESS;
225*6236dae4SAndroid Build Coastguard Worker spMajorCondition = VER_LESS_EQUAL;
226*6236dae4SAndroid Build Coastguard Worker spMinorCondition = VER_LESS_EQUAL;
227*6236dae4SAndroid Build Coastguard Worker break;
228*6236dae4SAndroid Build Coastguard Worker
229*6236dae4SAndroid Build Coastguard Worker case VERSION_LESS_THAN_EQUAL:
230*6236dae4SAndroid Build Coastguard Worker majorCondition = VER_LESS_EQUAL;
231*6236dae4SAndroid Build Coastguard Worker minorCondition = VER_LESS_EQUAL;
232*6236dae4SAndroid Build Coastguard Worker buildCondition = VER_LESS_EQUAL;
233*6236dae4SAndroid Build Coastguard Worker spMajorCondition = VER_LESS_EQUAL;
234*6236dae4SAndroid Build Coastguard Worker spMinorCondition = VER_LESS_EQUAL;
235*6236dae4SAndroid Build Coastguard Worker break;
236*6236dae4SAndroid Build Coastguard Worker
237*6236dae4SAndroid Build Coastguard Worker case VERSION_EQUAL:
238*6236dae4SAndroid Build Coastguard Worker majorCondition = VER_EQUAL;
239*6236dae4SAndroid Build Coastguard Worker minorCondition = VER_EQUAL;
240*6236dae4SAndroid Build Coastguard Worker buildCondition = VER_EQUAL;
241*6236dae4SAndroid Build Coastguard Worker spMajorCondition = VER_GREATER_EQUAL;
242*6236dae4SAndroid Build Coastguard Worker spMinorCondition = VER_GREATER_EQUAL;
243*6236dae4SAndroid Build Coastguard Worker break;
244*6236dae4SAndroid Build Coastguard Worker
245*6236dae4SAndroid Build Coastguard Worker case VERSION_GREATER_THAN_EQUAL:
246*6236dae4SAndroid Build Coastguard Worker majorCondition = VER_GREATER_EQUAL;
247*6236dae4SAndroid Build Coastguard Worker minorCondition = VER_GREATER_EQUAL;
248*6236dae4SAndroid Build Coastguard Worker buildCondition = VER_GREATER_EQUAL;
249*6236dae4SAndroid Build Coastguard Worker spMajorCondition = VER_GREATER_EQUAL;
250*6236dae4SAndroid Build Coastguard Worker spMinorCondition = VER_GREATER_EQUAL;
251*6236dae4SAndroid Build Coastguard Worker break;
252*6236dae4SAndroid Build Coastguard Worker
253*6236dae4SAndroid Build Coastguard Worker case VERSION_GREATER_THAN:
254*6236dae4SAndroid Build Coastguard Worker majorCondition = VER_GREATER;
255*6236dae4SAndroid Build Coastguard Worker minorCondition = VER_GREATER;
256*6236dae4SAndroid Build Coastguard Worker buildCondition = VER_GREATER;
257*6236dae4SAndroid Build Coastguard Worker spMajorCondition = VER_GREATER_EQUAL;
258*6236dae4SAndroid Build Coastguard Worker spMinorCondition = VER_GREATER_EQUAL;
259*6236dae4SAndroid Build Coastguard Worker break;
260*6236dae4SAndroid Build Coastguard Worker
261*6236dae4SAndroid Build Coastguard Worker default:
262*6236dae4SAndroid Build Coastguard Worker return FALSE;
263*6236dae4SAndroid Build Coastguard Worker }
264*6236dae4SAndroid Build Coastguard Worker
265*6236dae4SAndroid Build Coastguard Worker memset(&osver, 0, sizeof(osver));
266*6236dae4SAndroid Build Coastguard Worker osver.dwOSVersionInfoSize = sizeof(osver);
267*6236dae4SAndroid Build Coastguard Worker osver.dwMajorVersion = majorVersion;
268*6236dae4SAndroid Build Coastguard Worker osver.dwMinorVersion = minorVersion;
269*6236dae4SAndroid Build Coastguard Worker osver.dwBuildNumber = buildVersion;
270*6236dae4SAndroid Build Coastguard Worker if(platform == PLATFORM_WINDOWS)
271*6236dae4SAndroid Build Coastguard Worker osver.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS;
272*6236dae4SAndroid Build Coastguard Worker else if(platform == PLATFORM_WINNT)
273*6236dae4SAndroid Build Coastguard Worker osver.dwPlatformId = VER_PLATFORM_WIN32_NT;
274*6236dae4SAndroid Build Coastguard Worker
275*6236dae4SAndroid Build Coastguard Worker cm = VerSetConditionMask(cm, VER_MAJORVERSION, majorCondition);
276*6236dae4SAndroid Build Coastguard Worker cm = VerSetConditionMask(cm, VER_MINORVERSION, minorCondition);
277*6236dae4SAndroid Build Coastguard Worker cm = VerSetConditionMask(cm, VER_SERVICEPACKMAJOR, spMajorCondition);
278*6236dae4SAndroid Build Coastguard Worker cm = VerSetConditionMask(cm, VER_SERVICEPACKMINOR, spMinorCondition);
279*6236dae4SAndroid Build Coastguard Worker
280*6236dae4SAndroid Build Coastguard Worker if(platform != PLATFORM_DONT_CARE) {
281*6236dae4SAndroid Build Coastguard Worker cm = VerSetConditionMask(cm, VER_PLATFORMID, VER_EQUAL);
282*6236dae4SAndroid Build Coastguard Worker dwTypeMask |= VER_PLATFORMID;
283*6236dae4SAndroid Build Coastguard Worker }
284*6236dae4SAndroid Build Coastguard Worker
285*6236dae4SAndroid Build Coastguard Worker /* Later versions of Windows have version functions that may not return the
286*6236dae4SAndroid Build Coastguard Worker real version of Windows unless the application is so manifested. We prefer
287*6236dae4SAndroid Build Coastguard Worker the real version always, so we use the Rtl variant of the function when
288*6236dae4SAndroid Build Coastguard Worker possible. Note though the function signatures have underlying fundamental
289*6236dae4SAndroid Build Coastguard Worker types that are the same, the return values are different. */
290*6236dae4SAndroid Build Coastguard Worker if(pRtlVerifyVersionInfo)
291*6236dae4SAndroid Build Coastguard Worker matched = !pRtlVerifyVersionInfo(&osver, dwTypeMask, cm);
292*6236dae4SAndroid Build Coastguard Worker else
293*6236dae4SAndroid Build Coastguard Worker matched = !!VerifyVersionInfoW((OSVERSIONINFOEXW *)&osver, dwTypeMask, cm);
294*6236dae4SAndroid Build Coastguard Worker
295*6236dae4SAndroid Build Coastguard Worker /* Compare the build number separately. VerifyVersionInfo normally compares
296*6236dae4SAndroid Build Coastguard Worker major.minor in hierarchical order (eg 1.9 is less than 2.0) but does not
297*6236dae4SAndroid Build Coastguard Worker do the same for build (eg 1.9 build 222 is not less than 2.0 build 111).
298*6236dae4SAndroid Build Coastguard Worker Build comparison is only needed when build numbers are equal (eg 1.9 is
299*6236dae4SAndroid Build Coastguard Worker always less than 2.0 so build comparison is not needed). */
300*6236dae4SAndroid Build Coastguard Worker if(matched && buildVersion &&
301*6236dae4SAndroid Build Coastguard Worker (condition == VERSION_EQUAL ||
302*6236dae4SAndroid Build Coastguard Worker ((condition == VERSION_GREATER_THAN_EQUAL ||
303*6236dae4SAndroid Build Coastguard Worker condition == VERSION_LESS_THAN_EQUAL) &&
304*6236dae4SAndroid Build Coastguard Worker curlx_verify_windows_version(majorVersion, minorVersion, 0,
305*6236dae4SAndroid Build Coastguard Worker platform, VERSION_EQUAL)))) {
306*6236dae4SAndroid Build Coastguard Worker
307*6236dae4SAndroid Build Coastguard Worker cm = VerSetConditionMask(0, VER_BUILDNUMBER, buildCondition);
308*6236dae4SAndroid Build Coastguard Worker dwTypeMask = VER_BUILDNUMBER;
309*6236dae4SAndroid Build Coastguard Worker if(pRtlVerifyVersionInfo)
310*6236dae4SAndroid Build Coastguard Worker matched = !pRtlVerifyVersionInfo(&osver, dwTypeMask, cm);
311*6236dae4SAndroid Build Coastguard Worker else
312*6236dae4SAndroid Build Coastguard Worker matched = !!VerifyVersionInfoW((OSVERSIONINFOEXW *)&osver,
313*6236dae4SAndroid Build Coastguard Worker dwTypeMask, cm);
314*6236dae4SAndroid Build Coastguard Worker }
315*6236dae4SAndroid Build Coastguard Worker
316*6236dae4SAndroid Build Coastguard Worker #endif
317*6236dae4SAndroid Build Coastguard Worker
318*6236dae4SAndroid Build Coastguard Worker return matched;
319*6236dae4SAndroid Build Coastguard Worker }
320*6236dae4SAndroid Build Coastguard Worker
321*6236dae4SAndroid Build Coastguard Worker #endif /* _WIN32 */
322