xref: /aosp_15_r20/external/curl/lib/version_win32.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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