1*c2c66affSColin Finck /*
2*c2c66affSColin Finck  * PROJECT:     apphelp_apitest
3*c2c66affSColin Finck  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4*c2c66affSColin Finck  * PURPOSE:     Common data / functions for apphelp_apitest
5*c2c66affSColin Finck  * COPYRIGHT:   Copyright 2015-2017 Mark Jansen (mark.jansen@reactos.org)
6*c2c66affSColin Finck  */
7*c2c66affSColin Finck 
8*c2c66affSColin Finck #include <exdisp.h>
9*c2c66affSColin Finck #include <winbase.h>
10*c2c66affSColin Finck #include "wine/test.h"
11*c2c66affSColin Finck 
12*c2c66affSColin Finck 
13*c2c66affSColin Finck static IMAGE_DOS_HEADER dos_header =
14*c2c66affSColin Finck {
15*c2c66affSColin Finck     IMAGE_DOS_SIGNATURE, /* e_magic */
16*c2c66affSColin Finck     144, /* e_cblp */
17*c2c66affSColin Finck     3, /* e_cp */
18*c2c66affSColin Finck     0, /* e_crlc */
19*c2c66affSColin Finck     4, /* e_cparhdr */
20*c2c66affSColin Finck     0, /* e_minalloc */
21*c2c66affSColin Finck     65535, /* e_maxalloc */
22*c2c66affSColin Finck     0, /* e_ss */
23*c2c66affSColin Finck     184, /* e_sp */
24*c2c66affSColin Finck     0, /* e_csum */
25*c2c66affSColin Finck     0, /* e_ip */
26*c2c66affSColin Finck     0, /* e_cs */
27*c2c66affSColin Finck     64, /* e_lfarlc */
28*c2c66affSColin Finck     0, /* e_ovno */
29*c2c66affSColin Finck     { 0 }, /* e_res[4] */
30*c2c66affSColin Finck     0, /* e_oemid */
31*c2c66affSColin Finck     0, /* e_oeminfo */
32*c2c66affSColin Finck     { 0 }, /* e_res2[10] */
33*c2c66affSColin Finck     0x80 /* e_lfanew */
34*c2c66affSColin Finck };
35*c2c66affSColin Finck 
36*c2c66affSColin Finck static IMAGE_NT_HEADERS32 nt_header =
37*c2c66affSColin Finck {
38*c2c66affSColin Finck     IMAGE_NT_SIGNATURE, /* Signature */
39*c2c66affSColin Finck     {
40*c2c66affSColin Finck         IMAGE_FILE_MACHINE_I386, /* Machine */
41*c2c66affSColin Finck         2, /* NumberOfSections */
42*c2c66affSColin Finck         0x12345, /* TimeDateStamp */
43*c2c66affSColin Finck         0, /* PointerToSymbolTable */
44*c2c66affSColin Finck         0, /* NumberOfSymbols */
45*c2c66affSColin Finck         sizeof(IMAGE_OPTIONAL_HEADER), /* SizeOfOptionalHeader */
46*c2c66affSColin Finck         IMAGE_FILE_RELOCS_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_LINE_NUMS_STRIPPED | IMAGE_FILE_32BIT_MACHINE /* Characteristics */
47*c2c66affSColin Finck     },
48*c2c66affSColin Finck     {
49*c2c66affSColin Finck         IMAGE_NT_OPTIONAL_HDR_MAGIC, /* Magic */
50*c2c66affSColin Finck         6, /* MajorLinkerVersion */
51*c2c66affSColin Finck         3, /* MinorLinkerVersion */
52*c2c66affSColin Finck         0, /* SizeOfCode */
53*c2c66affSColin Finck         0, /* SizeOfInitializedData */
54*c2c66affSColin Finck         0, /* SizeOfUninitializedData */
55*c2c66affSColin Finck         0x1000, /* AddressOfEntryPoint */
56*c2c66affSColin Finck         0x1000, /* BaseOfCode */
57*c2c66affSColin Finck         0, /* BaseOfData */
58*c2c66affSColin Finck         0x400000, /* ImageBase */
59*c2c66affSColin Finck         0x1000, /* SectionAlignment */
60*c2c66affSColin Finck         0x200, /* FileAlignment */
61*c2c66affSColin Finck         4, /* MajorOperatingSystemVersion */
62*c2c66affSColin Finck         1, /* MinorOperatingSystemVersion */
63*c2c66affSColin Finck         4, /* MajorImageVersion */
64*c2c66affSColin Finck         2, /* MinorImageVersion */
65*c2c66affSColin Finck         4, /* MajorSubsystemVersion */
66*c2c66affSColin Finck         3, /* MinorSubsystemVersion */
67*c2c66affSColin Finck         0, /* Win32VersionValue */
68*c2c66affSColin Finck         0x3000, /* SizeOfImage */
69*c2c66affSColin Finck         0x200, /* SizeOfHeaders */
70*c2c66affSColin Finck         0xBAAD, /* CheckSum: This checksum is not the correct checksum, intentionally! */
71*c2c66affSColin Finck         IMAGE_SUBSYSTEM_WINDOWS_CUI, /* Subsystem */
72*c2c66affSColin Finck         0, /* DllCharacteristics */
73*c2c66affSColin Finck         0x100000, /* SizeOfStackReserve */
74*c2c66affSColin Finck         0x1000, /* SizeOfStackCommit */
75*c2c66affSColin Finck         0x100000, /* SizeOfHeapReserve */
76*c2c66affSColin Finck         0x1000, /* SizeOfHeapCommit */
77*c2c66affSColin Finck         0, /* LoaderFlags */
78*c2c66affSColin Finck         0x10, /* NumberOfRvaAndSizes */
79*c2c66affSColin Finck         {
80*c2c66affSColin Finck             /* IMAGE_DIRECTORY_ENTRY_EXPORT */
81*c2c66affSColin Finck             {
82*c2c66affSColin Finck                 0x2370, /* VirtualAddress */
83*c2c66affSColin Finck                 76, /* Size */
84*c2c66affSColin Finck             },
85*c2c66affSColin Finck             { 0 },
86*c2c66affSColin Finck             /* IMAGE_DIRECTORY_ENTRY_RESOURCE */
87*c2c66affSColin Finck             {
88*c2c66affSColin Finck                 0x2000, /* VirtualAddress */
89*c2c66affSColin Finck                 868, /* Size */
90*c2c66affSColin Finck             },
91*c2c66affSColin Finck         } /* DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] */
92*c2c66affSColin Finck     }
93*c2c66affSColin Finck };
94*c2c66affSColin Finck 
95*c2c66affSColin Finck static IMAGE_SECTION_HEADER section_headers[] =
96*c2c66affSColin Finck {
97*c2c66affSColin Finck     {
98*c2c66affSColin Finck         { '.','t','e','x','t',0 }, /* Name */
99*c2c66affSColin Finck         { 24 }, /* VirtualSize */
100*c2c66affSColin Finck         0x1000, /* VirtualAddress */
101*c2c66affSColin Finck         0x200, /* SizeOfRawData */
102*c2c66affSColin Finck         0x200, /* PointerToRawData */
103*c2c66affSColin Finck         0, /* PointerToRelocations */
104*c2c66affSColin Finck         0, /* PointerToLinenumbers */
105*c2c66affSColin Finck         0, /* NumberOfRelocations */
106*c2c66affSColin Finck         0, /* NumberOfLinenumbers */
107*c2c66affSColin Finck         IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ /* Characteristics */
108*c2c66affSColin Finck     },
109*c2c66affSColin Finck     {
110*c2c66affSColin Finck         { '.','r','s','r','c',0 }, /* Name */
111*c2c66affSColin Finck         { 880 }, /* VirtualSize */
112*c2c66affSColin Finck         0x2000, /* VirtualAddress */
113*c2c66affSColin Finck         0x400, /* SizeOfRawData */
114*c2c66affSColin Finck         0x400, /* PointerToRawData */
115*c2c66affSColin Finck         0, /* PointerToRelocations */
116*c2c66affSColin Finck         0, /* PointerToLinenumbers */
117*c2c66affSColin Finck         0, /* NumberOfRelocations */
118*c2c66affSColin Finck         0, /* NumberOfLinenumbers */
119*c2c66affSColin Finck         IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ /* Characteristics */
120*c2c66affSColin Finck     }
121*c2c66affSColin Finck };
122*c2c66affSColin Finck 
123*c2c66affSColin Finck static const unsigned char text_section[] =
124*c2c66affSColin Finck {
125*c2c66affSColin Finck     0x33, 0xc0,     /* xor eax, eax */
126*c2c66affSColin Finck     0xc3            /* ret */
127*c2c66affSColin Finck };
128*c2c66affSColin Finck 
129*c2c66affSColin Finck 
130*c2c66affSColin Finck /* taken from fusionpriv.h */
131*c2c66affSColin Finck typedef struct
132*c2c66affSColin Finck {
133*c2c66affSColin Finck     WORD wLength;
134*c2c66affSColin Finck     WORD wValueLength;
135*c2c66affSColin Finck     WORD wType;
136*c2c66affSColin Finck     WCHAR szKey[17];
137*c2c66affSColin Finck     VS_FIXEDFILEINFO Value;
138*c2c66affSColin Finck } VS_VERSIONINFO;
139*c2c66affSColin Finck 
140*c2c66affSColin Finck typedef struct
141*c2c66affSColin Finck {
142*c2c66affSColin Finck     WORD wLength;
143*c2c66affSColin Finck     WORD wValueLength;
144*c2c66affSColin Finck     WORD wType;
145*c2c66affSColin Finck     WCHAR szKey[15];
146*c2c66affSColin Finck } STRINGFILEINFO;
147*c2c66affSColin Finck 
148*c2c66affSColin Finck typedef struct
149*c2c66affSColin Finck {
150*c2c66affSColin Finck     WORD wLength;
151*c2c66affSColin Finck     WORD wValueLength;
152*c2c66affSColin Finck     WORD wType;
153*c2c66affSColin Finck     WCHAR szKey[9];
154*c2c66affSColin Finck } STRINGTABLE;
155*c2c66affSColin Finck 
156*c2c66affSColin Finck typedef struct
157*c2c66affSColin Finck {
158*c2c66affSColin Finck     WORD wLength;
159*c2c66affSColin Finck     WORD wValueLength;
160*c2c66affSColin Finck     WORD wType;
161*c2c66affSColin Finck } STRINGHDR;
162*c2c66affSColin Finck 
163*c2c66affSColin Finck typedef struct
164*c2c66affSColin Finck {
165*c2c66affSColin Finck     WORD wLength;
166*c2c66affSColin Finck     WORD wValueLength;
167*c2c66affSColin Finck     WORD wType;
168*c2c66affSColin Finck     WCHAR szKey[13];
169*c2c66affSColin Finck } VARFILEINFO;
170*c2c66affSColin Finck 
171*c2c66affSColin Finck typedef struct
172*c2c66affSColin Finck {
173*c2c66affSColin Finck     WORD wLength;
174*c2c66affSColin Finck     WORD wValueLength;
175*c2c66affSColin Finck     WORD wType;
176*c2c66affSColin Finck     WCHAR szKey[13];
177*c2c66affSColin Finck     DWORD Value;
178*c2c66affSColin Finck } VAR;
179*c2c66affSColin Finck 
180*c2c66affSColin Finck typedef struct rsrc_section_t
181*c2c66affSColin Finck {
182*c2c66affSColin Finck     IMAGE_RESOURCE_DIRECTORY header;
183*c2c66affSColin Finck     IMAGE_RESOURCE_DIRECTORY_ENTRY file_info_id;
184*c2c66affSColin Finck     IMAGE_RESOURCE_DIRECTORY file_info_header;
185*c2c66affSColin Finck     IMAGE_RESOURCE_DIRECTORY_ENTRY version_info_id;
186*c2c66affSColin Finck     IMAGE_RESOURCE_DIRECTORY version_info_header;
187*c2c66affSColin Finck     IMAGE_RESOURCE_DIRECTORY_ENTRY version_lang_id;
188*c2c66affSColin Finck     IMAGE_RESOURCE_DATA_ENTRY version_data_entry;
189*c2c66affSColin Finck 
190*c2c66affSColin Finck     VS_VERSIONINFO version_info;
191*c2c66affSColin Finck     STRINGFILEINFO string_file_info;
192*c2c66affSColin Finck     STRINGTABLE string_table;
193*c2c66affSColin Finck 
194*c2c66affSColin Finck     STRINGHDR FileVersion_hdr;
195*c2c66affSColin Finck     WCHAR FileVersion_key[13];
196*c2c66affSColin Finck     WCHAR FileVersion_val[8];
197*c2c66affSColin Finck 
198*c2c66affSColin Finck     STRINGHDR ProductVersion_hdr;
199*c2c66affSColin Finck     WCHAR ProductVersion_key[15];
200*c2c66affSColin Finck     WCHAR ProductVersion_val[8];
201*c2c66affSColin Finck 
202*c2c66affSColin Finck     STRINGHDR CompanyName_hdr;
203*c2c66affSColin Finck     WCHAR CompanyName_key[13];
204*c2c66affSColin Finck     WCHAR CompanyName_val[12];
205*c2c66affSColin Finck 
206*c2c66affSColin Finck     STRINGHDR FileDescription_hdr;
207*c2c66affSColin Finck     WCHAR FileDescription_key[17];
208*c2c66affSColin Finck     WCHAR FileDescription_val[16];
209*c2c66affSColin Finck 
210*c2c66affSColin Finck     STRINGHDR InternalName_hdr;
211*c2c66affSColin Finck     WCHAR InternalName_key[13];
212*c2c66affSColin Finck     WCHAR InternalName_val[14];
213*c2c66affSColin Finck 
214*c2c66affSColin Finck     STRINGHDR LegalCopyright_hdr;
215*c2c66affSColin Finck     WCHAR LegalCopyright_key[15];
216*c2c66affSColin Finck     WCHAR LegalCopyright_val[16];
217*c2c66affSColin Finck 
218*c2c66affSColin Finck     STRINGHDR LegalTrademarks_hdr;
219*c2c66affSColin Finck     WCHAR LegalTrademarks_key[17];
220*c2c66affSColin Finck     WCHAR LegalTrademarks_val[16];
221*c2c66affSColin Finck 
222*c2c66affSColin Finck     STRINGHDR OriginalFilename_hdr;
223*c2c66affSColin Finck     WCHAR OriginalFilename_key[17];
224*c2c66affSColin Finck     WCHAR OriginalFilename_val[18];
225*c2c66affSColin Finck 
226*c2c66affSColin Finck     STRINGHDR Productname_hdr;
227*c2c66affSColin Finck     WCHAR Productname_key[13];
228*c2c66affSColin Finck     WCHAR Productname_val[12];
229*c2c66affSColin Finck 
230*c2c66affSColin Finck     VARFILEINFO file_info;
231*c2c66affSColin Finck     VAR translation;
232*c2c66affSColin Finck } rsrc_section_t;
233*c2c66affSColin Finck 
234*c2c66affSColin Finck static const rsrc_section_t rsrc_section =
235*c2c66affSColin Finck {
236*c2c66affSColin Finck     /* header */
237*c2c66affSColin Finck     {
238*c2c66affSColin Finck         0, /* Characteristics */
239*c2c66affSColin Finck         0x55FE8E21, /* TimeDateStamp, 20/09/2015 10:44:49 */
240*c2c66affSColin Finck         0, /* MajorVersion */
241*c2c66affSColin Finck         0, /* MinorVersion */
242*c2c66affSColin Finck         0, /* NumberOfNamedEntries */
243*c2c66affSColin Finck         1, /* NumberOfIdEntries */
244*c2c66affSColin Finck     },
245*c2c66affSColin Finck     /* file_info_id */
246*c2c66affSColin Finck     {
247*c2c66affSColin Finck         {{
248*c2c66affSColin Finck             (DWORD)VS_FILE_INFO, /* NameOffset:31 */
249*c2c66affSColin Finck             0 /* NameIsString:1 */
250*c2c66affSColin Finck         }},
251*c2c66affSColin Finck         {
252*c2c66affSColin Finck             0x80000018 /* OffsetToData */
253*c2c66affSColin Finck         }
254*c2c66affSColin Finck     },
255*c2c66affSColin Finck     /* file_info_header */
256*c2c66affSColin Finck     {
257*c2c66affSColin Finck         0, /* Characteristics */
258*c2c66affSColin Finck         0x55FE8E21, /* TimeDateStamp, 20/09/2015 10:44:49 */
259*c2c66affSColin Finck         0, /* MajorVersion */
260*c2c66affSColin Finck         0, /* MinorVersion */
261*c2c66affSColin Finck         0, /* NumberOfNamedEntries */
262*c2c66affSColin Finck         1, /* NumberOfIdEntries */
263*c2c66affSColin Finck     },
264*c2c66affSColin Finck     /* version_info_id */
265*c2c66affSColin Finck     {
266*c2c66affSColin Finck         {{
267*c2c66affSColin Finck             VS_VERSION_INFO, /* NameOffset:31 */
268*c2c66affSColin Finck             0 /* NameIsString:1 */
269*c2c66affSColin Finck         }},
270*c2c66affSColin Finck         {
271*c2c66affSColin Finck             0x80000030 /* OffsetToData */
272*c2c66affSColin Finck         },
273*c2c66affSColin Finck     },
274*c2c66affSColin Finck     /* version_info_header */
275*c2c66affSColin Finck     {
276*c2c66affSColin Finck         0, /* Characteristics */
277*c2c66affSColin Finck         0x55FE8E21, /* TimeDateStamp, 20/09/2015 10:44:49 */
278*c2c66affSColin Finck         0, /* MajorVersion */
279*c2c66affSColin Finck         0, /* MinorVersion */
280*c2c66affSColin Finck         0, /* NumberOfNamedEntries */
281*c2c66affSColin Finck         1, /* NumberOfIdEntries */
282*c2c66affSColin Finck     },
283*c2c66affSColin Finck     /* version_lang_id */
284*c2c66affSColin Finck     {
285*c2c66affSColin Finck         {{
286*c2c66affSColin Finck             1033, /* NameOffset:31 */
287*c2c66affSColin Finck             0 /* NameIsString:1 */
288*c2c66affSColin Finck         }},
289*c2c66affSColin Finck         {
290*c2c66affSColin Finck             0x48 /* OffsetToDirectory */
291*c2c66affSColin Finck         }
292*c2c66affSColin Finck     },
293*c2c66affSColin Finck     /* version_data_entry */
294*c2c66affSColin Finck     {
295*c2c66affSColin Finck         0x2058, /* OffsetToData */
296*c2c66affSColin Finck         0x30C, /* Size */
297*c2c66affSColin Finck         0, /* CodePage */
298*c2c66affSColin Finck         0, /* Reserved */
299*c2c66affSColin Finck     },
300*c2c66affSColin Finck 
301*c2c66affSColin Finck     /* version_info */
302*c2c66affSColin Finck     {
303*c2c66affSColin Finck     0x30C, /* wLength */
304*c2c66affSColin Finck     0x34, /* wValueLength */
305*c2c66affSColin Finck     0, /* wType: Binary */
306*c2c66affSColin Finck     { 'V','S','_','V','E','R','S','I','O','N','_','I','N','F','O','\0','\0' }, /* szKey[17] */
307*c2c66affSColin Finck         /* Value */
308*c2c66affSColin Finck         {
309*c2c66affSColin Finck             0xFEEF04BD, /* dwSignature */
310*c2c66affSColin Finck             0x10000, /* dwStrucVersion */
311*c2c66affSColin Finck             0x10000, /* dwFileVersionMS */
312*c2c66affSColin Finck             0, /* dwFileVersionLS */
313*c2c66affSColin Finck             0x10000, /* dwProductVersionMS */
314*c2c66affSColin Finck             1, /* dwProductVersionLS */
315*c2c66affSColin Finck             0, /* dwFileFlagsMask */
316*c2c66affSColin Finck             0, /* dwFileFlags */
317*c2c66affSColin Finck             VOS__WINDOWS32, /* dwFileOS */
318*c2c66affSColin Finck             VFT_APP, /* dwFileType */
319*c2c66affSColin Finck             0, /* dwFileSubtype */
320*c2c66affSColin Finck             0x01d1a019, /* dwFileDateMS */
321*c2c66affSColin Finck             0xac754c50 /* dwFileDateLS */
322*c2c66affSColin Finck         },
323*c2c66affSColin Finck     },
324*c2c66affSColin Finck 
325*c2c66affSColin Finck     /* string_file_info */
326*c2c66affSColin Finck     {
327*c2c66affSColin Finck         0x26C, /* wLength */
328*c2c66affSColin Finck         0, /* wValueLength */
329*c2c66affSColin Finck         1, /* wType: Text */
330*c2c66affSColin Finck         { 'S','t','r','i','n','g','F','i','l','e','I','n','f','o','\0' } /* szKey[15] */
331*c2c66affSColin Finck     },
332*c2c66affSColin Finck     /* string_table */
333*c2c66affSColin Finck     {
334*c2c66affSColin Finck         0x248, /* wLength */
335*c2c66affSColin Finck         0, /* wValueLength */
336*c2c66affSColin Finck         1, /* wType: Text */
337*c2c66affSColin Finck         { 'F','F','F','F','0','0','0','0','\0' } /* szKey[9] */
338*c2c66affSColin Finck     },
339*c2c66affSColin Finck 
340*c2c66affSColin Finck     /* FileVersion */
341*c2c66affSColin Finck     {
342*c2c66affSColin Finck         48, /* wLength */
343*c2c66affSColin Finck         8, /* wValueLength */
344*c2c66affSColin Finck         1, /* wType: Text */
345*c2c66affSColin Finck     },
346*c2c66affSColin Finck     { 'F','i','l','e','V','e','r','s','i','o','n','\0' },
347*c2c66affSColin Finck     { '1','.','0','.','0','.','0','\0' },
348*c2c66affSColin Finck 
349*c2c66affSColin Finck     /* ProductVersion */
350*c2c66affSColin Finck     {
351*c2c66affSColin Finck         52, /* wLength */
352*c2c66affSColin Finck         8, /* wValueLength */
353*c2c66affSColin Finck         1, /* wType: Text */
354*c2c66affSColin Finck     },
355*c2c66affSColin Finck     { 'P','r','o','d','u','c','t','V','e','r','s','i','o','n','\0' },
356*c2c66affSColin Finck     { '1','.','0','.','0','.','1','\0' },
357*c2c66affSColin Finck 
358*c2c66affSColin Finck     /* CompanyName */
359*c2c66affSColin Finck     {
360*c2c66affSColin Finck         56, /* wLength */
361*c2c66affSColin Finck         12, /* wValueLength */
362*c2c66affSColin Finck         1, /* wType: Text */
363*c2c66affSColin Finck     },
364*c2c66affSColin Finck     { 'C','o','m','p','a','n','y','N','a','m','e','\0' },
365*c2c66affSColin Finck     { 'C','o','m','p','a','n','y','N','a','m','e','\0' },
366*c2c66affSColin Finck 
367*c2c66affSColin Finck     /* FileDescription */
368*c2c66affSColin Finck     {
369*c2c66affSColin Finck         72, /* wLength */
370*c2c66affSColin Finck         16, /* wValueLength */
371*c2c66affSColin Finck         1, /* wType: Text */
372*c2c66affSColin Finck     },
373*c2c66affSColin Finck     { 'F','i','l','e','D','e','s','c','r','i','p','t','i','o','n','\0' },
374*c2c66affSColin Finck     { 'F','i','l','e','D','e','s','c','r','i','p','t','i','o','n','\0' },
375*c2c66affSColin Finck 
376*c2c66affSColin Finck     /* InternalName */
377*c2c66affSColin Finck     {
378*c2c66affSColin Finck         58, /* wLength */
379*c2c66affSColin Finck         13, /* wValueLength */
380*c2c66affSColin Finck         1, /* wType: Text */
381*c2c66affSColin Finck     },
382*c2c66affSColin Finck     { 'I','n','t','e','r','n','a','l','N','a','m','e','\0' },
383*c2c66affSColin Finck     { 'I','n','t','e','r','n','a','l','N','a','m','e','\0' },
384*c2c66affSColin Finck 
385*c2c66affSColin Finck     /* LegalCopyright */
386*c2c66affSColin Finck     {
387*c2c66affSColin Finck         66, /* wLength */
388*c2c66affSColin Finck         15, /* wValueLength */
389*c2c66affSColin Finck         1, /* wType: Text */
390*c2c66affSColin Finck     },
391*c2c66affSColin Finck     { 'L','e','g','a','l','C','o','p','y','r','i','g','h','t','\0' },
392*c2c66affSColin Finck     { 'L','e','g','a','l','C','o','p','y','r','i','g','h','t','\0' },
393*c2c66affSColin Finck 
394*c2c66affSColin Finck     /* LegalTrademarks */
395*c2c66affSColin Finck     {
396*c2c66affSColin Finck         72, /* wLength */
397*c2c66affSColin Finck         16, /* wValueLength */
398*c2c66affSColin Finck         1, /* wType: Text */
399*c2c66affSColin Finck     },
400*c2c66affSColin Finck     { 'L','e','g','a','l','T','r','a','d','e','m','a','r','k','s','\0' },
401*c2c66affSColin Finck     { 'L','e','g','a','l','T','r','a','d','e','m','a','r','k','s','\0' },
402*c2c66affSColin Finck 
403*c2c66affSColin Finck     /* OriginalFilename */
404*c2c66affSColin Finck     {
405*c2c66affSColin Finck         74, /* wLength */
406*c2c66affSColin Finck         17, /* wValueLength */
407*c2c66affSColin Finck         1, /* wType: Text */
408*c2c66affSColin Finck     },
409*c2c66affSColin Finck     { 'O','r','i','g','i','n','a','l','F','i','l','e','n','a','m','e','\0' },
410*c2c66affSColin Finck     { 'O','r','i','g','i','n','a','l','F','i','l','e','n','a','m','e','\0' },
411*c2c66affSColin Finck 
412*c2c66affSColin Finck     /* ProductName */
413*c2c66affSColin Finck     {
414*c2c66affSColin Finck         56, /* wLength */
415*c2c66affSColin Finck         12, /* wValueLength */
416*c2c66affSColin Finck         1, /* wType: Text */
417*c2c66affSColin Finck     },
418*c2c66affSColin Finck     { 'P','r','o','d','u','c','t','N','a','m','e','\0' },
419*c2c66affSColin Finck     { 'P','r','o','d','u','c','t','N','a','m','e','\0' },
420*c2c66affSColin Finck 
421*c2c66affSColin Finck 
422*c2c66affSColin Finck     /* file_info */
423*c2c66affSColin Finck     {
424*c2c66affSColin Finck         0x44, /* wLength */
425*c2c66affSColin Finck         0, /* wValueLength */
426*c2c66affSColin Finck         1, /* wType: Text */
427*c2c66affSColin Finck         { 'V','a','r','F','i','l','e','I','n','f','o','\0' } /* szKey[13] */
428*c2c66affSColin Finck     },
429*c2c66affSColin Finck 
430*c2c66affSColin Finck     /* translation */
431*c2c66affSColin Finck     {
432*c2c66affSColin Finck         0x24, /* wLength */
433*c2c66affSColin Finck         4, /* wValueLength */
434*c2c66affSColin Finck         0, /* wType: Binary */
435*c2c66affSColin Finck         { 'T','r','a','n','s','l','a','t','i','o','n','\0' }, /* szKey[13] */
436*c2c66affSColin Finck         0xffff /* Value */
437*c2c66affSColin Finck     }
438*c2c66affSColin Finck };
439*c2c66affSColin Finck 
440*c2c66affSColin Finck typedef struct export_section_t
441*c2c66affSColin Finck {
442*c2c66affSColin Finck     IMAGE_EXPORT_DIRECTORY desc;
443*c2c66affSColin Finck     char binary_name[10];
444*c2c66affSColin Finck } export_section_t;
445*c2c66affSColin Finck 
446*c2c66affSColin Finck /* This export section is not complete, but the Name RVA is only taken into account */
447*c2c66affSColin Finck static export_section_t export_dir =
448*c2c66affSColin Finck {
449*c2c66affSColin Finck     {
450*c2c66affSColin Finck         0, /* Characteristics */
451*c2c66affSColin Finck         0, /* TimeDateStamp */
452*c2c66affSColin Finck         0, /* MajorVersion */
453*c2c66affSColin Finck         0, /* MinorVersion */
454*c2c66affSColin Finck         0x2398, /* Name (RVA) */
455*c2c66affSColin Finck         1, /* Base */
456*c2c66affSColin Finck         0, /* NumberOfFunctions */
457*c2c66affSColin Finck         0, /* NumberOfNames */
458*c2c66affSColin Finck         0, /* AddressOfFunctions (RVA)  */
459*c2c66affSColin Finck         0, /* AddressOfNames (RVA) */
460*c2c66affSColin Finck         0, /* AddressOfNameOrdinals (RVA) */
461*c2c66affSColin Finck     },
462*c2c66affSColin Finck     { 'T','e','S','t','2','.','e','x','e',0 }, /* binary_name */
463*c2c66affSColin Finck };
464*c2c66affSColin Finck 
465*c2c66affSColin Finck 
466*c2c66affSColin Finck void test_create_exe_imp(const WCHAR* name, int skip_rsrc_exports)
467*c2c66affSColin Finck {
468*c2c66affSColin Finck     HANDLE file;
469*c2c66affSColin Finck     char *buf, *cur;
470*c2c66affSColin Finck     DWORD size = 0x800;
471*c2c66affSColin Finck     buf = malloc(size);
472*c2c66affSColin Finck 
473*c2c66affSColin Finck     file = CreateFileW(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
474*c2c66affSColin Finck     winetest_ok(file != INVALID_HANDLE_VALUE, "can't create file\n");
475*c2c66affSColin Finck     if(file == INVALID_HANDLE_VALUE)
476*c2c66affSColin Finck         return;
477*c2c66affSColin Finck 
478*c2c66affSColin Finck     memset(buf, 0, size);
479*c2c66affSColin Finck     cur = buf;
480*c2c66affSColin Finck     cur = memcpy(buf, &dos_header, sizeof(dos_header));
481*c2c66affSColin Finck     cur += dos_header.e_lfanew;
482*c2c66affSColin Finck 
483*c2c66affSColin Finck     memcpy(cur, &nt_header, sizeof(nt_header));
484*c2c66affSColin Finck     if (skip_rsrc_exports)
485*c2c66affSColin Finck     {
486*c2c66affSColin Finck         ((IMAGE_NT_HEADERS32*)cur)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = 0;
487*c2c66affSColin Finck         ((IMAGE_NT_HEADERS32*)cur)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = 0;
488*c2c66affSColin Finck     }
489*c2c66affSColin Finck     cur += sizeof(nt_header);
490*c2c66affSColin Finck     memcpy(cur, section_headers, sizeof(section_headers));
491*c2c66affSColin Finck 
492*c2c66affSColin Finck     /* write code section: */
493*c2c66affSColin Finck     cur = buf + section_headers[0].PointerToRawData;
494*c2c66affSColin Finck     memcpy(cur, text_section, sizeof(text_section));
495*c2c66affSColin Finck 
496*c2c66affSColin Finck     if (!skip_rsrc_exports)
497*c2c66affSColin Finck     {
498*c2c66affSColin Finck         /* write resource section: */
499*c2c66affSColin Finck         cur = buf + section_headers[1].PointerToRawData;
500*c2c66affSColin Finck         memcpy(cur, &rsrc_section, sizeof(rsrc_section));
501*c2c66affSColin Finck 
502*c2c66affSColin Finck         /* write minimal export directory: */
503*c2c66affSColin Finck         cur += 0x370;
504*c2c66affSColin Finck         memcpy(cur, &export_dir, sizeof(export_dir));
505*c2c66affSColin Finck     }
506*c2c66affSColin Finck 
507*c2c66affSColin Finck     WriteFile(file, buf, size, &size, NULL);
508*c2c66affSColin Finck     free(buf);
509*c2c66affSColin Finck     CloseHandle(file);
510*c2c66affSColin Finck }
511*c2c66affSColin Finck 
512*c2c66affSColin Finck 
513*c2c66affSColin Finck /* Almost everything in this filetype is ignored, only e_lfanew, ne_restab and ne_nrestab are relevant */
514*c2c66affSColin Finck void test_create_ne_imp(const WCHAR* name, int skip_names)
515*c2c66affSColin Finck {
516*c2c66affSColin Finck     HANDLE file;
517*c2c66affSColin Finck     DWORD size;
518*c2c66affSColin Finck     IMAGE_DOS_HEADER MZ_hdr = { IMAGE_DOS_SIGNATURE, 0 };
519*c2c66affSColin Finck     IMAGE_OS2_HEADER NE_hdr = { IMAGE_OS2_SIGNATURE, 0 };
520*c2c66affSColin Finck     static const BYTE NE_names[] =
521*c2c66affSColin Finck     {
522*c2c66affSColin Finck         /* Show that the length is used, not the nullterm*/
523*c2c66affSColin Finck         11,'T','E','S','T','M','O','D','.','h','X','x','x',0,0,0,
524*c2c66affSColin Finck         20,'M','O','D',' ','D','E','S','C','R','I','P','T','I','O','N',' ','H','E','R','E',0,0,0
525*c2c66affSColin Finck     };
526*c2c66affSColin Finck 
527*c2c66affSColin Finck     file = CreateFileW(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
528*c2c66affSColin Finck     winetest_ok(file != INVALID_HANDLE_VALUE, "can't create file\n");
529*c2c66affSColin Finck     if(file == INVALID_HANDLE_VALUE)
530*c2c66affSColin Finck         return;
531*c2c66affSColin Finck 
532*c2c66affSColin Finck     MZ_hdr.e_lfanew = sizeof(MZ_hdr);
533*c2c66affSColin Finck     if (!skip_names)
534*c2c66affSColin Finck     {
535*c2c66affSColin Finck         NE_hdr.ne_restab = sizeof(NE_hdr);  /* First entry (pascal string + ordinal) = module name */
536*c2c66affSColin Finck         NE_hdr.ne_nrestab = sizeof(MZ_hdr) + sizeof(NE_hdr) + 16;  /* First entry (pascal string + ordinal) = module description */
537*c2c66affSColin Finck     }
538*c2c66affSColin Finck 
539*c2c66affSColin Finck     WriteFile(file, &MZ_hdr, sizeof(MZ_hdr), &size, NULL);
540*c2c66affSColin Finck     WriteFile(file, &NE_hdr, sizeof(NE_hdr), &size, NULL);
541*c2c66affSColin Finck     WriteFile(file, NE_names, sizeof(NE_names), &size, NULL);
542*c2c66affSColin Finck 
543*c2c66affSColin Finck     CloseHandle(file);
544*c2c66affSColin Finck }
545*c2c66affSColin Finck 
546*c2c66affSColin Finck void test_create_file_imp(const WCHAR* name, const char* contents, size_t len)
547*c2c66affSColin Finck {
548*c2c66affSColin Finck     HANDLE file = CreateFileW(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
549*c2c66affSColin Finck     winetest_ok(file != INVALID_HANDLE_VALUE, "can't create file\n");
550*c2c66affSColin Finck     if (file != INVALID_HANDLE_VALUE)
551*c2c66affSColin Finck     {
552*c2c66affSColin Finck         if (contents && len)
553*c2c66affSColin Finck         {
554*c2c66affSColin Finck             DWORD size;
555*c2c66affSColin Finck             WriteFile(file, contents, len, &size, NULL);
556*c2c66affSColin Finck         }
557*c2c66affSColin Finck         CloseHandle(file);
558*c2c66affSColin Finck     }
559*c2c66affSColin Finck }
560*c2c66affSColin Finck 
561*c2c66affSColin Finck static unsigned char win10Header[8] = {
562*c2c66affSColin Finck     0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
563*c2c66affSColin Finck };
564*c2c66affSColin Finck static unsigned char rawData[2356] = {
565*c2c66affSColin Finck     0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x73, 0x64, 0x62, 0x66,
566*c2c66affSColin Finck     0x02, 0x78, 0x3E, 0x01, 0x00, 0x00, 0x03, 0x78, 0x44, 0x00, 0x00, 0x00,
567*c2c66affSColin Finck     0x02, 0x38, 0x07, 0x70, 0x03, 0x38, 0x01, 0x60, 0x16, 0x40, 0x01, 0x00,
568*c2c66affSColin Finck     0x00, 0x00, 0x01, 0x98, 0x30, 0x00, 0x00, 0x00, 0x4C, 0x4C, 0x41, 0x5F,
569*c2c66affSColin Finck     0x54, 0x53, 0x45, 0x54, 0xC6, 0x01, 0x00, 0x00, 0x53, 0x49, 0x44, 0x5F,
570*c2c66affSColin Finck     0x54, 0x53, 0x45, 0x54, 0x56, 0x02, 0x00, 0x00, 0x57, 0x45, 0x4E, 0x5F,
571*c2c66affSColin Finck     0x54, 0x53, 0x45, 0x54, 0xEC, 0x02, 0x00, 0x00, 0x4B, 0x32, 0x57, 0x5F,
572*c2c66affSColin Finck     0x54, 0x53, 0x45, 0x54, 0x7C, 0x03, 0x00, 0x00, 0x03, 0x78, 0x0E, 0x00,
573*c2c66affSColin Finck     0x00, 0x00, 0x02, 0x38, 0x07, 0x70, 0x03, 0x38, 0x0B, 0x60, 0x01, 0x98,
574*c2c66affSColin Finck     0x00, 0x00, 0x00, 0x00, 0x03, 0x78, 0x0E, 0x00, 0x00, 0x00, 0x02, 0x38,
575*c2c66affSColin Finck     0x07, 0x70, 0x03, 0x38, 0x20, 0x60, 0x01, 0x98, 0x00, 0x00, 0x00, 0x00,
576*c2c66affSColin Finck     0x03, 0x78, 0x0E, 0x00, 0x00, 0x00, 0x02, 0x38, 0x04, 0x70, 0x03, 0x38,
577*c2c66affSColin Finck     0x01, 0x60, 0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x03, 0x78, 0x26, 0x00,
578*c2c66affSColin Finck     0x00, 0x00, 0x02, 0x38, 0x0D, 0x70, 0x03, 0x38, 0x15, 0x40, 0x01, 0x98,
579*c2c66affSColin Finck     0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580*c2c66affSColin Finck     0x74, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
581*c2c66affSColin Finck     0x50, 0x04, 0x00, 0x00, 0x03, 0x78, 0x14, 0x00, 0x00, 0x00, 0x02, 0x38,
582*c2c66affSColin Finck     0x10, 0x70, 0x03, 0x38, 0x01, 0x60, 0x16, 0x40, 0x01, 0x00, 0x00, 0x00,
583*c2c66affSColin Finck     0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x03, 0x78, 0x0E, 0x00, 0x00, 0x00,
584*c2c66affSColin Finck     0x02, 0x38, 0x12, 0x70, 0x03, 0x38, 0x06, 0x90, 0x01, 0x98, 0x00, 0x00,
585*c2c66affSColin Finck     0x00, 0x00, 0x03, 0x78, 0x14, 0x00, 0x00, 0x00, 0x02, 0x38, 0x12, 0x70,
586*c2c66affSColin Finck     0x03, 0x38, 0x04, 0x90, 0x16, 0x40, 0x01, 0x00, 0x00, 0x00, 0x01, 0x98,
587*c2c66affSColin Finck     0x00, 0x00, 0x00, 0x00, 0x03, 0x78, 0x3E, 0x00, 0x00, 0x00, 0x02, 0x38,
588*c2c66affSColin Finck     0x07, 0x70, 0x03, 0x38, 0x04, 0x90, 0x01, 0x98, 0x30, 0x00, 0x00, 0x00,
589*c2c66affSColin Finck     0xED, 0xB4, 0x89, 0x50, 0xB1, 0xA4, 0x82, 0xA7, 0xEC, 0x02, 0x00, 0x00,
590*c2c66affSColin Finck     0x85, 0x2B, 0x88, 0x40, 0x97, 0x76, 0xA6, 0xC4, 0xC6, 0x01, 0x00, 0x00,
591*c2c66affSColin Finck     0x77, 0x7A, 0xBF, 0x48, 0x78, 0xB1, 0x69, 0xD2, 0x56, 0x02, 0x00, 0x00,
592*c2c66affSColin Finck     0xD0, 0x15, 0xE6, 0xCB, 0xE8, 0x90, 0x68, 0xFE, 0x7C, 0x03, 0x00, 0x00,
593*c2c66affSColin Finck     0x01, 0x70, 0x42, 0x03, 0x00, 0x00, 0x01, 0x50, 0x3E, 0xD6, 0xC0, 0x02,
594*c2c66affSColin Finck     0x1A, 0xB9, 0xD1, 0x01, 0x22, 0x60, 0x06, 0x00, 0x00, 0x00, 0x01, 0x60,
595*c2c66affSColin Finck     0x1C, 0x00, 0x00, 0x00, 0x23, 0x40, 0x01, 0x00, 0x00, 0x00, 0x07, 0x90,
596*c2c66affSColin Finck     0x10, 0x00, 0x00, 0x00, 0xB0, 0x0E, 0x9B, 0xE3, 0xDB, 0x55, 0x0B, 0x45,
597*c2c66affSColin Finck     0x9B, 0xD4, 0xD2, 0x0C, 0x94, 0x84, 0x26, 0x0F, 0x02, 0x70, 0x00, 0x00,
598*c2c66affSColin Finck     0x00, 0x00, 0x0B, 0x70, 0x32, 0x00, 0x00, 0x00, 0x01, 0x60, 0x3E, 0x00,
599*c2c66affSColin Finck     0x00, 0x00, 0x09, 0x70, 0x26, 0x00, 0x00, 0x00, 0x01, 0x60, 0x5C, 0x00,
600*c2c66affSColin Finck     0x00, 0x00, 0x08, 0x60, 0x82, 0x00, 0x00, 0x00, 0x03, 0x70, 0x06, 0x00,
601*c2c66affSColin Finck     0x00, 0x00, 0x03, 0x60, 0xA0, 0x00, 0x00, 0x00, 0x03, 0x70, 0x08, 0x00,
602*c2c66affSColin Finck     0x00, 0x00, 0x01, 0x10, 0x03, 0x60, 0xBE, 0x00, 0x00, 0x00, 0x07, 0x70,
603*c2c66affSColin Finck     0x8A, 0x00, 0x00, 0x00, 0x01, 0x60, 0xDC, 0x00, 0x00, 0x00, 0x06, 0x60,
604*c2c66affSColin Finck     0x00, 0x01, 0x00, 0x00, 0x05, 0x60, 0x2C, 0x01, 0x00, 0x00, 0x04, 0x90,
605*c2c66affSColin Finck     0x10, 0x00, 0x00, 0x00, 0x3F, 0xC9, 0x50, 0x4E, 0x63, 0xB8, 0xFA, 0x4D,
606*c2c66affSColin Finck     0xBA, 0xE2, 0xD8, 0x0E, 0xF4, 0xCE, 0x5C, 0x89, 0x0D, 0x70, 0x24, 0x00,
607*c2c66affSColin Finck     0x00, 0x00, 0x17, 0x40, 0x01, 0x00, 0x00, 0x00, 0x10, 0x40, 0x01, 0x00,
608*c2c66affSColin Finck     0x00, 0x00, 0x15, 0x40, 0x01, 0x00, 0x00, 0x00, 0x24, 0x40, 0x72, 0x00,
609*c2c66affSColin Finck     0x6F, 0x00, 0x25, 0x40, 0x67, 0x00, 0x72, 0x00, 0x26, 0x40, 0x00, 0x00,
610*c2c66affSColin Finck     0x00, 0x00, 0x08, 0x70, 0x32, 0x00, 0x00, 0x00, 0x01, 0x60, 0x5C, 0x01,
611*c2c66affSColin Finck     0x00, 0x00, 0x09, 0x60, 0x66, 0x01, 0x00, 0x00, 0x10, 0x60, 0x84, 0x01,
612*c2c66affSColin Finck     0x00, 0x00, 0x11, 0x60, 0xA2, 0x01, 0x00, 0x00, 0x13, 0x60, 0xB8, 0x01,
613*c2c66affSColin Finck     0x00, 0x00, 0x06, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
614*c2c66affSColin Finck     0x0D, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x70,
615*c2c66affSColin Finck     0x90, 0x00, 0x00, 0x00, 0x01, 0x60, 0xCE, 0x01, 0x00, 0x00, 0x06, 0x60,
616*c2c66affSColin Finck     0xF8, 0x01, 0x00, 0x00, 0x05, 0x60, 0x2A, 0x02, 0x00, 0x00, 0x04, 0x90,
617*c2c66affSColin Finck     0x10, 0x00, 0x00, 0x00, 0xE1, 0x20, 0x67, 0x15, 0x98, 0xEF, 0x04, 0x4D,
618*c2c66affSColin Finck     0x96, 0x5A, 0xD8, 0x5D, 0xE0, 0x5E, 0x6D, 0x9F, 0x0D, 0x70, 0x24, 0x00,
619*c2c66affSColin Finck     0x00, 0x00, 0x17, 0x40, 0x01, 0x00, 0x00, 0x00, 0x10, 0x40, 0x02, 0x00,
620*c2c66affSColin Finck     0x00, 0x00, 0x15, 0x40, 0x02, 0x00, 0x00, 0x00, 0x24, 0x40, 0x20, 0x00,
621*c2c66affSColin Finck     0x32, 0x00, 0x25, 0x40, 0x2E, 0x00, 0x38, 0x00, 0x26, 0x40, 0x00, 0x00,
622*c2c66affSColin Finck     0x00, 0x00, 0x08, 0x70, 0x38, 0x00, 0x00, 0x00, 0x01, 0x60, 0x5C, 0x01,
623*c2c66affSColin Finck     0x00, 0x00, 0x09, 0x60, 0x66, 0x01, 0x00, 0x00, 0x10, 0x60, 0x84, 0x01,
624*c2c66affSColin Finck     0x00, 0x00, 0x11, 0x60, 0xA2, 0x01, 0x00, 0x00, 0x02, 0x50, 0x00, 0x00,
625*c2c66affSColin Finck     0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x50, 0x01, 0x00, 0x00, 0x00,
626*c2c66affSColin Finck     0x00, 0x00, 0x01, 0x00, 0x0B, 0x40, 0xAD, 0xBA, 0x00, 0x00, 0x13, 0x60,
627*c2c66affSColin Finck     0xB8, 0x01, 0x00, 0x00, 0x07, 0x70, 0x8A, 0x00, 0x00, 0x00, 0x01, 0x60,
628*c2c66affSColin Finck     0x60, 0x02, 0x00, 0x00, 0x06, 0x60, 0x80, 0x02, 0x00, 0x00, 0x05, 0x60,
629*c2c66affSColin Finck     0x9E, 0x02, 0x00, 0x00, 0x04, 0x90, 0x10, 0x00, 0x00, 0x00, 0x69, 0xEF,
630*c2c66affSColin Finck     0x70, 0xCE, 0x1D, 0xA2, 0x8B, 0x40, 0x84, 0x5B, 0xF9, 0x9E, 0xAC, 0x06,
631*c2c66affSColin Finck     0x09, 0xE7, 0x08, 0x70, 0x32, 0x00, 0x00, 0x00, 0x01, 0x60, 0x5C, 0x01,
632*c2c66affSColin Finck     0x00, 0x00, 0x09, 0x60, 0x66, 0x01, 0x00, 0x00, 0x10, 0x60, 0x84, 0x01,
633*c2c66affSColin Finck     0x00, 0x00, 0x11, 0x60, 0xA2, 0x01, 0x00, 0x00, 0x02, 0x50, 0x00, 0x00,
634*c2c66affSColin Finck     0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x50, 0x01, 0x00, 0x00, 0x00,
635*c2c66affSColin Finck     0x00, 0x00, 0x01, 0x00, 0x13, 0x60, 0xB8, 0x01, 0x00, 0x00, 0x08, 0x70,
636*c2c66affSColin Finck     0x12, 0x00, 0x00, 0x00, 0x01, 0x60, 0xC0, 0x02, 0x00, 0x00, 0x01, 0x40,
637*c2c66affSColin Finck     0x04, 0x00, 0x00, 0x00, 0x03, 0x40, 0xB0, 0xB0, 0xB0, 0xB0, 0x0B, 0x70,
638*c2c66affSColin Finck     0x0C, 0x00, 0x00, 0x00, 0x01, 0x60, 0x3E, 0x00, 0x00, 0x00, 0x1A, 0x40,
639*c2c66affSColin Finck     0x8E, 0x01, 0x00, 0x00, 0x07, 0x70, 0xCE, 0x00, 0x00, 0x00, 0x01, 0x60,
640*c2c66affSColin Finck     0xEC, 0x02, 0x00, 0x00, 0x06, 0x60, 0x0E, 0x03, 0x00, 0x00, 0x05, 0x60,
641*c2c66affSColin Finck     0x26, 0x03, 0x00, 0x00, 0x04, 0x90, 0x10, 0x00, 0x00, 0x00, 0x44, 0xD1,
642*c2c66affSColin Finck     0xEA, 0xB4, 0x40, 0xF6, 0x4B, 0x4E, 0x94, 0xC4, 0x0C, 0x7F, 0xA8, 0x66,
643*c2c66affSColin Finck     0x23, 0xB0, 0x08, 0x70, 0x94, 0x00, 0x00, 0x00, 0x01, 0x60, 0x5C, 0x01,
644*c2c66affSColin Finck     0x00, 0x00, 0x01, 0x40, 0x00, 0x08, 0x00, 0x00, 0x03, 0x40, 0x29, 0xD6,
645*c2c66affSColin Finck     0x8B, 0x17, 0x09, 0x60, 0x66, 0x01, 0x00, 0x00, 0x10, 0x60, 0x84, 0x01,
646*c2c66affSColin Finck     0x00, 0x00, 0x11, 0x60, 0xA2, 0x01, 0x00, 0x00, 0x12, 0x60, 0x42, 0x03,
647*c2c66affSColin Finck     0x00, 0x00, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
648*c2c66affSColin Finck     0x03, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x40,
649*c2c66affSColin Finck     0x03, 0x00, 0x00, 0x00, 0x09, 0x40, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x40,
650*c2c66affSColin Finck     0x01, 0x00, 0x00, 0x00, 0x0B, 0x40, 0xAD, 0xBA, 0x00, 0x00, 0x1C, 0x40,
651*c2c66affSColin Finck     0x02, 0x00, 0x04, 0x00, 0x13, 0x60, 0xB8, 0x01, 0x00, 0x00, 0x14, 0x60,
652*c2c66affSColin Finck     0x68, 0x03, 0x00, 0x00, 0x15, 0x60, 0x90, 0x03, 0x00, 0x00, 0x16, 0x60,
653*c2c66affSColin Finck     0xB0, 0x03, 0x00, 0x00, 0x06, 0x50, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
654*c2c66affSColin Finck     0x01, 0x00, 0x0D, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
655*c2c66affSColin Finck     0x1D, 0x40, 0x45, 0x23, 0x01, 0x00, 0x1E, 0x40, 0x45, 0x23, 0x01, 0x00,
656*c2c66affSColin Finck     0x0B, 0x70, 0x06, 0x00, 0x00, 0x00, 0x01, 0x60, 0xD4, 0x03, 0x00, 0x00,
657*c2c66affSColin Finck     0x0D, 0x70, 0x1E, 0x00, 0x00, 0x00, 0x15, 0x40, 0x02, 0x00, 0x00, 0x00,
658*c2c66affSColin Finck     0x0E, 0x70, 0x06, 0x00, 0x00, 0x00, 0x19, 0x60, 0xEC, 0x03, 0x00, 0x00,
659*c2c66affSColin Finck     0x1B, 0x60, 0xF8, 0x01, 0x00, 0x00, 0x18, 0x60, 0x2A, 0x04, 0x00, 0x00,
660*c2c66affSColin Finck     0x0D, 0x70, 0x1E, 0x00, 0x00, 0x00, 0x15, 0x40, 0x01, 0x00, 0x00, 0x00,
661*c2c66affSColin Finck     0x0E, 0x70, 0x06, 0x00, 0x00, 0x00, 0x19, 0x60, 0x4A, 0x04, 0x00, 0x00,
662*c2c66affSColin Finck     0x1B, 0x60, 0x00, 0x01, 0x00, 0x00, 0x18, 0x60, 0x82, 0x04, 0x00, 0x00,
663*c2c66affSColin Finck     0x01, 0x78, 0x96, 0x04, 0x00, 0x00, 0x01, 0x88, 0x10, 0x00, 0x00, 0x00,
664*c2c66affSColin Finck     0x32, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x2E, 0x00,
665*c2c66affSColin Finck     0x33, 0x00, 0x00, 0x00, 0x01, 0x88, 0x1C, 0x00, 0x00, 0x00, 0x61, 0x00,
666*c2c66affSColin Finck     0x70, 0x00, 0x70, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00,
667*c2c66affSColin Finck     0x5F, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x31, 0x00,
668*c2c66affSColin Finck     0x00, 0x00, 0x01, 0x88, 0x18, 0x00, 0x00, 0x00, 0x54, 0x00, 0x65, 0x00,
669*c2c66affSColin Finck     0x73, 0x00, 0x74, 0x00, 0x4E, 0x00, 0x65, 0x00, 0x77, 0x00, 0x4D, 0x00,
670*c2c66affSColin Finck     0x6F, 0x00, 0x64, 0x00, 0x65, 0x00, 0x00, 0x00, 0x01, 0x88, 0x20, 0x00,
671*c2c66affSColin Finck     0x00, 0x00, 0x56, 0x00, 0x69, 0x00, 0x72, 0x00, 0x74, 0x00, 0x75, 0x00,
672*c2c66affSColin Finck     0x61, 0x00, 0x6C, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x69, 0x00,
673*c2c66affSColin Finck     0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x79, 0x00, 0x00, 0x00, 0x01, 0x88,
674*c2c66affSColin Finck     0x18, 0x00, 0x00, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6D, 0x00,
675*c2c66affSColin Finck     0x65, 0x00, 0x41, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x76, 0x00,
676*c2c66affSColin Finck     0x65, 0x00, 0x00, 0x00, 0x01, 0x88, 0x18, 0x00, 0x00, 0x00, 0x65, 0x00,
677*c2c66affSColin Finck     0x78, 0x00, 0x63, 0x00, 0x6C, 0x00, 0x75, 0x00, 0x64, 0x00, 0x65, 0x00,
678*c2c66affSColin Finck     0x2E, 0x00, 0x64, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x01, 0x88,
679*c2c66affSColin Finck     0x18, 0x00, 0x00, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x63, 0x00, 0x6C, 0x00,
680*c2c66affSColin Finck     0x75, 0x00, 0x64, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x64, 0x00, 0x6C, 0x00,
681*c2c66affSColin Finck     0x6C, 0x00, 0x00, 0x00, 0x01, 0x88, 0x1E, 0x00, 0x00, 0x00, 0x74, 0x00,
682*c2c66affSColin Finck     0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x61, 0x00, 0x6C, 0x00,
683*c2c66affSColin Finck     0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x78, 0x00,
684*c2c66affSColin Finck     0x65, 0x00, 0x00, 0x00, 0x01, 0x88, 0x26, 0x00, 0x00, 0x00, 0x61, 0x00,
685*c2c66affSColin Finck     0x70, 0x00, 0x70, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00,
686*c2c66affSColin Finck     0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5F, 0x00,
687*c2c66affSColin Finck     0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00,
688*c2c66affSColin Finck     0x01, 0x88, 0x2A, 0x00, 0x00, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00,
689*c2c66affSColin Finck     0x68, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00, 0x5F, 0x00, 0x76, 0x00,
690*c2c66affSColin Finck     0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x5F, 0x00,
691*c2c66affSColin Finck     0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00,
692*c2c66affSColin Finck     0x01, 0x88, 0x04, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x01, 0x88,
693*c2c66affSColin Finck     0x18, 0x00, 0x00, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6D, 0x00, 0x70, 0x00,
694*c2c66affSColin Finck     0x61, 0x00, 0x6E, 0x00, 0x79, 0x00, 0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00,
695*c2c66affSColin Finck     0x65, 0x00, 0x00, 0x00, 0x01, 0x88, 0x18, 0x00, 0x00, 0x00, 0x50, 0x00,
696*c2c66affSColin Finck     0x72, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x75, 0x00, 0x63, 0x00, 0x74, 0x00,
697*c2c66affSColin Finck     0x4E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x01, 0x88,
698*c2c66affSColin Finck     0x10, 0x00, 0x00, 0x00, 0x31, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x2E, 0x00,
699*c2c66affSColin Finck     0x30, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x00, 0x00, 0x01, 0x88, 0x10, 0x00,
700*c2c66affSColin Finck     0x00, 0x00, 0x31, 0x00, 0x2E, 0x00, 0x30, 0x00, 0x2E, 0x00, 0x30, 0x00,
701*c2c66affSColin Finck     0x2E, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x88, 0x24, 0x00, 0x00, 0x00,
702*c2c66affSColin Finck     0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x64, 0x00,
703*c2c66affSColin Finck     0x69, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00,
704*c2c66affSColin Finck     0x77, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x78, 0x00, 0x65, 0x00, 0x00, 0x00,
705*c2c66affSColin Finck     0x01, 0x88, 0x2C, 0x00, 0x00, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00,
706*c2c66affSColin Finck     0x68, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00, 0x5F, 0x00, 0x6E, 0x00,
707*c2c66affSColin Finck     0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x5F, 0x00, 0x64, 0x00, 0x69, 0x00,
708*c2c66affSColin Finck     0x73, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00,
709*c2c66affSColin Finck     0x00, 0x00, 0x01, 0x88, 0x30, 0x00, 0x00, 0x00, 0x61, 0x00, 0x70, 0x00,
710*c2c66affSColin Finck     0x70, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6C, 0x00, 0x70, 0x00, 0x5F, 0x00,
711*c2c66affSColin Finck     0x76, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6F, 0x00, 0x72, 0x00,
712*c2c66affSColin Finck     0x5F, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6C, 0x00,
713*c2c66affSColin Finck     0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x01, 0x88, 0x1A, 0x00,
714*c2c66affSColin Finck     0x00, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x5F, 0x00,
715*c2c66affSColin Finck     0x6E, 0x00, 0x65, 0x00, 0x77, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x78, 0x00,
716*c2c66affSColin Finck     0x65, 0x00, 0x00, 0x00, 0x01, 0x88, 0x18, 0x00, 0x00, 0x00, 0x66, 0x00,
717*c2c66affSColin Finck     0x69, 0x00, 0x78, 0x00, 0x6E, 0x00, 0x65, 0x00, 0x77, 0x00, 0x5F, 0x00,
718*c2c66affSColin Finck     0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x01, 0x88,
719*c2c66affSColin Finck     0x1C, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00, 0x78, 0x00, 0x6E, 0x00,
720*c2c66affSColin Finck     0x65, 0x00, 0x77, 0x00, 0x5F, 0x00, 0x76, 0x00, 0x65, 0x00, 0x6E, 0x00,
721*c2c66affSColin Finck     0x64, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x01, 0x88, 0x26, 0x00,
722*c2c66affSColin Finck     0x00, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x5F, 0x00,
723*c2c66affSColin Finck     0x63, 0x00, 0x68, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6B, 0x00, 0x66, 0x00,
724*c2c66affSColin Finck     0x69, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x2E, 0x00, 0x74, 0x00, 0x78, 0x00,
725*c2c66affSColin Finck     0x74, 0x00, 0x00, 0x00, 0x01, 0x88, 0x1C, 0x00, 0x00, 0x00, 0x74, 0x00,
726*c2c66affSColin Finck     0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x5F, 0x00, 0x77, 0x00, 0x32, 0x00,
727*c2c66affSColin Finck     0x6B, 0x00, 0x33, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x78, 0x00, 0x65, 0x00,
728*c2c66affSColin Finck     0x00, 0x00, 0x01, 0x88, 0x12, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00,
729*c2c66affSColin Finck     0x78, 0x00, 0x5F, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00,
730*c2c66affSColin Finck     0x00, 0x00, 0x01, 0x88, 0x16, 0x00, 0x00, 0x00, 0x66, 0x00, 0x69, 0x00,
731*c2c66affSColin Finck     0x78, 0x00, 0x5F, 0x00, 0x76, 0x00, 0x65, 0x00, 0x6E, 0x00, 0x64, 0x00,
732*c2c66affSColin Finck     0x6F, 0x00, 0x72, 0x00, 0x00, 0x00, 0x01, 0x88, 0x20, 0x00, 0x00, 0x00,
733*c2c66affSColin Finck     0x46, 0x00, 0x69, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x44, 0x00, 0x65, 0x00,
734*c2c66affSColin Finck     0x73, 0x00, 0x63, 0x00, 0x72, 0x00, 0x69, 0x00, 0x70, 0x00, 0x74, 0x00,
735*c2c66affSColin Finck     0x69, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x01, 0x88, 0x22, 0x00,
736*c2c66affSColin Finck     0x00, 0x00, 0x4F, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x69, 0x00,
737*c2c66affSColin Finck     0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x46, 0x00, 0x69, 0x00, 0x6C, 0x00,
738*c2c66affSColin Finck     0x65, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00,
739*c2c66affSColin Finck     0x01, 0x88, 0x1A, 0x00, 0x00, 0x00, 0x49, 0x00, 0x6E, 0x00, 0x74, 0x00,
740*c2c66affSColin Finck     0x65, 0x00, 0x72, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x4E, 0x00,
741*c2c66affSColin Finck     0x61, 0x00, 0x6D, 0x00, 0x65, 0x00, 0x00, 0x00, 0x01, 0x88, 0x1E, 0x00,
742*c2c66affSColin Finck     0x00, 0x00, 0x4C, 0x00, 0x65, 0x00, 0x67, 0x00, 0x61, 0x00, 0x6C, 0x00,
743*c2c66affSColin Finck     0x43, 0x00, 0x6F, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00,
744*c2c66affSColin Finck     0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x88, 0x12, 0x00,
745*c2c66affSColin Finck     0x00, 0x00, 0x57, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x53, 0x00, 0x72, 0x00,
746*c2c66affSColin Finck     0x76, 0x00, 0x30, 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x88, 0x38, 0x00,
747*c2c66affSColin Finck     0x00, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3A, 0x00,
748*c2c66affSColin Finck     0x2F, 0x00, 0x2F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x63, 0x00,
749*c2c66affSColin Finck     0x74, 0x00, 0x6F, 0x00, 0x73, 0x00, 0x2E, 0x00, 0x6F, 0x00, 0x72, 0x00,
750*c2c66affSColin Finck     0x67, 0x00, 0x2F, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x61, 0x00,
751*c2c66affSColin Finck     0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x00, 0x00, 0x01, 0x88,
752*c2c66affSColin Finck     0x1A, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x20, 0x00,
753*c2c66affSColin Finck     0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x65, 0x00,
754*c2c66affSColin Finck     0x64, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x88, 0x32, 0x00, 0x00, 0x00,
755*c2c66affSColin Finck     0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3A, 0x00, 0x2F, 0x00,
756*c2c66affSColin Finck     0x2F, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00,
757*c2c66affSColin Finck     0x6F, 0x00, 0x73, 0x00, 0x2E, 0x00, 0x6F, 0x00, 0x72, 0x00, 0x67, 0x00,
758*c2c66affSColin Finck     0x2F, 0x00, 0x61, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00,
759*c2c66affSColin Finck     0x00, 0x00, 0x01, 0x88, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x6C, 0x00,
760*c2c66affSColin Finck     0x6C, 0x00, 0x6F, 0x00, 0x77, 0x00, 0x20, 0x00, 0x69, 0x00, 0x74, 0x00,
761*c2c66affSColin Finck     0x21, 0x00, 0x00, 0x00
762*c2c66affSColin Finck };
763*c2c66affSColin Finck 
764*c2c66affSColin Finck DWORD test_get_db_size()
765*c2c66affSColin Finck {
766*c2c66affSColin Finck     return sizeof(rawData);
767*c2c66affSColin Finck }
768*c2c66affSColin Finck 
769*c2c66affSColin Finck void test_create_db_imp(const WCHAR* name, int win10)
770*c2c66affSColin Finck {
771*c2c66affSColin Finck     HANDLE file = CreateFileW(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
772*c2c66affSColin Finck     winetest_ok(file != INVALID_HANDLE_VALUE, "can't create file '%s'\n", wine_dbgstr_w(name));
773*c2c66affSColin Finck     if (file != INVALID_HANDLE_VALUE)
774*c2c66affSColin Finck     {
775*c2c66affSColin Finck         DWORD size;
776*c2c66affSColin Finck         WriteFile(file, rawData, sizeof(rawData), &size, NULL);
777*c2c66affSColin Finck         if (win10)
778*c2c66affSColin Finck         {
779*c2c66affSColin Finck             SetFilePointer(file, 0, NULL, FILE_BEGIN);
780*c2c66affSColin Finck             WriteFile(file, win10Header, sizeof(win10Header), &size, NULL);
781*c2c66affSColin Finck         }
782*c2c66affSColin Finck         CloseHandle(file);
783*c2c66affSColin Finck     }
784*c2c66affSColin Finck }
785*c2c66affSColin Finck 
786*c2c66affSColin Finck static DWORD g_WinVersion;
787*c2c66affSColin Finck DWORD get_host_winver(void)
788*c2c66affSColin Finck {
789*c2c66affSColin Finck     if (!g_WinVersion)
790*c2c66affSColin Finck     {
791*c2c66affSColin Finck         RTL_OSVERSIONINFOEXW rtlinfo = {0};
792*c2c66affSColin Finck         void (__stdcall* pRtlGetVersion)(RTL_OSVERSIONINFOEXW*);
793*c2c66affSColin Finck         pRtlGetVersion = (void (__stdcall*)(RTL_OSVERSIONINFOEXW*))GetProcAddress(GetModuleHandleA("ntdll"), "RtlGetVersion");
794*c2c66affSColin Finck 
795*c2c66affSColin Finck         rtlinfo.dwOSVersionInfoSize = sizeof(rtlinfo);
796*c2c66affSColin Finck         pRtlGetVersion(&rtlinfo);
797*c2c66affSColin Finck         g_WinVersion = (rtlinfo.dwMajorVersion << 8) | rtlinfo.dwMinorVersion;
798*c2c66affSColin Finck     }
799*c2c66affSColin Finck     return g_WinVersion;
800*c2c66affSColin Finck }
801*c2c66affSColin Finck 
802*c2c66affSColin Finck DWORD get_module_version(HMODULE mod)
803*c2c66affSColin Finck {
804*c2c66affSColin Finck     DWORD dwVersion = 0;
805*c2c66affSColin Finck     HRSRC hResInfo = FindResource(mod, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
806*c2c66affSColin Finck     DWORD dwSize = SizeofResource(mod, hResInfo);
807*c2c66affSColin Finck     if (hResInfo && dwSize)
808*c2c66affSColin Finck     {
809*c2c66affSColin Finck         VS_FIXEDFILEINFO *lpFfi;
810*c2c66affSColin Finck         UINT uLen;
811*c2c66affSColin Finck 
812*c2c66affSColin Finck         HGLOBAL hResData = LoadResource(mod, hResInfo);
813*c2c66affSColin Finck         LPVOID pRes = LockResource(hResData);
814*c2c66affSColin Finck         HLOCAL pResCopy = LocalAlloc(LMEM_FIXED, dwSize);
815*c2c66affSColin Finck 
816*c2c66affSColin Finck         CopyMemory(pResCopy, pRes, dwSize);
817*c2c66affSColin Finck         FreeResource(hResData);
818*c2c66affSColin Finck 
819*c2c66affSColin Finck         if (VerQueryValueW(pResCopy, L"\\", (LPVOID*)&lpFfi, &uLen))
820*c2c66affSColin Finck         {
821*c2c66affSColin Finck             dwVersion = (HIWORD(lpFfi->dwProductVersionMS) << 8) | LOWORD(lpFfi->dwProductVersionMS);
822*c2c66affSColin Finck             if (!dwVersion)
823*c2c66affSColin Finck                 dwVersion = (HIWORD(lpFfi->dwFileVersionMS) << 8) | LOWORD(lpFfi->dwFileVersionMS);
824*c2c66affSColin Finck         }
825*c2c66affSColin Finck 
826*c2c66affSColin Finck         LocalFree(pResCopy);
827*c2c66affSColin Finck     }
828*c2c66affSColin Finck 
829*c2c66affSColin Finck     return dwVersion;
830*c2c66affSColin Finck }
831*c2c66affSColin Finck 
832*c2c66affSColin Finck void silence_debug_output(void)
833*c2c66affSColin Finck {
834*c2c66affSColin Finck     if (GetEnvironmentVariableA("SHIM_DEBUG_LEVEL", NULL, 0) == ERROR_ENVVAR_NOT_FOUND)
835*c2c66affSColin Finck         SetEnvironmentVariableA("SHIM_DEBUG_LEVEL", "0");
836*c2c66affSColin Finck     if (GetEnvironmentVariableA("SHIMENG_DEBUG_LEVEL", NULL, 0) == ERROR_ENVVAR_NOT_FOUND)
837*c2c66affSColin Finck         SetEnvironmentVariableA("SHIMENG_DEBUG_LEVEL", "0");
838*c2c66affSColin Finck }
839*c2c66affSColin Finck 
840