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