1 /*
2  * Unit test suite for version functions
3  *
4  * Copyright 2006 Robert Shearman
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #include "precomp.h"
22 
23 static BOOL (WINAPI * pGetProductInfo)(DWORD, DWORD, DWORD, DWORD, DWORD *);
24 static BOOL (WINAPI * pVerifyVersionInfoA)(LPOSVERSIONINFOEXA, DWORD, DWORDLONG);
25 static ULONGLONG (WINAPI * pVerSetConditionMask)(ULONGLONG, DWORD, BYTE);
26 static NTSTATUS (WINAPI * pRtlGetVersion)(RTL_OSVERSIONINFOEXW *);
27 
28 #define GET_PROC(func)                                     \
29     p##func = (void *)GetProcAddress(hmod, #func);
30 
31 static void init_function_pointers(void)
32 {
33     HMODULE hmod;
34 
35     hmod = GetModuleHandleA("kernel32.dll");
36 
37     GET_PROC(GetProductInfo);
38     GET_PROC(VerifyVersionInfoA);
39     GET_PROC(VerSetConditionMask);
40 
41     hmod = GetModuleHandleA("ntdll.dll");
42 
43     GET_PROC(RtlGetVersion);
44 }
45 
46 static void test_GetProductInfo(void)
47 {
48     DWORD product;
49     DWORD res;
50     DWORD table[] = {9,8,7,6,
51                      7,0,0,0,
52                      6,2,0,0,
53                      6,1,2,0,
54                      6,1,1,0,
55                      6,1,0,2,
56                      6,1,0,0,
57                      6,0,3,0,
58                      6,0,2,0,
59                      6,0,1,5,
60                      6,0,1,0,
61                      6,0,0,0,
62                      5,3,0,0,
63                      5,2,0,0,
64                      5,1,0,0,
65                      5,0,0,0,
66                      0};
67 
68     DWORD *entry = table;
69 
70     if (!pGetProductInfo)
71     {
72         /* Not present before Vista */
73         win_skip("GetProductInfo() not available\n");
74         return;
75     }
76 
77     while (*entry)
78     {
79         /* SetLastError() / GetLastError(): value is untouched */
80         product = 0xdeadbeef;
81         SetLastError(0xdeadbeef);
82         res = pGetProductInfo(entry[0], entry[1], entry[2], entry[3], &product);
83 
84         if (entry[0] >= 6)
85             ok(res && (product > PRODUCT_UNDEFINED) && (product <= PRODUCT_PROFESSIONAL_WMC),
86                "got %d and 0x%x (expected TRUE and a valid PRODUCT_* value)\n", res, product);
87         else
88             ok(!res && !product && (GetLastError() == 0xdeadbeef),
89                "got %d and 0x%x with 0x%x (expected FALSE and PRODUCT_UNDEFINED with LastError untouched)\n",
90                res, product, GetLastError());
91 
92         entry+= 4;
93     }
94 
95     /* NULL pointer is not a problem */
96     SetLastError(0xdeadbeef);
97     res = pGetProductInfo(6, 1, 0, 0, NULL);
98     ok( (!res) && (GetLastError() == 0xdeadbeef),
99         "got %d with 0x%x (expected FALSE with LastError untouched\n", res, GetLastError());
100 }
101 
102 static void test_GetVersionEx(void)
103 {
104     OSVERSIONINFOA infoA;
105     OSVERSIONINFOEXA infoExA;
106     BOOL ret;
107 
108     if (0)
109     {
110         /* Silently crashes on XP */
111         GetVersionExA(NULL);
112     }
113 
114     SetLastError(0xdeadbeef);
115     memset(&infoA,0,sizeof infoA);
116     ret = GetVersionExA(&infoA);
117     ok(!ret, "Expected GetVersionExA to fail\n");
118     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
119         GetLastError() == 0xdeadbeef /* Win9x */,
120         "Expected ERROR_INSUFFICIENT_BUFFER or 0xdeadbeef (Win9x), got %d\n",
121         GetLastError());
122 
123     SetLastError(0xdeadbeef);
124     infoA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA) / 2;
125     ret = GetVersionExA(&infoA);
126     ok(!ret, "Expected GetVersionExA to fail\n");
127     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
128         GetLastError() == 0xdeadbeef /* Win9x */,
129         "Expected ERROR_INSUFFICIENT_BUFFER or 0xdeadbeef (Win9x), got %d\n",
130         GetLastError());
131 
132     SetLastError(0xdeadbeef);
133     infoA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA) * 2;
134     ret = GetVersionExA(&infoA);
135     ok(!ret, "Expected GetVersionExA to fail\n");
136     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
137         GetLastError() == 0xdeadbeef /* Win9x */,
138         "Expected ERROR_INSUFFICIENT_BUFFER or 0xdeadbeef (Win9x), got %d\n",
139         GetLastError());
140 
141     SetLastError(0xdeadbeef);
142     infoA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
143     ret = GetVersionExA(&infoA);
144     ok(ret, "Expected GetVersionExA to succeed\n");
145     ok(GetLastError() == 0xdeadbeef,
146         "Expected 0xdeadbeef, got %d\n", GetLastError());
147 
148     SetLastError(0xdeadbeef);
149     infoExA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
150     ret = GetVersionExA((OSVERSIONINFOA *)&infoExA);
151     ok(ret ||
152        broken(ret == 0), /* win95 */
153        "Expected GetVersionExA to succeed\n");
154 
155     if (!infoExA.wServicePackMajor && !infoExA.wServicePackMinor)
156         ok(!infoExA.szCSDVersion[0], "got '%s'\n", infoExA.szCSDVersion);
157 }
158 
159 static void test_VerifyVersionInfo(void)
160 {
161     OSVERSIONINFOEXA info;
162     BOOL ret;
163     DWORD servicepack, error;
164 
165     if(!pVerifyVersionInfoA || !pVerSetConditionMask)
166     {
167         win_skip("Needed functions not available\n");
168         return;
169     }
170 
171     /* Before we start doing some tests we should check what the version of
172      * the ServicePack is. Tests on a box with no ServicePack will fail otherwise.
173      */
174     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
175     GetVersionExA((OSVERSIONINFOA *)&info);
176     servicepack = info.wServicePackMajor;
177 
178     /* Win8.1+ returns Win8 version in GetVersionEx when there's no app manifest targeting 8.1 */
179     if (info.dwMajorVersion == 6 && info.dwMinorVersion == 2)
180     {
181         RTL_OSVERSIONINFOEXW rtlinfo;
182         rtlinfo.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
183         ok(SUCCEEDED(pRtlGetVersion(&rtlinfo)), "RtlGetVersion failed\n");
184 
185         if (rtlinfo.dwMajorVersion != 6 || rtlinfo.dwMinorVersion != 2)
186         {
187             win_skip("GetVersionEx and VerifyVersionInfo are faking values\n");
188             return;
189         }
190     }
191 
192     memset(&info, 0, sizeof(info));
193 
194     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION,
195         pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL));
196     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
197 
198     SetLastError(0xdeadbeef);
199     ret = pVerifyVersionInfoA(&info, VER_BUILDNUMBER | VER_MAJORVERSION |
200         VER_MINORVERSION/* | VER_PLATFORMID | VER_SERVICEPACKMAJOR |
201         VER_SERVICEPACKMINOR | VER_SUITENAME | VER_PRODUCT_TYPE */,
202         pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL));
203     error = GetLastError();
204     ok(!ret, "VerifyVersionInfoA succeeded\n");
205     ok(error == ERROR_OLD_WIN_VERSION,
206        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
207 
208     /* tests special handling of VER_SUITENAME */
209 
210     ret = pVerifyVersionInfoA(&info, VER_SUITENAME,
211         pVerSetConditionMask(0, VER_SUITENAME, VER_AND));
212     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
213 
214     ret = pVerifyVersionInfoA(&info, VER_SUITENAME,
215         pVerSetConditionMask(0, VER_SUITENAME, VER_OR));
216     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
217 
218     /* test handling of version numbers */
219 
220     /* v3.10 is always less than v4.x even
221      * if the minor version is tested */
222     info.dwMajorVersion = 3;
223     info.dwMinorVersion = 10;
224     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
225         pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL),
226             VER_MAJORVERSION, VER_GREATER_EQUAL));
227     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
228 
229     info.dwMinorVersion = 0;
230     info.wServicePackMajor = 10;
231     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
232         pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL),
233             VER_MAJORVERSION, VER_GREATER_EQUAL));
234     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
235 
236     info.wServicePackMajor = 0;
237     info.wServicePackMinor = 10;
238     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
239         pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL),
240             VER_MAJORVERSION, VER_GREATER_EQUAL));
241     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
242 
243     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
244     GetVersionExA((OSVERSIONINFOA *)&info);
245     info.wServicePackMinor++;
246     SetLastError(0xdeadbeef);
247     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
248         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
249     error = GetLastError();
250     ok(!ret, "VerifyVersionInfoA succeeded\n");
251     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some wink2 */,
252        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
253 
254     if (servicepack == 0)
255     {
256         skip("There is no ServicePack on this system\n");
257     }
258     else
259     {
260         info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
261         GetVersionExA((OSVERSIONINFOA *)&info);
262         info.wServicePackMajor--;
263         ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
264             pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER));
265         ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
266 
267         info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
268         GetVersionExA((OSVERSIONINFOA *)&info);
269         info.wServicePackMajor--;
270         ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
271             pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
272         ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
273     }
274 
275     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
276     GetVersionExA((OSVERSIONINFOA *)&info);
277     info.wServicePackMajor++;
278     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
279         pVerSetConditionMask(0, VER_MINORVERSION, VER_LESS));
280     ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
281 
282     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
283     GetVersionExA((OSVERSIONINFOA *)&info);
284     info.wServicePackMajor++;
285     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
286         pVerSetConditionMask(0, VER_MINORVERSION, VER_LESS_EQUAL));
287     ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
288 
289     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
290     GetVersionExA((OSVERSIONINFOA *)&info);
291     info.wServicePackMajor--;
292     SetLastError(0xdeadbeef);
293     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
294         pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL));
295     error = GetLastError();
296     ok(!ret, "VerifyVersionInfoA succeeded\n");
297     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
298        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
299 
300     /* test the failure hierarchy for the four version fields */
301 
302     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
303     GetVersionExA((OSVERSIONINFOA *)&info);
304     info.wServicePackMajor++;
305     SetLastError(0xdeadbeef);
306     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
307         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
308     error = GetLastError();
309     ok(!ret, "VerifyVersionInfoA succeeded\n");
310     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
311        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
312 
313     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
314     GetVersionExA((OSVERSIONINFOA *)&info);
315     info.dwMinorVersion++;
316     SetLastError(0xdeadbeef);
317     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
318         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
319     error = GetLastError();
320     ok(!ret, "VerifyVersionInfoA succeeded\n");
321     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
322        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
323 
324     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
325     GetVersionExA((OSVERSIONINFOA *)&info);
326     info.dwMajorVersion++;
327     SetLastError(0xdeadbeef);
328     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
329         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
330     error = GetLastError();
331     ok(!ret, "VerifyVersionInfoA succeeded\n");
332     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
333        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
334 
335     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
336         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
337     ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
338 
339     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
340     GetVersionExA((OSVERSIONINFOA *)&info);
341     info.dwBuildNumber++;
342     SetLastError(0xdeadbeef);
343     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
344         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
345     error = GetLastError();
346     ok(!ret, "VerifyVersionInfoA succeeded\n");
347     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
348        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
349 
350     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
351         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
352     ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
353 
354     /* systematically test behaviour of condition mask (tests sorted by condition mask value) */
355 
356     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
357     GetVersionExA((OSVERSIONINFOA *)&info);
358     info.dwMinorVersion++;
359     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
360         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_MINORVERSION, VER_LESS));
361     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
362 
363     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
364     GetVersionExA((OSVERSIONINFOA *)&info);
365     info.dwMinorVersion++;
366     SetLastError(0xdeadbeef);
367     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
368         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_LESS));
369     error = GetLastError();
370     ok(!ret, "VerifyVersionInfoA succeeded\n");
371     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
372        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
373 
374     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
375     GetVersionExA((OSVERSIONINFOA *)&info);
376     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
377         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_LESS));
378     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
379 
380     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
381     GetVersionExA((OSVERSIONINFOA *)&info);
382     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
383         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_AND));
384     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
385 
386     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
387     GetVersionExA((OSVERSIONINFOA *)&info);
388     info.dwMinorVersion++;
389     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
390         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_LESS_EQUAL), VER_MINORVERSION, VER_LESS));
391     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
392 
393     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
394     GetVersionExA((OSVERSIONINFOA *)&info);
395     info.dwMinorVersion++;
396     SetLastError(0xdeadbeef);
397     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
398         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_AND), VER_MINORVERSION, VER_LESS));
399     error = GetLastError();
400     ok(!ret, "VerifyVersionInfoA succeeded\n");
401     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
402        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
403 
404     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
405     GetVersionExA((OSVERSIONINFOA *)&info);
406     info.dwMinorVersion++;
407     SetLastError(0xdeadbeef);
408     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
409         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_OR), VER_MINORVERSION, VER_LESS));
410     error = GetLastError();
411     ok(!ret, "VerifyVersionInfoA succeeded\n");
412     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
413        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
414 
415     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
416     GetVersionExA((OSVERSIONINFOA *)&info);
417     info.wServicePackMinor++;
418     SetLastError(0xdeadbeef);
419     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
420         pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS));
421     error = GetLastError();
422     ok(!ret, "VerifyVersionInfoA succeeded\n");
423     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
424        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
425 
426     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
427     GetVersionExA((OSVERSIONINFOA *)&info);
428     info.wServicePackMinor++;
429     SetLastError(0xdeadbeef);
430     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
431         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS));
432     error = GetLastError();
433     ok(!ret, "VerifyVersionInfoA succeeded\n");
434     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
435        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
436 
437     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
438     GetVersionExA((OSVERSIONINFOA *)&info);
439     info.wServicePackMajor++;
440     SetLastError(0xdeadbeef);
441     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
442         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_EQUAL));
443     error = GetLastError();
444     ok(!ret, "VerifyVersionInfoA succeeded\n");
445     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
446        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
447 
448     if (servicepack)
449     {
450         info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
451         GetVersionExA((OSVERSIONINFOA *)&info);
452         info.dwMajorVersion++;
453         info.wServicePackMajor--;
454         ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
455             pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_LESS), VER_SERVICEPACKMAJOR, VER_EQUAL));
456         ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
457     }
458 
459     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
460     GetVersionExA((OSVERSIONINFOA *)&info);
461     info.wServicePackMinor++;
462     ret = pVerifyVersionInfoA(&info, VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
463         pVerSetConditionMask(pVerSetConditionMask(0, VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS));
464     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
465 
466     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
467     GetVersionExA((OSVERSIONINFOA *)&info);
468     info.wServicePackMinor++;
469     SetLastError(0xdeadbeef);
470     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
471         pVerSetConditionMask(pVerSetConditionMask(0, VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS));
472     error = GetLastError();
473     ok(!ret, "VerifyVersionInfoA succeeded\n");
474     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
475        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
476 
477     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
478     GetVersionExA((OSVERSIONINFOA *)&info);
479     info.wServicePackMinor++;
480     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
481         pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL),
482         VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS));
483     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
484 
485     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
486     GetVersionExA((OSVERSIONINFOA *)&info);
487     info.wServicePackMinor++;
488     SetLastError(0xdeadbeef);
489     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
490         pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL),
491         VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS));
492     error = GetLastError();
493     ok(!ret, "VerifyVersionInfoA succeeded\n");
494     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
495        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
496 
497     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
498     GetVersionExA((OSVERSIONINFOA *)&info);
499     info.wServicePackMinor++;
500     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
501         pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL),
502         VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS));
503     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
504 
505     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
506     GetVersionExA((OSVERSIONINFOA *)&info);
507     info.wServicePackMinor++;
508     SetLastError(0xdeadbeef);
509     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
510         pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL),
511         VER_MINORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS));
512     error = GetLastError();
513     ok(!ret, "VerifyVersionInfoA succeeded\n");
514     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
515        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
516 
517     if (servicepack)
518     {
519         info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
520         GetVersionExA((OSVERSIONINFOA *)&info);
521         info.wServicePackMajor--;
522         SetLastError(0xdeadbeef);
523         ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
524             pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER));
525         error = GetLastError();
526         ok(!ret, "VerifyVersionInfoA succeeded\n");
527         ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
528            "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
529 
530         info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
531         GetVersionExA((OSVERSIONINFOA *)&info);
532         info.wServicePackMajor--;
533         ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
534             pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL),
535             VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER));
536         ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
537 
538         info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
539         GetVersionExA((OSVERSIONINFOA *)&info);
540         info.wServicePackMajor--;
541         ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
542             pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL),
543             VER_MINORVERSION, VER_LESS_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER));
544         ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
545 
546         info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
547         GetVersionExA((OSVERSIONINFOA *)&info);
548         info.wServicePackMajor--;
549         ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
550             pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL),
551             VER_MINORVERSION, VER_AND), VER_SERVICEPACKMAJOR, VER_GREATER));
552         ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
553     }
554 
555     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
556     GetVersionExA((OSVERSIONINFOA *)&info);
557     info.wServicePackMajor++;
558     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
559         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_LESS_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER));
560     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
561 
562     if (servicepack)
563     {
564         info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
565         GetVersionExA((OSVERSIONINFOA *)&info);
566         info.wServicePackMajor--;
567         SetLastError(0xdeadbeef);
568         ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
569             pVerSetConditionMask(pVerSetConditionMask(0, VER_SERVICEPACKMAJOR, VER_GREATER), VER_SERVICEPACKMINOR, VER_EQUAL));
570         error = GetLastError();
571         ok(!ret, "VerifyVersionInfoA succeeded\n");
572         ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
573            "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
574     }
575 
576     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
577     GetVersionExA((OSVERSIONINFOA *)&info);
578     info.wServicePackMajor++;
579     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
580         pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS));
581     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
582 
583     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
584     GetVersionExA((OSVERSIONINFOA *)&info);
585     info.wServicePackMajor++;
586     SetLastError(0xdeadbeef);
587     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
588         pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS));
589     error = GetLastError();
590     ok(!ret, "VerifyVersionInfoA succeeded\n");
591     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
592        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
593 
594     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
595     GetVersionExA((OSVERSIONINFOA *)&info);
596     info.wServicePackMajor++;
597     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
598         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS));
599     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
600 
601     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
602     GetVersionExA((OSVERSIONINFOA *)&info);
603     info.wServicePackMajor++;
604     SetLastError(0xdeadbeef);
605     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
606         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS));
607     error = GetLastError();
608     ok(!ret, "VerifyVersionInfoA succeeded\n");
609     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
610        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
611 
612     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
613     GetVersionExA((OSVERSIONINFOA *)&info);
614     info.wServicePackMajor++;
615     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
616         pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL),
617         VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS));
618     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
619 
620     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
621     GetVersionExA((OSVERSIONINFOA *)&info);
622     info.wServicePackMajor++;
623     SetLastError(0xdeadbeef);
624     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
625         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS));
626     error = GetLastError();
627     ok(!ret, "VerifyVersionInfoA succeeded\n");
628     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
629        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
630 
631     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
632     GetVersionExA((OSVERSIONINFOA *)&info);
633     info.dwMajorVersion--;
634     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
635         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS));
636     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
637 
638     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
639     GetVersionExA((OSVERSIONINFOA *)&info);
640     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
641         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS));
642     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
643 
644     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
645     GetVersionExA((OSVERSIONINFOA *)&info);
646     info.wServicePackMajor++;
647     SetLastError(0xdeadbeef);
648     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
649         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS));
650     error = GetLastError();
651     ok(!ret, "VerifyVersionInfoA succeeded\n");
652     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
653        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
654 
655     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
656     GetVersionExA((OSVERSIONINFOA *)&info);
657     info.wServicePackMajor++;
658     SetLastError(0xdeadbeef);
659     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
660         pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL),
661         VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS));
662     error = GetLastError();
663     ok(!ret, "VerifyVersionInfoA succeeded\n");
664     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
665        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
666 
667     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
668     GetVersionExA((OSVERSIONINFOA *)&info);
669     info.wServicePackMajor++;
670     SetLastError(0xdeadbeef);
671     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
672         pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL),
673         VER_MINORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS_EQUAL));
674     error = GetLastError();
675     ok(!ret, "VerifyVersionInfoA succeeded\n");
676     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
677        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
678 
679     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
680     GetVersionExA((OSVERSIONINFOA *)&info);
681     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
682         pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_AND));
683     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
684 
685     /* test bad dwOSVersionInfoSize */
686     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
687     GetVersionExA((OSVERSIONINFOA *)&info);
688     info.dwOSVersionInfoSize = 0;
689     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
690         pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL));
691     ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
692 }
693 
694 START_TEST(version)
695 {
696     init_function_pointers();
697 
698     test_GetProductInfo();
699     test_GetVersionEx();
700     test_VerifyVersionInfo();
701 }
702