Changeset 131
- Timestamp:
- Jan 9, 2002, 10:17:41 PM (24 years ago)
- Location:
- trunk
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/helpers/apps.h
r127 r131 36 36 * 37 37 ********************************************************************/ 38 39 ULONG appQueryEnvironmentLen(PCSZ pcszEnvironment); 38 40 39 41 /* -
trunk/include/helpers/dosh.h
r129 r131 385 385 PXFILE *ppFile); 386 386 387 #define DRFL_NOCACHE 0x0001 388 #define DRFL_FAILIFLESS 0x0002 389 387 390 APIRET doshReadAt(PXFILE pFile, 388 391 ULONG ulOffset, 389 392 PULONG pcb, 390 PBYTE pbData); 393 PBYTE pbData, 394 ULONG fl); 391 395 392 396 APIRET doshWrite(PXFILE pFile, -
trunk/include/helpers/exeh.h
r130 r131 32 32 #define EXEH_HEADER_INCLUDED 33 33 34 #pragma pack(1) 35 34 36 /******************************************************************** 35 37 * 36 * Executable helpers38 * DOS exe header 37 39 * 38 40 ********************************************************************/ 39 40 #pragma pack(1)41 41 42 42 /* … … 82 82 } DOSEXEHEADER, *PDOSEXEHEADER; 83 83 84 /******************************************************************** 85 * 86 * New Executable (NE) 87 * 88 ********************************************************************/ 89 84 90 // NE and LX OS types 85 91 #define NEOS_UNKNOWN 0 … … 107 113 ULONG ulChecksum; // 08: MS: reserved, OS/2: checksum ne_crc 108 114 USHORT usFlags; // 0c: flags ne_flags 109 /*110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 */115 #ifndef NENOTP // do not conflict with toolkit exe defs 116 #define NENOTP 0x8000 // Not a process == library 117 #define NENOTMPSAFE 0x4000 // Process is not multi-processor safe 118 // (Win3.1 SDK: "reserved") 119 #define NEIERR 0x2000 // Errors in image 120 #define NEBOUND 0x0800 // Bound Family/API 121 // (Win3.1 SDK: "first segment contains code 122 // that loads the application") 123 #define NEAPPTYP 0x0700 // Application type mask 124 // (Win3.1 SDK: "reserved") 125 #define NENOTWINCOMPAT 0x0100 // Not compatible with P.M. Windowing 126 // (Win3.1 SDK: "reserved") 127 #define NEWINCOMPAT 0x0200 // Compatible with P.M. Windowing 128 // (Win3.1 SDK: "reserved") 129 #define NEWINAPI 0x0300 // Uses P.M. Windowing API 130 // (Win3.1 SDK: "reserved") 131 #define NEFLTP 0x0080 // Floating-point instructions 132 #define NEI386 0x0040 // 386 instructions 133 #define NEI286 0x0020 // 286 instructions 134 #define NEI086 0x0010 // 8086 instructions 135 #define NEPROT 0x0008 // Runs in protected mode only 136 // (Win3.1 SDK: "reserved") 137 #define NEPPLI 0x0004 // Per-Process Library Initialization 138 // (Win3.1 SDK: "reserved") 139 #define NEINST 0x0002 // Instance data 140 #define NESOLO 0x0001 // Solo data (single data) 141 #endif 136 142 USHORT usAutoDataSegNo; // 0e: auto-data seg no. ne_autodata 137 143 // (Win3.1 SDK: "0 if both NEINST and NESOLO are cleared") … … 181 187 182 188 /* 189 *@@ OS2NERESTBLENTRY: 190 * OS/2 NE resource table entry. 191 * 192 *@@added V0.9.16 (2001-12-08) [umoeller] 193 */ 194 195 typedef struct _OS2NERESTBLENTRY 196 { 197 USHORT usType; 198 USHORT usID; 199 } OS2NERESTBLENTRY, *POS2NERESTBLENTRY; 200 201 /* 202 *@@ OS2NESEGMENT: 203 * OS/2 NE segment definition. 204 * 205 *@@added V0.9.16 (2001-12-08) [umoeller] 206 */ 207 208 typedef struct _OS2NESEGMENT // New .EXE segment table entry 209 { 210 USHORT ns_sector; // File sector of start of segment 211 USHORT ns_cbseg; // Number of bytes in file 212 USHORT ns_flags; // Attribute flags 213 USHORT ns_minalloc; // Minimum allocation in bytes 214 } OS2NESEGMENT, *POS2NESEGMENT; 215 216 /******************************************************************** 217 * 218 * Linear Executable (LX) 219 * 220 ********************************************************************/ 221 222 /* 183 223 *@@ LXHEADER: 184 224 * linear executable (LX) header format, … … 204 244 ULONG ulModuleVersion; // 0c: e32_ver module version 205 245 ULONG ulFlags; // 10: e32_mflags module flags 206 /* #define E32NOTP 0x8000L // Library Module - used as NENOTP 207 #define E32NOLOAD 0x2000L // Module not Loadable 208 #define E32PMAPI 0x0300L // Uses PM Windowing API 209 #define E32PMW 0x0200L // Compatible with PM Windowing 210 #define E32NOPMW 0x0100L // Incompatible with PM Windowing 211 #define E32NOEXTFIX 0x0020L // NO External Fixups in .EXE 212 #define E32NOINTFIX 0x0010L // NO Internal Fixups in .EXE 213 #define E32SYSDLL 0x0008L // System DLL, Internal Fixups discarded 214 #define E32LIBINIT 0x0004L // Per-Process Library Initialization 215 #define E32LIBTERM 0x40000000L // Per-Process Library Termination 216 #define E32APPMASK 0x0300L // Application Type Mask 217 */ 246 #ifndef E32NOTP // do not conflict with toolkit exe defs 247 #define E32NOTP 0x8000L // Library Module - used as NENOTP 248 #define E32NOLOAD 0x2000L // Module not Loadable 249 #define E32PMAPI 0x0300L // Uses PM Windowing API 250 #define E32PMW 0x0200L // Compatible with PM Windowing 251 #define E32NOPMW 0x0100L // Incompatible with PM Windowing 252 #define E32NOEXTFIX 0x0020L // NO External Fixups in .EXE 253 #define E32NOINTFIX 0x0010L // NO Internal Fixups in .EXE 254 #define E32SYSDLL 0x0008L // System DLL, Internal Fixups discarded 255 #define E32LIBINIT 0x0004L // Per-Process Library Initialization 256 #define E32LIBTERM 0x40000000L // Per-Process Library Termination 257 #define E32APPMASK 0x0300L // Application Type Mask 258 #endif 218 259 ULONG ulPageCount; // 14: e32_mpages no. of pages in module 219 260 ULONG ulEIPRelObj; // 18: e32_startobj obj # for IP … … 260 301 } LXHEADER, *PLXHEADER; 261 302 262 /*263 *@@ PEHEADER:264 * portable executable (PE) header format,265 * which comes after the DOS header in the266 * EXE file (at DOSEXEHEADER.ulNewHeaderOfs).267 *268 *@@added V0.9.10 (2001-04-08) [lafaix]269 */270 271 typedef struct _PEHEADER272 {273 // standard header274 ULONG ulSignature; // 00: 'P', 'E', 0, 0275 USHORT usCPU; // 04: CPU type276 USHORT usObjCount; // 06: number of object entries277 ULONG ulTimeDateStamp; // 08: store the time and date the278 // file was created or modified279 // by the linker280 ULONG ulReserved1; // 0c: reserved281 ULONG ulReserved2; // 10: reserved282 USHORT usHeaderSize; // 14: number of remaining bytes after283 // usImageFlags284 USHORT usImageFlags; // 16: flags bits for the image285 286 // optional header (always present in valid Win32 files)287 USHORT usReserved3; // 18: reserved288 USHORT usLinkerMajor; // 1a: linker major version number289 USHORT usLinkerMinor; // 1c: linker minor version number290 USHORT usReserved4; // 1e: reserved291 ULONG ulReserved5; // 20: reserved292 ULONG ulReserved6; // 24: reserved293 ULONG ulEntryPointRVA; // 28: entry point relative virtual address294 ULONG ulReserved7; // 2c: reserved295 ULONG ulReserved8; // 30: reserved296 ULONG ulImageBase; // 34:297 ULONG ulObjectAlign; // 38:298 ULONG ulFileAlign; // 3c:299 USHORT usOSMajor; // 40:300 USHORT usOSMinor; // 42:301 USHORT usUserMajor; // 44:302 USHORT usUserMinor; // 46:303 USHORT usSubSystemMajor; // 48:304 USHORT usSubSystemMinor; // 4a:305 ULONG ulReserved9; // 4c: reserved306 ULONG ulImageSize; // 50:307 ULONG ulHeaderSize; // 54:308 ULONG ulFileChecksum; // 58:309 USHORT usSubSystem; // 5c:310 USHORT usDLLFlags; // 5e:311 ULONG ulStackReserveSize; // 60:312 ULONG ulStackCommitSize; // 64:313 ULONG ulHeapReserveSize; // 68:314 ULONG ulHeapCommitSize; // 6c:315 ULONG ulReserved10; // 70: reserved316 ULONG ulInterestingRVACount;// 74:317 ULONG aulRVASize[1]; // 78: array of RVA/Size entries318 } PEHEADER, *PPEHEADER;319 320 303 // additional LX structures 321 304 … … 382 365 } LXITER, *PLXITER; 383 366 384 /*385 *@@ OS2NERESTBLENTRY:386 * OS/2 NE resource table entry.387 *388 *@@added V0.9.16 (2001-12-08) [umoeller]389 */390 391 typedef struct _OS2NERESTBLENTRY392 {393 USHORT usType;394 USHORT usID;395 } OS2NERESTBLENTRY, *POS2NERESTBLENTRY;396 397 /*398 *@@ OS2NESEGMENT:399 * OS/2 NE segment definition.400 *401 *@@added V0.9.16 (2001-12-08) [umoeller]402 */403 404 typedef struct _OS2NESEGMENT // New .EXE segment table entry405 {406 USHORT ns_sector; // File sector of start of segment407 USHORT ns_cbseg; // Number of bytes in file408 USHORT ns_flags; // Attribute flags409 USHORT ns_minalloc; // Minimum allocation in bytes410 } OS2NESEGMENT, *POS2NESEGMENT;411 412 #pragma pack()413 414 367 // object/segment flags (in NE and LX) 415 368 #define OBJWRITE 0x0002L // Writeable Object … … 424 377 #define RNDISCARD 0xF000 // Discard priority level for resource 425 378 426 // EXE format 427 #define EXEFORMAT_OLDDOS 1 428 #define EXEFORMAT_NE 2 429 #define EXEFORMAT_PE 3 430 #define EXEFORMAT_LX 4 431 #define EXEFORMAT_TEXT_BATCH 5 432 #define EXEFORMAT_TEXT_CMD 6 // REXX or plain OS/2 batch 433 #define EXEFORMAT_COM 7 // added V0.9.16 (2002-01-04) [umoeller] 434 435 // target OS (in NE and LX) 436 #define EXEOS_DOS3 1 437 #define EXEOS_DOS4 2 // there is a flag for this in NE 438 #define EXEOS_OS2 3 439 #define EXEOS_WIN16 4 440 #define EXEOS_WIN386 5 // according to IBM, there are flags 441 // for this both in NE and LX 442 #define EXEOS_WIN32 6 379 /******************************************************************** 380 * 381 * Portable Executable (PE) 382 * 383 ********************************************************************/ 384 385 /* 386 *@@ IMAGE_FILE_HEADER: 387 * first part of PE header (standard header). 388 * 389 *@@added V0.9.16 (2002-01-09) [umoeller] 390 */ 391 392 typedef struct _IMAGE_FILE_HEADER 393 { 394 USHORT usMachine; // CPU type 395 #define IMAGE_FILE_MACHINE_UNKNOWN 0 396 #define IMAGE_FILE_MACHINE_I860 0x14d 397 #define IMAGE_FILE_MACHINE_I386 0x14c 398 #define IMAGE_FILE_MACHINE_R3000 0x162 399 #define IMAGE_FILE_MACHINE_R4000 0x166 400 #define IMAGE_FILE_MACHINE_R10000 0x168 401 #define IMAGE_FILE_MACHINE_ALPHA 0x184 402 #define IMAGE_FILE_MACHINE_POWERPC 0x1F0 403 USHORT usNumberOfSections; 404 ULONG ulTimeDateStamp; 405 ULONG ulPointerToSymbolTable; 406 ULONG ulNumberOfSymbols; 407 USHORT usSizeOfOptionalHeader; 408 USHORT fsCharacteristics; 409 #define IMAGE_FILE_RELOCS_STRIPPED 1 // No relocation info 410 #define IMAGE_FILE_EXECUTABLE_IMAGE 2 411 #define IMAGE_FILE_LINE_NUMS_STRIPPED 4 412 #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 8 413 #define IMAGE_FILE_16BIT_MACHINE 0x40 414 #define IMAGE_FILE_BYTES_REVERSED_LO 0x80 415 #define IMAGE_FILE_32BIT_MACHINE 0x100 416 #define IMAGE_FILE_DEBUG_STRIPPED 0x200 417 #define IMAGE_FILE_SYSTEM 0x1000 418 #define IMAGE_FILE_DLL 0x2000 419 #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 420 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; 421 422 typedef struct _IMAGE_DATA_DIRECTORY 423 { 424 ULONG VirtualAddress; 425 ULONG Size; 426 } IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY; 427 428 #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 429 430 /* 431 *@@ IMAGE_OPTIONAL_HEADER: 432 * second part of PE header (optional header). 433 * 434 *@@added V0.9.16 (2002-01-09) [umoeller] 435 */ 436 437 typedef struct _IMAGE_OPTIONAL_HEADER 438 { 439 // Standard fields 440 USHORT Magic; // 00 441 #define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b 442 #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107 443 BYTE MajorLinkerVersion; // 02 444 BYTE MinorLinkerVersion; // 03 445 ULONG SizeOfCode; // 04 446 ULONG SizeOfInitializedData; // 08 447 ULONG SizeOfUninitializedData; // 0C 448 ULONG AddressOfEntryPoint; // 10 449 ULONG BaseOfCode; // 14 450 ULONG BaseOfData; // 18 451 452 // NT additional fields 453 ULONG ImageBase; // 1C 454 ULONG SectionAlignment; // 20 455 ULONG FileAlignment; // 24 456 USHORT MajorOperatingSystemVersion; // 28 457 USHORT MinorOperatingSystemVersion; // 2A 458 USHORT MajorImageVersion; // 2C 459 USHORT MinorImageVersion; // 2E 460 USHORT MajorSubsystemVersion; // 30 461 USHORT MinorSubsystemVersion; // 32 462 ULONG Reserved1; // 34 463 ULONG SizeOfImage; // 38 464 ULONG SizeOfHeaders; // 3C 465 ULONG CheckSum; // 40 466 USHORT usSubsystem; // 44 467 #define IMAGE_SUBSYSTEM_UNKNOWN 0 468 #define IMAGE_SUBSYSTEM_NATIVE 1 469 #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Windows GUI subsystem 470 #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Windows character subsystem 471 #define IMAGE_SUBSYSTEM_OS2_CUI 5 472 #define IMAGE_SUBSYSTEM_POSIX_CUI 7 473 USHORT DllCharacteristics; // 46 474 ULONG SizeOfStackReserve; // 48 475 ULONG SizeOfStackCommit; // 4C 476 ULONG SizeOfHeapReserve; // 50 477 ULONG SizeOfHeapCommit; // 54 478 ULONG LoaderFlags; // 58 479 ULONG NumberOfRvaAndSizes; // 5C 480 // 60: 481 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; 482 } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; 483 484 // indices into the DataDirectory array 485 #define IMAGE_FILE_EXPORT_DIRECTORY 0 486 #define IMAGE_FILE_IMPORT_DIRECTORY 1 487 #define IMAGE_FILE_RESOURCE_DIRECTORY 2 488 #define IMAGE_FILE_EXCEPTION_DIRECTORY 3 489 #define IMAGE_FILE_SECURITY_DIRECTORY 4 490 #define IMAGE_FILE_BASE_RELOCATION_TABLE 5 491 #define IMAGE_FILE_DEBUG_DIRECTORY 6 492 #define IMAGE_FILE_DESCRIPTION_STRING 7 493 #define IMAGE_FILE_MACHINE_VALUE 8 // Mips 494 #define IMAGE_FILE_THREAD_LOCAL_STORAGE 9 495 #define IMAGE_FILE_CALLBACK_DIRECTORY 10 496 497 // directory entries, indices into the DataDirectory array 498 #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 499 #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 500 #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 501 #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 502 #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 503 #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 504 #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 505 #define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 506 #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // (MIPS GP) 507 #define IMAGE_DIRECTORY_ENTRY_TLS 9 508 #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 509 #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 510 #define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table 511 #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 512 #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 513 514 /* 515 *@@ PEHEADER: 516 * portable executable (PE) header format, 517 * which comes after the DOS header in the 518 * EXE file (at DOSEXEHEADER.ulNewHeaderOfs). 519 * 520 *@@added V0.9.16 (2002-01-09) [umoeller] 521 */ 522 523 typedef struct _PEHEADER 524 { 525 // standard header 526 ULONG ulSignature; // 00: 'P', 'E', 0, 0 527 IMAGE_FILE_HEADER // 04 528 FileHeader; 529 IMAGE_OPTIONAL_HEADER // 18 530 OptionalHeader; 531 532 } PEHEADER, *PPEHEADER; 533 534 /* 535 #define PE_HEADER(module) \ 536 ((IMAGE_NT_HEADERS*)((LPBYTE)(module) + \ 537 (((IMAGE_DOS_HEADER*)(module))->e_lfanew))) 538 539 #define PE_SECTIONS(module) \ 540 ((IMAGE_SECTION_HEADER*)((LPBYTE)&PE_HEADER(module)->OptionalHeader + \ 541 PE_HEADER(module)->FileHeader.SizeOfOptionalHeader)) 542 543 #define RVA_PTR(module,field) ((LPBYTE)(module) + PE_HEADER(module)->field) 544 */ 545 546 // Section header format 547 548 #define IMAGE_SIZEOF_SHORT_NAME 8 549 550 /* 551 *@@ IMAGE_SECTION_HEADER: 552 * comes right after PEHEADER in executable. 553 * 554 *@@added V0.9.16 (2002-01-09) [umoeller] 555 */ 556 557 typedef struct _IMAGE_SECTION_HEADER 558 { 559 BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 00: 560 union 561 { 562 ULONG PhysicalAddress; // 04: 563 ULONG VirtualSize; // 04: 564 } Misc; 565 ULONG VirtualAddress; // 08: 566 ULONG ulSizeOfRawData; // 0C: 567 ULONG ulPointerToRawData; // 10: 568 ULONG PointerToRelocations; // 14: 569 ULONG PointerToLinenumbers; // 18: 570 USHORT NumberOfRelocations; // 1C: 571 USHORT NumberOfLinenumbers; // 1E: 572 ULONG flCharacteristics; // 20: 573 // #define IMAGE_SCN_TYPE_REG 0x00000000 - Reserved 574 // #define IMAGE_SCN_TYPE_DSECT 0x00000001 - Reserved 575 // #define IMAGE_SCN_TYPE_NOLOAD 0x00000002 - Reserved 576 // #define IMAGE_SCN_TYPE_GROUP 0x00000004 - Reserved 577 // #define IMAGE_SCN_TYPE_NO_PAD 0x00000008 - Reserved 578 // #define IMAGE_SCN_TYPE_COPY 0x00000010 - Reserved 579 #define IMAGE_SCN_CNT_CODE 0x00000020 580 #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 581 #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 582 #define IMAGE_SCN_LNK_OTHER 0x00000100 583 #define IMAGE_SCN_LNK_INFO 0x00000200 584 // #define IMAGE_SCN_TYPE_OVER 0x00000400 - Reserved 585 #define IMAGE_SCN_LNK_REMOVE 0x00000800 586 #define IMAGE_SCN_LNK_COMDAT 0x00001000 587 // 0x00002000 - Reserved 588 // #define IMAGE_SCN_MEM_PROTECTED 0x00004000 - Obsolete 589 #define IMAGE_SCN_MEM_FARDATA 0x00008000 590 // #define IMAGE_SCN_MEM_SYSHEAP 0x00010000 - Obsolete 591 #define IMAGE_SCN_MEM_PURGEABLE 0x00020000 592 #define IMAGE_SCN_MEM_16BIT 0x00020000 593 #define IMAGE_SCN_MEM_LOCKED 0x00040000 594 #define IMAGE_SCN_MEM_PRELOAD 0x00080000 595 #define IMAGE_SCN_ALIGN_1BYTES 0x00100000 596 #define IMAGE_SCN_ALIGN_2BYTES 0x00200000 597 #define IMAGE_SCN_ALIGN_4BYTES 0x00300000 598 #define IMAGE_SCN_ALIGN_8BYTES 0x00400000 599 #define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default 600 #define IMAGE_SCN_ALIGN_32BYTES 0x00600000 601 #define IMAGE_SCN_ALIGN_64BYTES 0x00700000 602 // 0x00800000 - Unused 603 #define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 604 #define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 605 #define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 606 #define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 607 #define IMAGE_SCN_MEM_SHARED 0x10000000 608 #define IMAGE_SCN_MEM_EXECUTE 0x20000000 609 #define IMAGE_SCN_MEM_READ 0x40000000 610 #define IMAGE_SCN_MEM_WRITE 0x80000000 611 // 24: 612 } IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER; 613 614 #define IMAGE_SIZEOF_SECTION_HEADER 40 615 616 /* 617 *@@ IMAGE_IMPORT_BY_NAME: 618 * import name entry. 619 * 620 *@@added V0.9.16 (2002-01-09) [umoeller] 621 */ 622 623 typedef struct _IMAGE_IMPORT_BY_NAME 624 { 625 USHORT Hint; 626 BYTE Name[1]; 627 } IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME; 628 629 /* 630 *@@ IMAGE_THUNK_DATA: 631 * import thunk. 632 * 633 *@@added V0.9.16 (2002-01-09) [umoeller] 634 */ 635 636 typedef struct _IMAGE_THUNK_DATA 637 { 638 union 639 { 640 PBYTE ForwarderString; 641 PFN Function; 642 ULONG Ordinal; 643 PIMAGE_IMPORT_BY_NAME 644 AddressOfData; 645 } u1; 646 } IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA; 647 648 /* 649 *@@ IMAGE_IMPORT_DESCRIPTOR: 650 * import module directory. 651 * 652 *@@added V0.9.16 (2002-01-09) [umoeller] 653 */ 654 655 typedef struct _IMAGE_IMPORT_DESCRIPTOR 656 { 657 union 658 { 659 ULONG Characteristics; // 0 for terminating null import descriptor 660 PIMAGE_THUNK_DATA 661 OriginalFirstThunk; // RVA to original unbound IAT 662 } u; 663 ULONG TimeDateStamp; // 0 if not bound, 664 // -1 if bound, and real date\time stamp 665 // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 666 // (new BIND) 667 // otherwise date/time stamp of DLL bound to 668 // (Old BIND) 669 ULONG ForwarderChain; // -1 if no forwarders 670 ULONG Name; 671 // RVA to IAT (if bound this IAT has actual addresses) 672 PIMAGE_THUNK_DATA 673 FirstThunk; 674 } IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR; 675 676 #define IMAGE_ORDINAL_FLAG 0x80000000 677 #define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0) 678 #define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff) 679 680 /* 681 *@@ IMAGE_EXPORT_DIRECTORY: 682 * export module directory 683 * 684 *@@added V0.9.16 (2002-01-09) [umoeller] 685 */ 686 687 typedef struct _IMAGE_EXPORT_DIRECTORY 688 { 689 ULONG Characteristics; 690 ULONG TimeDateStamp; 691 USHORT MajorVersion; 692 USHORT MinorVersion; 693 ULONG Name; 694 ULONG Base; 695 ULONG NumberOfFunctions; 696 ULONG NumberOfNames; 697 PULONG *AddressOfFunctions; 698 PULONG *AddressOfNames; 699 PUSHORT *AddressOfNameOrdinals; 700 // u_char ModuleName[1]; 701 } IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY; 702 703 /* 704 *@@ IMAGE_RESOURCE_DIRECTORY: 705 * 706 *@@added V0.9.16 (2002-01-09) [umoeller] 707 */ 708 709 typedef struct _IMAGE_RESOURCE_DIRECTORY 710 { 711 ULONG Characteristics; 712 ULONG TimeDateStamp; 713 USHORT MajorVersion; 714 USHORT MinorVersion; 715 USHORT NumberOfNamedEntries; 716 USHORT NumberOfIdEntries; 717 // IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[]; 718 } IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY; 719 720 #define IMAGE_RESOURCE_NAME_IS_STRING 0x80000000 721 #define IMAGE_RESOURCE_DATA_IS_DIRECTORY 0x80000000 722 723 /* 724 *@@ IMAGE_RESOURCE_DIRECTORY_ENTRY: 725 * 726 *@@added V0.9.16 (2002-01-09) [umoeller] 727 */ 728 729 typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY 730 { 731 union 732 { 733 struct 734 { 735 unsigned NameOffset:31; 736 unsigned NameIsString:1; 737 } s; 738 ULONG Name; 739 USHORT Id; 740 } u1; 741 union 742 { 743 ULONG OffsetToData; 744 struct 745 { 746 unsigned OffsetToDirectory:31; 747 unsigned DataIsDirectory:1; 748 } s; 749 } u2; 750 } IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY; 751 752 /* 753 *@@ IMAGE_RESOURCE_DIRECTORY_STRING: 754 * 755 *@@added V0.9.16 (2002-01-09) [umoeller] 756 */ 757 758 typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING 759 { 760 USHORT Length; 761 CHAR NameString[1]; 762 } IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING; 763 764 typedef USHORT WCHAR; 765 766 /* 767 *@@ IMAGE_RESOURCE_DIR_STRING_U: 768 * 769 *@@added V0.9.16 (2002-01-09) [umoeller] 770 */ 771 772 typedef struct _IMAGE_RESOURCE_DIR_STRING_U 773 { 774 USHORT Length; 775 WCHAR NameString[ 1 ]; 776 } IMAGE_RESOURCE_DIR_STRING_U,*PIMAGE_RESOURCE_DIR_STRING_U; 777 778 /* 779 *@@ IMAGE_RESOURCE_DATA_ENTRY: 780 * 781 *@@added V0.9.16 (2002-01-09) [umoeller] 782 */ 783 784 typedef struct _IMAGE_RESOURCE_DATA_ENTRY 785 { 786 ULONG OffsetToData; 787 ULONG Size; 788 ULONG CodePage; 789 ULONG ResourceHandle; 790 } IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY; 791 792 /* 793 *@@ IMAGE_BASE_RELOCATION: 794 * 795 *@@added V0.9.16 (2002-01-09) [umoeller] 796 */ 797 798 typedef struct _IMAGE_BASE_RELOCATION 799 { 800 ULONG VirtualAddress; 801 ULONG SizeOfBlock; 802 USHORT TypeOffset[1]; 803 } IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION; 804 805 /* 806 *@@ IMAGE_LOAD_CONFIG_DIRECTORY: 807 * 808 *@@added V0.9.16 (2002-01-09) [umoeller] 809 */ 810 811 typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY 812 { 813 ULONG Characteristics; 814 ULONG TimeDateStamp; 815 USHORT MajorVersion; 816 USHORT MinorVersion; 817 ULONG GlobalFlagsClear; 818 ULONG GlobalFlagsSet; 819 ULONG CriticalSectionDefaultTimeout; 820 ULONG DeCommitFreeBlockThreshold; 821 ULONG DeCommitTotalFreeThreshold; 822 PVOID LockPrefixTable; 823 ULONG MaximumAllocationSize; 824 ULONG VirtualMemoryThreshold; 825 ULONG ProcessHeapFlags; 826 ULONG Reserved[ 4 ]; 827 } IMAGE_LOAD_CONFIG_DIRECTORY,*PIMAGE_LOAD_CONFIG_DIRECTORY; 828 829 typedef VOID (* /* CALLBACK */ PIMAGE_TLS_CALLBACK)(PVOID DllHandle, 830 ULONG Reason, 831 PVOID Reserved); 832 833 /* 834 *@@ IMAGE_TLS_DIRECTORY: 835 * 836 *@@added V0.9.16 (2002-01-09) [umoeller] 837 */ 838 839 typedef struct _IMAGE_TLS_DIRECTORY 840 { 841 ULONG StartAddressOfRawData; 842 ULONG EndAddressOfRawData; 843 PULONG AddressOfIndex; 844 PIMAGE_TLS_CALLBACK *AddressOfCallBacks; 845 ULONG SizeOfZeroFill; 846 ULONG Characteristics; 847 } IMAGE_TLS_DIRECTORY,*PIMAGE_TLS_DIRECTORY; 848 849 /* 850 *@@ IMAGE_DEBUG_DIRECTORY: 851 * the IMAGE_DEBUG_DIRECTORY data directory points 852 * to an array of these structures. 853 * 854 *@@added V0.9.16 (2002-01-09) [umoeller] 855 */ 856 857 typedef struct _IMAGE_DEBUG_DIRECTORY 858 { 859 ULONG Characteristics; 860 ULONG TimeDateStamp; 861 USHORT MajorVersion; 862 USHORT MinorVersion; 863 ULONG Type; 864 ULONG SizeOfData; 865 ULONG AddressOfRawData; 866 ULONG ulPointerToRawData; 867 } IMAGE_DEBUG_DIRECTORY,*PIMAGE_DEBUG_DIRECTORY; 868 869 /* 870 * The type field above can take these (plus a few other 871 * irrelevant) values. 872 */ 873 #define IMAGE_DEBUG_TYPE_UNKNOWN 0 874 #define IMAGE_DEBUG_TYPE_COFF 1 875 #define IMAGE_DEBUG_TYPE_CODEVIEW 2 876 #define IMAGE_DEBUG_TYPE_FPO 3 877 #define IMAGE_DEBUG_TYPE_MISC 4 878 #define IMAGE_DEBUG_TYPE_EXCEPTION 5 879 #define IMAGE_DEBUG_TYPE_FIXUP 6 880 #define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7 881 #define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8 882 883 // generic relocation types 884 #define IMAGE_REL_BASED_ABSOLUTE 0 885 #define IMAGE_REL_BASED_HIGH 1 886 #define IMAGE_REL_BASED_LOW 2 887 #define IMAGE_REL_BASED_HIGHLOW 3 888 #define IMAGE_REL_BASED_HIGHADJ 4 889 #define IMAGE_REL_BASED_MIPS_JMPADDR 5 890 #define IMAGE_REL_BASED_SECTION 6 891 #define IMAGE_REL_BASED_REL 7 892 #define IMAGE_REL_BASED_MIPS_JMPADDR16 9 893 #define IMAGE_REL_BASED_IA64_IMM64 9 // yes, 9 too 894 #define IMAGE_REL_BASED_DIR64 10 895 #define IMAGE_REL_BASED_HIGH3ADJ 11 896 897 // I386 relocation types 898 #define IMAGE_REL_I386_ABSOLUTE 0 899 #define IMAGE_REL_I386_DIR16 1 900 #define IMAGE_REL_I386_REL16 2 901 #define IMAGE_REL_I386_DIR 6 902 #define IMAGE_REL_I386_DIR32NB 7 903 #define IMAGE_REL_I386_SEG12 9 904 #define IMAGE_REL_I386_SECTION 10 905 #define IMAGE_REL_I386_SECREL 11 906 #define IMAGE_REL_I386_REL 20 907 908 // MIPS relocation types 909 #define IMAGE_REL_MIPS_ABSOLUTE 0x0000 910 #define IMAGE_REL_MIPS_REFHALF 0x0001 911 #define IMAGE_REL_MIPS_REFWORD 0x0002 912 #define IMAGE_REL_MIPS_JMPADDR 0x0003 913 #define IMAGE_REL_MIPS_REFHI 0x0004 914 #define IMAGE_REL_MIPS_REFLO 0x0005 915 #define IMAGE_REL_MIPS_GPREL 0x0006 916 #define IMAGE_REL_MIPS_LITERAL 0x0007 917 #define IMAGE_REL_MIPS_SECTION 0x000A 918 #define IMAGE_REL_MIPS_SECREL 0x000B 919 #define IMAGE_REL_MIPS_SECRELLO 0x000C 920 #define IMAGE_REL_MIPS_SECRELHI 0x000D 921 #define IMAGE_REL_MIPS_JMPADDR16 0x0010 922 #define IMAGE_REL_MIPS_REFWORDNB 0x0022 923 #define IMAGE_REL_MIPS_PAIR 0x0025 924 925 // ALPHA relocation types 926 #define IMAGE_REL_ALPHA_ABSOLUTE 0x0000 927 #define IMAGE_REL_ALPHA_REFLONG 0x0001 928 #define IMAGE_REL_ALPHA_REFQUAD 0x0002 929 #define IMAGE_REL_ALPHA_GPREL 0x0003 930 #define IMAGE_REL_ALPHA_LITERAL 0x0004 931 #define IMAGE_REL_ALPHA_LITUSE 0x0005 932 #define IMAGE_REL_ALPHA_GPDISP 0x0006 933 #define IMAGE_REL_ALPHA_BRADDR 0x0007 934 #define IMAGE_REL_ALPHA_HINT 0x0008 935 #define IMAGE_REL_ALPHA_INLINE_REFLONG 0x0009 936 #define IMAGE_REL_ALPHA_REFHI 0x000A 937 #define IMAGE_REL_ALPHA_REFLO 0x000B 938 #define IMAGE_REL_ALPHA_PAIR 0x000C 939 #define IMAGE_REL_ALPHA_MATCH 0x000D 940 #define IMAGE_REL_ALPHA_SECTION 0x000E 941 #define IMAGE_REL_ALPHA_SECREL 0x000F 942 #define IMAGE_REL_ALPHA_REFLONGNB 0x0010 943 #define IMAGE_REL_ALPHA_SECRELLO 0x0011 944 #define IMAGE_REL_ALPHA_SECRELHI 0x0012 945 #define IMAGE_REL_ALPHA_REFQ3 0x0013 946 #define IMAGE_REL_ALPHA_REFQ2 0x0014 947 #define IMAGE_REL_ALPHA_REFQ1 0x0015 948 #define IMAGE_REL_ALPHA_GPRELLO 0x0016 949 #define IMAGE_REL_ALPHA_GPRELHI 0x0017 950 951 // PowerPC relocation types 952 #define IMAGE_REL_PPC_ABSOLUTE 0x0000 953 #define IMAGE_REL_PPC_ADDR64 0x0001 954 #define IMAGE_REL_PPC_ADDR 0x0002 955 #define IMAGE_REL_PPC_ADDR24 0x0003 956 #define IMAGE_REL_PPC_ADDR16 0x0004 957 #define IMAGE_REL_PPC_ADDR14 0x0005 958 #define IMAGE_REL_PPC_REL24 0x0006 959 #define IMAGE_REL_PPC_REL14 0x0007 960 #define IMAGE_REL_PPC_TOCREL16 0x0008 961 #define IMAGE_REL_PPC_TOCREL14 0x0009 962 #define IMAGE_REL_PPC_ADDR32NB 0x000A 963 #define IMAGE_REL_PPC_SECREL 0x000B 964 #define IMAGE_REL_PPC_SECTION 0x000C 965 #define IMAGE_REL_PPC_IFGLUE 0x000D 966 #define IMAGE_REL_PPC_IMGLUE 0x000E 967 #define IMAGE_REL_PPC_SECREL16 0x000F 968 #define IMAGE_REL_PPC_REFHI 0x0010 969 #define IMAGE_REL_PPC_REFLO 0x0011 970 #define IMAGE_REL_PPC_PAIR 0x0012 971 #define IMAGE_REL_PPC_SECRELLO 0x0013 972 #define IMAGE_REL_PPC_SECRELHI 0x0014 973 #define IMAGE_REL_PPC_GPREL 0x0015 974 #define IMAGE_REL_PPC_TYPEMASK 0x00FF 975 // modifier bits 976 #define IMAGE_REL_PPC_NEG 0x0100 977 #define IMAGE_REL_PPC_BRTAKEN 0x0200 978 #define IMAGE_REL_PPC_BRNTAKEN 0x0400 979 #define IMAGE_REL_PPC_TOCDEFN 0x0800 980 981 // SH3 ? relocation type 982 #define IMAGE_REL_SH3_ABSOLUTE 0x0000 983 #define IMAGE_REL_SH3_DIRECT16 0x0001 984 #define IMAGE_REL_SH3_DIRECT 0x0002 985 #define IMAGE_REL_SH3_DIRECT8 0x0003 986 #define IMAGE_REL_SH3_DIRECT8_WORD 0x0004 987 #define IMAGE_REL_SH3_DIRECT8_LONG 0x0005 988 #define IMAGE_REL_SH3_DIRECT4 0x0006 989 #define IMAGE_REL_SH3_DIRECT4_WORD 0x0007 990 #define IMAGE_REL_SH3_DIRECT4_LONG 0x0008 991 #define IMAGE_REL_SH3_PCREL8_WORD 0x0009 992 #define IMAGE_REL_SH3_PCREL8_LONG 0x000A 993 #define IMAGE_REL_SH3_PCREL12_WORD 0x000B 994 #define IMAGE_REL_SH3_STARTOF_SECTION 0x000C 995 #define IMAGE_REL_SH3_SIZEOF_SECTION 0x000D 996 #define IMAGE_REL_SH3_SECTION 0x000E 997 #define IMAGE_REL_SH3_SECREL 0x000F 998 #define IMAGE_REL_SH3_DIRECT32_NB 0x0010 999 1000 // ARM (Archimedes?) relocation types 1001 #define IMAGE_REL_ARM_ABSOLUTE 0x0000 1002 #define IMAGE_REL_ARM_ADDR 0x0001 1003 #define IMAGE_REL_ARM_ADDR32NB 0x0002 1004 #define IMAGE_REL_ARM_BRANCH24 0x0003 1005 #define IMAGE_REL_ARM_BRANCH11 0x0004 1006 #define IMAGE_REL_ARM_SECTION 0x000E 1007 #define IMAGE_REL_ARM_SECREL 0x000F 1008 1009 // IA64 relocation types 1010 #define IMAGE_REL_IA64_ABSOLUTE 0x0000 1011 #define IMAGE_REL_IA64_IMM14 0x0001 1012 #define IMAGE_REL_IA64_IMM22 0x0002 1013 #define IMAGE_REL_IA64_IMM64 0x0003 1014 #define IMAGE_REL_IA64_DIR 0x0004 1015 #define IMAGE_REL_IA64_DIR64 0x0005 1016 #define IMAGE_REL_IA64_PCREL21B 0x0006 1017 #define IMAGE_REL_IA64_PCREL21M 0x0007 1018 #define IMAGE_REL_IA64_PCREL21F 0x0008 1019 #define IMAGE_REL_IA64_GPREL22 0x0009 1020 #define IMAGE_REL_IA64_LTOFF22 0x000A 1021 #define IMAGE_REL_IA64_SECTION 0x000B 1022 #define IMAGE_REL_IA64_SECREL22 0x000C 1023 #define IMAGE_REL_IA64_SECREL64I 0x000D 1024 #define IMAGE_REL_IA64_SECREL 0x000E 1025 #define IMAGE_REL_IA64_LTOFF64 0x000F 1026 #define IMAGE_REL_IA64_DIR32NB 0x0010 1027 #define IMAGE_REL_IA64_RESERVED_11 0x0011 1028 #define IMAGE_REL_IA64_RESERVED_12 0x0012 1029 #define IMAGE_REL_IA64_RESERVED_13 0x0013 1030 #define IMAGE_REL_IA64_RESERVED_14 0x0014 1031 #define IMAGE_REL_IA64_RESERVED_15 0x0015 1032 #define IMAGE_REL_IA64_RESERVED_16 0x0016 1033 #define IMAGE_REL_IA64_ADDEND 0x001F 1034 1035 /* 1036 *@@ IMAGE_SEPARATE_DEBUG_HEADER: 1037 * structure that appears at the very start of a .DBG file. 1038 * 1039 *@@added V0.9.16 (2002-01-09) [umoeller] 1040 */ 1041 1042 typedef struct _IMAGE_SEPARATE_DEBUG_HEADER 1043 { 1044 USHORT Signature; 1045 USHORT Flags; 1046 USHORT Machine; 1047 USHORT Characteristics; 1048 ULONG TimeDateStamp; 1049 ULONG CheckSum; 1050 ULONG ImageBase; 1051 ULONG SizeOfImage; 1052 ULONG NumberOfSections; 1053 ULONG ExportedNamesSize; 1054 ULONG DebugDirectorySize; 1055 ULONG Reserved[ 3 ]; 1056 } IMAGE_SEPARATE_DEBUG_HEADER,*PIMAGE_SEPARATE_DEBUG_HEADER; 1057 1058 #define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944 1059 1060 /* 1061 *@@ MESSAGE_RESOURCE_ENTRY: 1062 * 1063 *@@added V0.9.16 (2002-01-09) [umoeller] 1064 */ 1065 1066 typedef struct tagMESSAGE_RESOURCE_ENTRY 1067 { 1068 USHORT Length; 1069 USHORT Flags; 1070 BYTE Text[1]; 1071 } MESSAGE_RESOURCE_ENTRY,*PMESSAGE_RESOURCE_ENTRY; 1072 #define MESSAGE_RESOURCE_UNICODE 0x0001 1073 1074 /* 1075 *@@ MESSAGE_RESOURCE_BLOCK: 1076 * 1077 *@@added V0.9.16 (2002-01-09) [umoeller] 1078 */ 1079 1080 typedef struct tagMESSAGE_RESOURCE_BLOCK 1081 { 1082 ULONG LowId; 1083 ULONG HighId; 1084 ULONG OffsetToEntries; 1085 } MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK; 1086 1087 /* 1088 *@@ MESSAGE_RESOURCE_DATA: 1089 * 1090 *@@added V0.9.16 (2002-01-09) [umoeller] 1091 */ 1092 1093 typedef struct tagMESSAGE_RESOURCE_DATA 1094 { 1095 ULONG NumberOfBlocks; 1096 MESSAGE_RESOURCE_BLOCK Blocks[ 1 ]; 1097 } MESSAGE_RESOURCE_DATA,*PMESSAGE_RESOURCE_DATA; 1098 1099 /* 1100 *@@ IMAGE_IMPORT_MODULE_DIRECTORY: 1101 * 1102 *@@added V0.9.16 (2002-01-09) [umoeller] 1103 */ 1104 1105 typedef struct _IMAGE_IMPORT_MODULE_DIRECTORY // tagImportDirectory 1106 { 1107 ULONG dwRVAFunctionNameList; 1108 ULONG dwUseless1; 1109 ULONG dwUseless2; 1110 ULONG dwRVAModuleName; 1111 ULONG dwRVAFunctionAddressList; 1112 } IMAGE_IMPORT_MODULE_DIRECTORY, *PIMAGE_IMPORT_MODULE_DIRECTORY; 1113 1114 #pragma pack() 1115 1116 /******************************************************************** 1117 * 1118 * Declarations and APIs 1119 * 1120 ********************************************************************/ 443 1121 444 1122 #ifndef __STRIP_DOWN_EXECUTABLE__ … … 455 1133 { 456 1134 // executable opened by doshOpen; 457 // still NULLHANDLE for .COM, .BAT, .CMD files 458 // (V0.9.16) 1135 // note, NULL for .COM, .BAT, .CMD files (V0.9.16) 459 1136 PXFILE pFile; 460 1137 … … 481 1158 PPEHEADER pPEHeader; 482 1159 ULONG cbPEHeader; 483 484 // module analysis (always set): 1160 // note, this one may vary; however, all Win32 programs 1161 // will have sizeof(PEHEADER) in here since they all 1162 // use both the standard and the optional PE header 1163 1164 // module analysis (always set, otherwise error would be 1165 // returned by exehOpen): 485 1166 ULONG ulExeFormat; 486 // one of: 487 // EXEFORMAT_OLDDOS 1 488 // EXEFORMAT_NE 2 489 // EXEFORMAT_PE 3 490 // EXEFORMAT_LX 4 491 // EXEFORMAT_TEXT_BATCH 5 // for all .BAT files 492 // EXEFORMAT_TEXT_CMD 6 // for all .CMD files 493 // EXEFORMAT_COM 7 // for all .COM files 1167 #define EXEFORMAT_OLDDOS 1 1168 #define EXEFORMAT_NE 2 1169 #define EXEFORMAT_PE 3 1170 #define EXEFORMAT_LX 4 1171 #define EXEFORMAT_TEXT_BATCH 5 1172 #define EXEFORMAT_TEXT_CMD 6 // REXX or plain OS/2 batch 1173 #define EXEFORMAT_COM 7 // added V0.9.16 (2002-01-04) [umoeller] 494 1174 495 1175 BOOL fLibrary, // TRUE if this is a DLL 1176 // (works for NE, LX, PE) 496 1177 f32Bits; // TRUE if this a 32-bits module 1178 // (TRUE always for PE) 497 1179 498 1180 ULONG ulOS; 499 1181 // target operating system as flagged in one of 500 1182 // the EXE headers; one of: 501 // EXEOS_DOS3 1 // always for .BAT, possibly for .COM 502 // EXEOS_DOS4 2 // there is a flag for this in NE 503 // EXEOS_OS2 3 // always for .CMD, possibly for .COM 504 // EXEOS_WIN16 4 505 // EXEOS_WIN386 5 // according to IBM, there are flags 506 // for this both in NE and LX 507 // EXEOS_WIN32 6 1183 #define EXEOS_UNKNOWN 0 1184 // set for non-standard PE files too 1185 #define EXEOS_DOS3 1 1186 #define EXEOS_DOS4 2 1187 // there is a flag for this in NE 1188 #define EXEOS_OS2 3 1189 #define EXEOS_WIN16 4 1190 #define EXEOS_WIN386 5 1191 // according to IBM, there are flags 1192 // for this both in NE and LX 1193 #define EXEOS_WIN32_GUI 6 1194 // Win32 GUI (see IMAGE_OPTIONAL_HEADER.usSubsystem), 1195 // if PE optional header was successfully read 1196 #define EXEOS_WIN32_CLI 7 1197 // Win32 command line (see IMAGE_OPTIONAL_HEADER.usSubsystem), 1198 // if PE optional header was successfully read 508 1199 509 1200 // The following fields are only set after 510 // an extra call to exehQueryBldLevel :1201 // an extra call to exehQueryBldLevel (NE and LX only): 511 1202 512 1203 PSZ pszDescription; … … 531 1222 pszFixpak; 532 1223 533 // the following fields are set after exehLoadLXMaps 1224 // the following fields are set after exehLoadLXMaps (LX only) 534 1225 BOOL fLXMapsLoaded; // TRUE after good exehLoadLXMaps 535 1226 RESOURCETABLEENTRY *pRsTbl; // pLXHeader->ulResTblCnt … … 537 1228 OBJECTPAGETABLEENTRY *pObjPageTbl; // pLXHeader->ulPageCount 538 1229 539 // the following fields are set after exehLoadOS2NEMaps 1230 // the following fields are set after exehLoadOS2NEMaps (OS/2 NE only) 540 1231 BOOL fOS2NEMapsLoaded; // TRUE after good exehLoadOS2NEMaps 541 1232 POS2NERESTBLENTRY paOS2NEResTblEntry; … … 594 1285 #define WINRT_ACCELERATOR 9 595 1286 #define WINRT_RCDATA 10 1287 #define WINRT_MESSAGELIST 11 // Win32 1288 #define WINRT_GROUP_CURSOR 12 // Win32 1289 #define WINRT_GROUP_ICON 13 // Win32 596 1290 597 1291 /* -
trunk/src/helpers/apps.c
r129 r131 62 62 * 63 63 ********************************************************************/ 64 65 /* 66 *@@ appQueryEnvironmentLen: 67 * returns the total length of the passed in environment 68 * string buffer, including the terminating two null bytes. 69 * 70 *@@added V0.9.16 (2002-01-09) [umoeller] 71 */ 72 73 ULONG appQueryEnvironmentLen(PCSZ pcszEnvironment) 74 { 75 ULONG cbEnvironment = 0; 76 if (pcszEnvironment) 77 { 78 PCSZ pVarThis = pcszEnvironment; 79 // go thru the environment strings; last one has two null bytes 80 while (*pVarThis) 81 { 82 ULONG ulLenThis = strlen(pVarThis) + 1; 83 cbEnvironment += ulLenThis; 84 pVarThis += ulLenThis; 85 } 86 87 cbEnvironment++; // last null byte 88 } 89 90 return (cbEnvironment); 91 } 64 92 65 93 /* -
trunk/src/helpers/dosh.c
r129 r131 1806 1806 // file ptr is at beginning 1807 1807 1808 #ifdef DEBUG_DOSOPEN 1808 1809 if (arc) 1809 1810 _Pmpf((__FUNCTION__ ": DosSetFilePtr/queryfilesize returned %d for %s", 1810 1811 arc, pcszFilename)); 1812 #endif 1811 1813 1812 1814 // store file size … … 1817 1819 pFile->pszFilename = strdup(pcszFilename); 1818 1820 } 1821 #ifdef DEBUG_DOSOPEN 1819 1822 else 1820 1823 _Pmpf((__FUNCTION__ ": DosOpen returned %d for %s", 1821 1824 arc, pcszFilename)); 1825 #endif 1822 1826 1823 1827 if (arc) … … 1891 1895 * cache. 1892 1896 * 1897 * fl may be any combination of the following: 1898 * 1899 * -- DRFL_NOCACHE: do not fill the cache with 1900 * new data if the data is not in the cache 1901 * currently. 1902 * 1903 * -- DRFL_FAILIFLESS: return ERROR_NO_DATA 1904 * if the data returned by DosRead is less 1905 * than what was specified. This might 1906 * simplify error handling. 1907 * 1893 1908 *@@added V0.9.13 (2001-06-14) [umoeller] 1894 1909 *@@changed V0.9.16 (2001-12-18) [umoeller]: now with XFILE, and always using FILE_BEGIN … … 1896 1911 1897 1912 APIRET doshReadAt(PXFILE pFile, 1898 ULONG ulOffset, // in: offset to read from (from beginning of file) 1899 PULONG pcb, // in: bytes to read, out: bytes read 1900 PBYTE pbData) // out: read buffer (must be cb bytes) 1913 ULONG ulOffset, // in: offset to read from (from beginning of file) 1914 PULONG pcb, // in: bytes to read, out: bytes read 1915 PBYTE pbData, // out: read buffer (must be cb bytes) 1916 ULONG fl) // in: DRFL_* flags 1901 1917 { 1902 1918 APIRET arc; … … 1927 1943 *pcb = cb; 1928 1944 1945 #ifdef DEBUG_DOSOPEN 1929 1946 _Pmpf((__FUNCTION__ " %s: data is fully in cache", 1930 1947 pFile->pszFilename)); … … 1935 1952 _Pmpf((" so copied %d bytes from cache ofs %d", 1936 1953 cb, ulOfsInCache)); 1937 1938 // still, advance the file pointer because 1939 // caller might run plain DosRead next 1940 /* DosSetFilePtr(pFile->hf, 1941 (LONG)ulOffset + cb, 1942 FILE_BEGIN, 1943 &ulDummy); */ 1954 #endif 1944 1955 } 1945 1956 else … … 1948 1959 // check how much it is... for small amounts, 1949 1960 // we load the cache first 1950 if (cb <= 4096 - 512) 1961 if ( (cb <= 4096 - 512) 1962 && (!(fl & DRFL_NOCACHE)) 1963 ) 1951 1964 { 1965 #ifdef DEBUG_DOSOPEN 1952 1966 _Pmpf((__FUNCTION__ " %s: filling cache anew", 1953 1967 pFile->pszFilename)); 1954 1968 _Pmpf((" caller wants %d bytes from %d", 1955 1969 cb, ulOffset)); 1970 #endif 1956 1971 1957 1972 // OK, then fix the offset to read from … … 1962 1977 pFile->cbCache = 4096; 1963 1978 1979 #ifdef DEBUG_DOSOPEN 1964 1980 _Pmpf((" getting %d bytes from %d", 1965 1981 pFile->cbCache, pFile->ulReadFrom)); 1982 #endif 1966 1983 1967 1984 // free old cache … … 1974 1991 else 1975 1992 { 1993 ULONG ulOfsInCache = 0; 1994 1976 1995 if (!(arc = DosSetFilePtr(pFile->hf, 1977 1996 (LONG)pFile->ulReadFrom, … … 1985 2004 { 1986 2005 // got data: 1987 ULONG ulOfsInCache; 1988 2006 #ifdef DEBUG_DOSOPEN 1989 2007 _Pmpf((" %d bytes read", ulDummy)); 2008 #endif 2009 1990 2010 pFile->cbCache = ulDummy; 1991 2011 1992 // c opy to caller2012 // check bounds 1993 2013 ulOfsInCache = ulOffset - pFile->ulReadFrom; 1994 memcpy(pbData, 1995 pFile->pbCache + ulOfsInCache, 1996 cb); 1997 *pcb = cb; 1998 1999 _Pmpf((" so copied %d bytes from cache ofs %d", 2000 cb, ulOfsInCache)); 2001 2002 // still, advance the file pointer because 2003 // caller might run plain DosRead next 2004 /* DosSetFilePtr(pFile->hf, 2005 (LONG)ulOffset + cb, 2006 FILE_BEGIN, 2007 &ulDummy); */ 2014 2015 /* 2016 if (ulOfsInCache + cb > pFile->cbCache) 2017 { 2018 cb = pFile->cbCache - ulOfsInCache; 2019 if (fl & DRFL_FAILIFLESS) 2020 arc = ERROR_NO_DATA; 2021 } 2022 */ 2008 2023 } 2009 2024 } 2010 2025 2011 if (arc) 2012 FREE(pFile->pbCache); 2013 } 2026 if (!arc) 2027 { 2028 // copy to caller 2029 memcpy(pbData, 2030 pFile->pbCache + ulOfsInCache, 2031 cb); 2032 *pcb = cb; 2033 2034 #ifdef DEBUG_DOSOPEN 2035 _Pmpf((" so copied %d bytes from cache ofs %d", 2036 cb, ulOfsInCache)); 2037 #endif 2038 } 2039 else 2040 { 2041 free(pFile->pbCache); 2042 pFile->pbCache = NULL; 2043 } 2044 } // end else if (!(pFile->pbCache = (PBYTE)malloc(pFile->cbCache))) 2014 2045 } 2015 2046 else 2016 2047 { 2017 2048 // read uncached: 2049 #ifdef DEBUG_DOSOPEN 2018 2050 _Pmpf((" " __FUNCTION__ " %s: reading uncached", 2019 2051 pFile->pszFilename)); 2020 2052 _Pmpf((" caller wants %d bytes from %d", 2021 2053 cb, ulOffset)); 2054 #endif 2055 2022 2056 if (!(arc = DosSetFilePtr(pFile->hf, 2023 2057 (LONG)ulOffset, … … 2029 2063 cb, 2030 2064 &ulDummy))) 2031 *pcb = ulDummy; // bytes read 2065 { 2066 if ( (fl & DRFL_FAILIFLESS) 2067 && (ulDummy != cb) 2068 ) 2069 arc = ERROR_NO_DATA; 2070 else 2071 *pcb = ulDummy; // bytes read 2072 } 2032 2073 } 2033 2074 } -
trunk/src/helpers/exeh.c
r130 r131 171 171 *@@changed V0.9.12 (2001-05-03) [umoeller]: added support for NOSTUB newstyle executables 172 172 *@@changed V0.9.16 (2001-12-08) [umoeller]: now using OPEN_SHARE_DENYWRITE 173 *@@changed V0.9.16 (2001-12-08) [umoeller]: fLibrary was never set, works for LX and NE now173 *@@changed V0.9.16 (2001-12-08) [umoeller]: fLibrary was never set, works for LX, NE, and PE now 174 174 *@@changed V0.9.16 (2001-12-08) [umoeller]: speed optimizations, changed some return codes 175 175 *@@changed V0.9.16 (2002-01-04) [umoeller]: added fixes for COM, BAT, CMD extensions … … 187 187 PCSZ pExt; 188 188 BOOL fOpenFile = FALSE; 189 BOOL fLoadNewHeader = FALSE; 190 ULONG ulNewHeaderOfs = 0; // V0.9.12 (2001-05-03) [umoeller] 189 191 190 192 if (!ppExec) … … 240 242 } 241 243 242 if ( (fOpenFile) // no t one of the above244 if ( (fOpenFile) // none of the above 243 245 && (!(arc = doshOpen((PSZ)pcszExecutable, 244 246 XOPEN_READ_EXISTING, 245 247 &cbFile, 246 248 &pFile))) 249 // file opened successfully: 247 250 ) 248 251 { 249 // file opened successfully:250 252 pExec->pFile = pFile; 253 pExec->cbDosExeHeader = sizeof(DOSEXEHEADER); 251 254 252 255 // read old DOS EXE header 253 256 if (!(pExec->pDosExeHeader = (PDOSEXEHEADER)malloc(sizeof(DOSEXEHEADER)))) 254 257 arc = ERROR_NOT_ENOUGH_MEMORY; 255 else 258 else if (!(arc = doshReadAt(pFile, 259 0, 260 &pExec->cbDosExeHeader, // in/out 261 (PBYTE)pExec->pDosExeHeader, 262 DRFL_FAILIFLESS))) 256 263 { 257 pExec->cbDosExeHeader = sizeof(DOSEXEHEADER); 258 if (!(arc = doshReadAt(pFile, 259 0, 260 &pExec->cbDosExeHeader, // in/out 261 (PBYTE)pExec->pDosExeHeader))) 264 // now check if we really have a DOS header 265 if (pExec->pDosExeHeader->usDosExeID != 0x5a4d) 262 266 { 263 ULONG ulNewHeaderOfs = 0; // V0.9.12 (2001-05-03) [umoeller] 264 BOOL fLoadNewHeader = FALSE; 265 266 // now check if we really have a DOS header 267 if (pExec->pDosExeHeader->usDosExeID != 0x5a4d) 268 { 269 // arc = ERROR_INVALID_EXE_SIGNATURE; 270 271 // V0.9.12 (2001-05-03) [umoeller] 272 // try loading new header directly; there are 273 // drivers which were built with NOSTUB, and 274 // the exe image starts out with the NE or LX 275 // image directly (try JFS.IFS) 276 fLoadNewHeader = TRUE; 277 // ulNewHeaderOfs is 0 now 278 279 // remove the DOS header info, since we have none 280 // V0.9.12 (2001-05-03) [umoeller] 281 FREE(pExec->pDosExeHeader); 267 // arc = ERROR_INVALID_EXE_SIGNATURE; 268 269 // V0.9.12 (2001-05-03) [umoeller] 270 // try loading new header directly; there are 271 // drivers which were built with NOSTUB, and 272 // the exe image starts out with the NE or LX 273 // image directly (try JFS.IFS) 274 fLoadNewHeader = TRUE; 275 // ulNewHeaderOfs is 0 now 276 277 // remove the DOS header info, since we have none 278 // V0.9.12 (2001-05-03) [umoeller] 279 FREE(pExec->pDosExeHeader); 280 pExec->cbDosExeHeader = 0; 281 } 282 else 283 { 284 // we have a DOS header: 285 if (pExec->pDosExeHeader->usRelocTableOfs < 0x40) 286 { 287 // neither LX nor PE nor NE: 288 pExec->ulOS = EXEOS_DOS3; 289 pExec->ulExeFormat = EXEFORMAT_OLDDOS; 282 290 } 283 291 else 284 292 { 285 // we have a DOS header: 286 if (pExec->pDosExeHeader->usRelocTableOfs < 0x40) 287 { 288 // neither LX nor PE nor NE: 289 pExec->ulOS = EXEOS_DOS3; 290 pExec->ulExeFormat = EXEFORMAT_OLDDOS; 291 } 293 // we have a new header offset: 294 fLoadNewHeader = TRUE; 295 ulNewHeaderOfs = pExec->pDosExeHeader->ulNewHeaderOfs; 296 } 297 } 298 } 299 } 300 301 if (fLoadNewHeader) 302 { 303 // either LX or PE or NE: 304 // read in new header... 305 // ulNewHeaderOfs is now either 0 (if no DOS header 306 // was found) or pDosExeHeader->ulNewHeaderOfs 307 // V0.9.12 (2001-05-03) [umoeller] 308 309 // read in the first two bytes to find out 310 // what extended header type we have; note, 311 // PE uses four bytes here 312 CHAR achNewHeaderType[4] = "???"; 313 ULONG cbRead = 4; 314 315 if (!(arc = doshReadAt(pFile, 316 ulNewHeaderOfs, 317 &cbRead, 318 achNewHeaderType, 319 DRFL_FAILIFLESS))) 320 { 321 PBYTE pbCheckOS = NULL; 322 323 if (!memcmp(achNewHeaderType, "NE", 2)) 324 { 325 // New Executable: 326 pExec->ulExeFormat = EXEFORMAT_NE; 327 cbRead = sizeof(NEHEADER); 328 329 // go read in the complete header then 330 // (doshReadAt has this in the cache) 331 if (!(pExec->pNEHeader = malloc(cbRead))) 332 arc = ERROR_NOT_ENOUGH_MEMORY; 333 else if (!(arc = doshReadAt(pFile, 334 ulNewHeaderOfs, 335 &cbRead, 336 (PBYTE)pExec->pNEHeader, 337 0))) 338 { 339 if (cbRead < sizeof(NEHEADER)) 340 arc = ERROR_BAD_EXE_FORMAT; 292 341 else 293 342 { 294 // we have a new header offset: 295 fLoadNewHeader = TRUE; 296 ulNewHeaderOfs = pExec->pDosExeHeader->ulNewHeaderOfs; 343 pExec->cbNEHeader = cbRead; 344 pbCheckOS = &pExec->pNEHeader->bTargetOS; 345 // set library flag V0.9.16 (2001-12-08) [umoeller] 346 if (pExec->pNEHeader->usFlags & 0x8000) 347 // library: 348 pExec->fLibrary = TRUE; 297 349 } 298 350 } 299 300 if (fLoadNewHeader) 301 { 302 // either LX or PE or NE: 303 // read in new header... 304 // ulNewHeaderOfs is now either 0 (if no DOS header 305 // was found) or pDosExeHeader->ulNewHeaderOfs 306 // V0.9.12 (2001-05-03) [umoeller] 307 308 // read in the first two bytes to find out 309 // what extended header type we have 310 CHAR achNewHeaderType[2] = "?"; 311 ULONG cbRead = 2; 312 313 // take the largest of LXHEADER and NEHEADER and PEHEADER 351 } 352 else if ( (!memcmp(achNewHeaderType, "LX", 2)) 353 || (!memcmp(achNewHeaderType, "LE", 2)) 354 // this is used by SMARTDRV.EXE 355 ) 356 { 357 // OS/2 Linear Executable: 358 pExec->ulExeFormat = EXEFORMAT_LX; 359 cbRead = sizeof(LXHEADER); 360 361 // go read in the complete header then 362 // (doshReadAt has this in the cache) 363 if (!(pExec->pLXHeader = malloc(cbRead))) 364 arc = ERROR_NOT_ENOUGH_MEMORY; 365 else if (!(arc = doshReadAt(pFile, 366 ulNewHeaderOfs, 367 &cbRead, 368 (PBYTE)pExec->pLXHeader, 369 0))) 370 { 371 if (cbRead < sizeof(LXHEADER)) 372 arc = ERROR_BAD_EXE_FORMAT; 373 else 374 { 375 pExec->cbLXHeader = cbRead; 376 pbCheckOS = (PBYTE)(&pExec->pLXHeader->usTargetOS); 377 // set library flag V0.9.16 (2001-12-08) [umoeller] 378 if (pExec->pLXHeader->ulFlags & 0x8000) 379 // library: 380 pExec->fLibrary = TRUE; 381 } 382 } 383 } 384 else if (!memcmp(achNewHeaderType, "PE\0\0", 4)) 385 { 386 pExec->ulExeFormat = EXEFORMAT_PE; 387 388 // PE has a standard header of 24 bytes 389 // plus an extended header, so check 390 // what we've got 391 if (!(pExec->pPEHeader = malloc(sizeof(PEHEADER)))) 392 arc = ERROR_NOT_ENOUGH_MEMORY; 393 else 394 { 395 ULONG ulOfs = ulNewHeaderOfs + 4; 396 PPEHEADER pPEHeader = pExec->pPEHeader; 397 398 // null the entire header 399 memset(pExec->pPEHeader, 400 0, 401 sizeof(PEHEADER)); 402 403 // copy sig 404 pPEHeader->ulSignature = *((PULONG)&achNewHeaderType); 405 406 // read standard header 407 cbRead = sizeof(IMAGE_FILE_HEADER); 314 408 if (!(arc = doshReadAt(pFile, 315 ul NewHeaderOfs,409 ulOfs, 316 410 &cbRead, 317 achNewHeaderType))) 411 (PBYTE)&pPEHeader->FileHeader, 412 0))) 318 413 { 319 PBYTE pbCheckOS = NULL; 320 321 if (!memcmp(achNewHeaderType, "NE", 2)) 414 if (cbRead < sizeof(IMAGE_FILE_HEADER)) 415 // only if we don't even have the 416 // standard header, return an error 417 arc = ERROR_BAD_EXE_FORMAT; 418 else 322 419 { 323 // New Executable: 324 pExec->ulExeFormat = EXEFORMAT_NE; 325 cbRead = sizeof(NEHEADER); 326 327 // go read in the complete header then 328 // (doshReadAt has this in the cache) 329 if (!(pExec->pNEHeader = malloc(cbRead))) 330 arc = ERROR_NOT_ENOUGH_MEMORY; 331 else if (!(arc = doshReadAt(pFile, 332 ulNewHeaderOfs, 333 &cbRead, 334 (PBYTE)pExec->pNEHeader))) 420 pExec->f32Bits = TRUE; 421 pExec->cbPEHeader = 4 + sizeof(PEHEADER); // for now 422 423 if (pPEHeader->FileHeader.fsCharacteristics & IMAGE_FILE_DLL) 424 pExec->fLibrary = TRUE; 425 426 // try extended header 427 ulOfs += sizeof(IMAGE_FILE_HEADER); 428 if ( (cbRead = pPEHeader->FileHeader.usSizeOfOptionalHeader) 429 && (cbRead <= sizeof(IMAGE_OPTIONAL_HEADER)) 430 ) 335 431 { 336 if (cbRead < sizeof(NEHEADER)) 337 arc = ERROR_BAD_EXE_FORMAT; 338 else 432 if (!(arc = doshReadAt(pFile, 433 ulOfs, 434 &cbRead, 435 (PBYTE)&pPEHeader->OptionalHeader, 436 0))) 339 437 { 340 pExec->cbNEHeader = cbRead; 341 pbCheckOS = &pExec->pNEHeader->bTargetOS; 342 // set library flag V0.9.16 (2001-12-08) [umoeller] 343 if (pExec->pNEHeader->usFlags & 0x8000) 344 // library: 345 pExec->fLibrary = TRUE; 438 if (cbRead != sizeof(IMAGE_OPTIONAL_HEADER)) 439 arc = ERROR_BAD_EXE_FORMAT; 440 else switch (pPEHeader->OptionalHeader.usSubsystem) 441 { 442 // case IMAGE_SUBSYSTEM_UNKNOWN: // 0 443 // case IMAGE_SUBSYSTEM_NATIVE: // 1 444 // case IMAGE_SUBSYSTEM_OS2_CUI: // 5 445 // case IMAGE_SUBSYSTEM_POSIX_CUI: // 7 446 // for these we shouldn't set win32 447 448 case IMAGE_SUBSYSTEM_WINDOWS_GUI: // 2 // Windows GUI subsystem 449 pExec->ulOS = EXEOS_WIN32_GUI; 450 break; 451 452 case IMAGE_SUBSYSTEM_WINDOWS_CUI: // 3 // Windows character subsystem 453 pExec->ulOS = EXEOS_WIN32_CLI; 454 break; 455 } 456 457 pExec->cbPEHeader = sizeof(PEHEADER); 346 458 } 347 459 } 348 460 } 349 else if ( (!memcmp(achNewHeaderType, "LX", 2)) 350 || (!memcmp(achNewHeaderType, "LE", 2)) 351 // this is used by SMARTDRV.EXE 352 ) 353 { 354 // OS/2 Linear Executable: 355 pExec->ulExeFormat = EXEFORMAT_LX; 356 cbRead = sizeof(LXHEADER); 357 358 // go read in the complete header then 359 // (doshReadAt has this in the cache) 360 if (!(pExec->pLXHeader = malloc(cbRead))) 361 arc = ERROR_NOT_ENOUGH_MEMORY; 362 else if (!(arc = doshReadAt(pFile, 363 ulNewHeaderOfs, 364 &cbRead, 365 (PBYTE)pExec->pLXHeader))) 366 { 367 if (cbRead < sizeof(LXHEADER)) 368 arc = ERROR_BAD_EXE_FORMAT; 369 else 370 { 371 pExec->cbLXHeader = cbRead; 372 pbCheckOS = (PBYTE)(&pExec->pLXHeader->usTargetOS); 373 // set library flag V0.9.16 (2001-12-08) [umoeller] 374 if (pExec->pLXHeader->ulFlags & 0x8000) 375 // library: 376 pExec->fLibrary = TRUE; 377 } 378 } 379 } 380 else if (!memcmp(achNewHeaderType, "PE", 2)) 381 { 382 pExec->ulExeFormat = EXEFORMAT_PE; 383 // PE has a standard header of 24 bytes 384 // plus an extended header, so try to 385 // read both of them in one chunk first 386 cbRead = sizeof(PEHEADER); 387 388 // go read in the complete header 389 // (doshReadAt has this in the cache) 390 if (!(pExec->pPEHeader = malloc(cbRead))) 391 arc = ERROR_NOT_ENOUGH_MEMORY; 392 else if (!(arc = doshReadAt(pFile, 393 ulNewHeaderOfs, 394 &cbRead, 395 (PBYTE)pExec->pPEHeader))) 396 { 397 if (cbRead < 24) 398 // only if don't even have the 399 // standard header, return an error 400 arc = ERROR_BAD_EXE_FORMAT; 401 else 402 { 403 // set size of header to what we've got 404 pExec->cbPEHeader = pExec->pPEHeader->usHeaderSize; 405 pExec->ulOS = EXEOS_WIN32; 406 pExec->f32Bits = TRUE; 407 408 /* 409 // we have the first 24 bytes already, so 410 // go for the next chunk, if this is more 411 // than we have in PEHEADER 412 if ( (cbRead < cbPE) 413 && (cbRead = pExec->pPEHeader->usHeaderSize) 414 ) 415 { 416 _Pmpf((" usHdrSize %d, sizeof(PEHEADER) %d, cbRead %d, cbPE %d --> reading extended header", 417 pExec->pPEHeader->usHeaderSize, 418 sizeof(PEHEADER), 419 cbRead, 420 cbPE)); 421 if (!(arc = doshReadAt(hFile, 422 ulNewHeaderOfs + 24, 423 FILE_BEGIN, 424 &cbRead, 425 (PBYTE)pExec->pPEHeader + 24))) 426 { 427 } 428 else 429 { 430 arc = ERROR_BAD_EXE_FORMAT; 431 FREE(pExec->pPEHeader); 432 } 433 } 434 else 435 _Pmpf((" already got extended header")); 436 */ 437 } 438 } 439 } 440 else 441 // strange type: 442 arc = ERROR_INVALID_EXE_SIGNATURE; 443 444 if ((!arc) && (pbCheckOS)) 445 { 446 // BYTE to check for operating system 447 // (NE and LX): 448 switch (*pbCheckOS) 449 { 450 case NEOS_OS2: 451 pExec->ulOS = EXEOS_OS2; 452 if (pExec->ulExeFormat == EXEFORMAT_LX) 453 pExec->f32Bits = TRUE; 454 break; 455 456 case NEOS_WIN16: 457 pExec->ulOS = EXEOS_WIN16; 458 break; 459 460 case NEOS_DOS4: 461 pExec->ulOS = EXEOS_DOS4; 462 break; 463 464 case NEOS_WIN386: 465 pExec->ulOS = EXEOS_WIN386; 466 pExec->f32Bits = TRUE; 467 break; 468 } 469 } 470 } // end if (!(arc = doshReadAt(hFile, 471 } // end if (fLoadNewHeader) 472 } // end if (!(arc = doshReadAt(hFile, 473 } // end else if (!(pExec->pDosExeHeader = (PDOSEXEHEADER)malloc(sizeof(DOSEXEHEADER)))) 474 475 } // end if (!(arc = DosOpen((PSZ)pcszExecutable, 461 } 462 } 463 } 464 else 465 // strange type: 466 arc = ERROR_INVALID_EXE_SIGNATURE; 467 468 if ((!arc) && (pbCheckOS)) 469 { 470 // BYTE to check for operating system 471 // (NE and LX): 472 switch (*pbCheckOS) 473 { 474 case NEOS_OS2: 475 pExec->ulOS = EXEOS_OS2; 476 if (pExec->ulExeFormat == EXEFORMAT_LX) 477 pExec->f32Bits = TRUE; 478 break; 479 480 case NEOS_WIN16: 481 pExec->ulOS = EXEOS_WIN16; 482 break; 483 484 case NEOS_DOS4: 485 pExec->ulOS = EXEOS_DOS4; 486 break; 487 488 case NEOS_WIN386: 489 pExec->ulOS = EXEOS_WIN386; 490 pExec->f32Bits = TRUE; 491 break; 492 } 493 } 494 } // end if (!(arc = doshReadAt(hFile, 495 } // end if (fLoadNewHeader) 476 496 477 497 if (arc != NO_ERROR) … … 769 789 ulNRNTOfs, // ofs determined above 770 790 &cb, // 2000 771 pszNameTable))) 791 pszNameTable, 792 0))) 772 793 { 773 794 // the string is in Pascal format, so the … … 2035 2056 + ulNewHeaderOfs, 2036 2057 &cb, 2037 (PBYTE)pExec->pRsTbl))) 2058 (PBYTE)pExec->pRsTbl, 2059 DRFL_FAILIFLESS))) 2038 2060 ) 2039 2061 { … … 2047 2069 + ulNewHeaderOfs, 2048 2070 &cb, 2049 (PBYTE)pExec->pObjTbl))) 2071 (PBYTE)pExec->pObjTbl, 2072 DRFL_FAILIFLESS))) 2050 2073 ) 2051 2074 { … … 2059 2082 + ulNewHeaderOfs, 2060 2083 &cb, 2061 (PBYTE)pExec->pObjPageTbl))) 2084 (PBYTE)pExec->pObjPageTbl, 2085 DRFL_FAILIFLESS))) 2062 2086 ) 2063 2087 { … … 2524 2548 ulOffset, 2525 2549 &ulSize, 2526 pabCompressed))) 2550 pabCompressed, 2551 0))) 2527 2552 { 2528 2553 _Pmpf((" %d bytes read", ulSize)); … … 2883 2908 + ulNewHeaderOfs, 2884 2909 &cb, 2885 (PBYTE)pExec->paOS2NEResTblEntry))) 2910 (PBYTE)pExec->paOS2NEResTblEntry, 2911 DRFL_FAILIFLESS))) 2886 2912 ) 2887 2913 { … … 2896 2922 - cb, // pNEHeader->usResSegmCount * sizeof(struct new_seg) 2897 2923 &cb, 2898 (PBYTE)pExec->paOS2NESegments))) 2924 (PBYTE)pExec->paOS2NESegments, 2925 DRFL_FAILIFLESS))) 2899 2926 ) 2900 2927 { … … 3032 3059 ulOffset, 3033 3060 &cb, 3034 *ppbResData))) 3061 *ppbResData, 3062 DRFL_FAILIFLESS))) 3035 3063 { 3036 3064 if (pcbResData) -
trunk/src/helpers/gpih.c
r129 r131 1549 1549 &bih2, 1550 1550 0, // do not initialize 1551 NULL, 1551 NULL, // init data 1552 1552 NULL); 1553 1553 }
Note:
See TracChangeset
for help on using the changeset viewer.