Changeset 131


Ignore:
Timestamp:
Jan 9, 2002, 10:17:41 PM (24 years ago)
Author:
umoeller
Message:

Coupla fixes.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/helpers/apps.h

    r127 r131  
    3636     *
    3737     ********************************************************************/
     38
     39    ULONG appQueryEnvironmentLen(PCSZ pcszEnvironment);
    3840
    3941    /*
  • trunk/include/helpers/dosh.h

    r129 r131  
    385385                    PXFILE *ppFile);
    386386
     387    #define DRFL_NOCACHE            0x0001
     388    #define DRFL_FAILIFLESS         0x0002
     389
    387390    APIRET doshReadAt(PXFILE pFile,
    388391                      ULONG ulOffset,
    389392                      PULONG pcb,
    390                       PBYTE pbData);
     393                      PBYTE pbData,
     394                      ULONG fl);
    391395
    392396    APIRET doshWrite(PXFILE pFile,
  • trunk/include/helpers/exeh.h

    r130 r131  
    3232    #define EXEH_HEADER_INCLUDED
    3333
     34    #pragma pack(1)
     35
    3436    /********************************************************************
    3537     *
    36      *   Executable helpers
     38     *   DOS exe header
    3739     *
    3840     ********************************************************************/
    39 
    40     #pragma pack(1)
    4141
    4242    /*
     
    8282    } DOSEXEHEADER, *PDOSEXEHEADER;
    8383
     84    /********************************************************************
     85     *
     86     *   New Executable (NE)
     87     *
     88     ********************************************************************/
     89
    8490    // NE and LX OS types
    8591    #define NEOS_UNKNOWN        0
     
    107113        ULONG     ulChecksum;           // 08: MS: reserved, OS/2: checksum     ne_crc
    108114        USHORT    usFlags;              // 0c: flags                            ne_flags
    109                            /*
    110                               #define NENOTP          0x8000          // Not a process == library
    111                               #define NENOTMPSAFE     0x4000          // Process is not multi-processor safe
    112                                                                       // (Win3.1 SDK: "reserved")
    113                               #define NEIERR          0x2000          // Errors in image
    114                               #define NEBOUND         0x0800          // Bound Family/API
    115                                                                       // (Win3.1 SDK: "first segment contains code
    116                                                                       // that loads the application")
    117                               #define NEAPPTYP        0x0700          // Application type mask
    118                                                                       // (Win3.1 SDK: "reserved")
    119                               #define NENOTWINCOMPAT  0x0100          // Not compatible with P.M. Windowing
    120                                                                       // (Win3.1 SDK: "reserved")
    121                               #define NEWINCOMPAT     0x0200          // Compatible with P.M. Windowing
    122                                                                       // (Win3.1 SDK: "reserved")
    123                               #define NEWINAPI        0x0300          // Uses P.M. Windowing API
    124                                                                       // (Win3.1 SDK: "reserved")
    125                               #define NEFLTP          0x0080          // Floating-point instructions
    126                               #define NEI386          0x0040          // 386 instructions
    127                               #define NEI286          0x0020          // 286 instructions
    128                               #define NEI086          0x0010          // 8086 instructions
    129                               #define NEPROT          0x0008          // Runs in protected mode only
    130                                                                       // (Win3.1 SDK: "reserved")
    131                               #define NEPPLI          0x0004          // Per-Process Library Initialization
    132                                                                       // (Win3.1 SDK: "reserved")
    133                               #define NEINST          0x0002          // Instance data
    134                               #define NESOLO          0x0001          // Solo data (single data)
    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
    136142        USHORT    usAutoDataSegNo;      // 0e: auto-data seg no.                ne_autodata
    137143                                        // (Win3.1 SDK: "0 if both NEINST and NESOLO are cleared")
     
    181187
    182188    /*
     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    /*
    183223     *@@ LXHEADER:
    184224     *      linear executable (LX) header format,
     
    204244        ULONG     ulModuleVersion;      // 0c: e32_ver module version
    205245        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
    218259        ULONG     ulPageCount;          // 14: e32_mpages no. of pages in module
    219260        ULONG     ulEIPRelObj;          // 18: e32_startobj obj # for IP
     
    260301    } LXHEADER, *PLXHEADER;
    261302
    262     /*
    263      *@@ PEHEADER:
    264      *      portable executable (PE) header format,
    265      *      which comes after the DOS header in the
    266      *      EXE file (at DOSEXEHEADER.ulNewHeaderOfs).
    267      *
    268      *@@added V0.9.10 (2001-04-08) [lafaix]
    269      */
    270 
    271     typedef struct _PEHEADER
    272     {
    273         // standard header
    274         ULONG     ulSignature;          // 00: 'P', 'E', 0, 0
    275         USHORT    usCPU;                // 04: CPU type
    276         USHORT    usObjCount;           // 06: number of object entries
    277         ULONG     ulTimeDateStamp;      // 08: store the time and date the
    278                                         //     file was created or modified
    279                                         //     by the linker
    280         ULONG     ulReserved1;          // 0c: reserved
    281         ULONG     ulReserved2;          // 10: reserved
    282         USHORT    usHeaderSize;         // 14: number of remaining bytes after
    283                                         //     usImageFlags
    284         USHORT    usImageFlags;         // 16: flags bits for the image
    285 
    286         // optional header (always present in valid Win32 files)
    287         USHORT    usReserved3;          // 18: reserved
    288         USHORT    usLinkerMajor;        // 1a: linker major version number
    289         USHORT    usLinkerMinor;        // 1c: linker minor version number
    290         USHORT    usReserved4;          // 1e: reserved
    291         ULONG     ulReserved5;          // 20: reserved
    292         ULONG     ulReserved6;          // 24: reserved
    293         ULONG     ulEntryPointRVA;      // 28: entry point relative virtual address
    294         ULONG     ulReserved7;          // 2c: reserved
    295         ULONG     ulReserved8;          // 30: reserved
    296         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: reserved
    306         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: reserved
    316         ULONG     ulInterestingRVACount;// 74:
    317         ULONG     aulRVASize[1];        // 78: array of RVA/Size entries
    318     } PEHEADER, *PPEHEADER;
    319 
    320303    // additional LX structures
    321304
     
    382365    } LXITER, *PLXITER;
    383366
    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 _OS2NERESTBLENTRY
    392     {
    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 entry
    405     {
    406         USHORT      ns_sector;      // File sector of start of segment
    407         USHORT      ns_cbseg;       // Number of bytes in file
    408         USHORT      ns_flags;       // Attribute flags
    409         USHORT      ns_minalloc;    // Minimum allocation in bytes
    410     } OS2NESEGMENT, *POS2NESEGMENT;
    411 
    412     #pragma pack()
    413 
    414367    // object/segment flags (in NE and LX)
    415368    #define OBJWRITE         0x0002L    // Writeable Object
     
    424377    #define RNDISCARD        0xF000     // Discard priority level for resource
    425378
    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     ********************************************************************/
    4431121
    4441122#ifndef __STRIP_DOWN_EXECUTABLE__
     
    4551133    {
    4561134        // 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)
    4591136        PXFILE          pFile;
    4601137
     
    4811158        PPEHEADER       pPEHeader;
    4821159        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):
    4851166        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]
    4941174
    4951175        BOOL            fLibrary,           // TRUE if this is a DLL
     1176                                            // (works for NE, LX, PE)
    4961177                        f32Bits;            // TRUE if this a 32-bits module
     1178                                            // (TRUE always for PE)
    4971179
    4981180        ULONG           ulOS;
    4991181                // target operating system as flagged in one of
    5001182                // 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
    5081199
    5091200        // The following fields are only set after
    510         // an extra call to exehQueryBldLevel:
     1201        // an extra call to exehQueryBldLevel (NE and LX only):
    5111202
    5121203        PSZ             pszDescription;
     
    5311222                        pszFixpak;
    5321223
    533         // the following fields are set after exehLoadLXMaps
     1224        // the following fields are set after exehLoadLXMaps (LX only)
    5341225        BOOL                    fLXMapsLoaded;  // TRUE after good exehLoadLXMaps
    5351226        RESOURCETABLEENTRY      *pRsTbl;        // pLXHeader->ulResTblCnt
     
    5371228        OBJECTPAGETABLEENTRY    *pObjPageTbl;   // pLXHeader->ulPageCount
    5381229
    539         // the following fields are set after exehLoadOS2NEMaps
     1230        // the following fields are set after exehLoadOS2NEMaps (OS/2 NE only)
    5401231        BOOL                    fOS2NEMapsLoaded;   // TRUE after good exehLoadOS2NEMaps
    5411232        POS2NERESTBLENTRY       paOS2NEResTblEntry;
     
    5941285    #define WINRT_ACCELERATOR           9
    5951286    #define WINRT_RCDATA               10
     1287    #define WINRT_MESSAGELIST          11       // Win32
     1288    #define WINRT_GROUP_CURSOR         12       // Win32
     1289    #define WINRT_GROUP_ICON           13       // Win32
    5961290
    5971291    /*
  • trunk/src/helpers/apps.c

    r129 r131  
    6262 *
    6363 ********************************************************************/
     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
     73ULONG 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}
    6492
    6593/*
  • trunk/src/helpers/dosh.c

    r129 r131  
    18061806                    // file ptr is at beginning
    18071807
     1808                #ifdef DEBUG_DOSOPEN
    18081809                 if (arc)
    18091810                    _Pmpf((__FUNCTION__ ": DosSetFilePtr/queryfilesize returned %d for %s",
    18101811                                arc, pcszFilename));
     1812                #endif
    18111813
    18121814                // store file size
     
    18171819                pFile->pszFilename = strdup(pcszFilename);
    18181820            }
     1821            #ifdef DEBUG_DOSOPEN
    18191822            else
    18201823                 _Pmpf((__FUNCTION__ ": DosOpen returned %d for %s",
    18211824                             arc, pcszFilename));
     1825            #endif
    18221826
    18231827            if (arc)
     
    18911895 *      cache.
    18921896 *
     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 *
    18931908 *@@added V0.9.13 (2001-06-14) [umoeller]
    18941909 *@@changed V0.9.16 (2001-12-18) [umoeller]: now with XFILE, and always using FILE_BEGIN
     
    18961911
    18971912APIRET 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
    19011917{
    19021918    APIRET arc;
     
    19271943            *pcb = cb;
    19281944
     1945            #ifdef DEBUG_DOSOPEN
    19291946            _Pmpf((__FUNCTION__ " %s: data is fully in cache",
    19301947                        pFile->pszFilename));
     
    19351952            _Pmpf(("  so copied %d bytes from cache ofs %d",
    19361953                        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
    19441955        }
    19451956        else
     
    19481959            // check how much it is... for small amounts,
    19491960            // we load the cache first
    1950             if (cb <= 4096 - 512)
     1961            if (    (cb <= 4096 - 512)
     1962                 && (!(fl & DRFL_NOCACHE))
     1963               )
    19511964            {
     1965                #ifdef DEBUG_DOSOPEN
    19521966                _Pmpf((__FUNCTION__ " %s: filling cache anew",
    19531967                        pFile->pszFilename));
    19541968                _Pmpf(("  caller wants %d bytes from %d",
    19551969                            cb, ulOffset));
     1970                #endif
    19561971
    19571972                // OK, then fix the offset to read from
     
    19621977                pFile->cbCache = 4096;
    19631978
     1979                #ifdef DEBUG_DOSOPEN
    19641980                _Pmpf(("  getting %d bytes from %d",
    19651981                            pFile->cbCache, pFile->ulReadFrom));
     1982                #endif
    19661983
    19671984                // free old cache
     
    19741991                else
    19751992                {
     1993                    ULONG ulOfsInCache = 0;
     1994
    19761995                    if (!(arc = DosSetFilePtr(pFile->hf,
    19771996                                              (LONG)pFile->ulReadFrom,
     
    19852004                        {
    19862005                            // got data:
    1987                             ULONG ulOfsInCache;
    1988 
     2006                            #ifdef DEBUG_DOSOPEN
    19892007                            _Pmpf(("        %d bytes read", ulDummy));
     2008                            #endif
     2009
    19902010                            pFile->cbCache = ulDummy;
    19912011
    1992                             // copy to caller
     2012                            // check bounds
    19932013                            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                            */
    20082023                        }
    20092024                    }
    20102025
    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)))
    20142045            }
    20152046            else
    20162047            {
    20172048                // read uncached:
     2049                #ifdef DEBUG_DOSOPEN
    20182050                _Pmpf(("  " __FUNCTION__ " %s: reading uncached",
    20192051                            pFile->pszFilename));
    20202052                _Pmpf(("      caller wants %d bytes from %d",
    20212053                            cb, ulOffset));
     2054                #endif
     2055
    20222056                if (!(arc = DosSetFilePtr(pFile->hf,
    20232057                                          (LONG)ulOffset,
     
    20292063                                        cb,
    20302064                                        &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                    }
    20322073                }
    20332074            }
  • trunk/src/helpers/exeh.c

    r130 r131  
    171171 *@@changed V0.9.12 (2001-05-03) [umoeller]: added support for NOSTUB newstyle executables
    172172 *@@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 now
     173 *@@changed V0.9.16 (2001-12-08) [umoeller]: fLibrary was never set, works for LX, NE, and PE now
    174174 *@@changed V0.9.16 (2001-12-08) [umoeller]: speed optimizations, changed some return codes
    175175 *@@changed V0.9.16 (2002-01-04) [umoeller]: added fixes for COM, BAT, CMD extensions
     
    187187    PCSZ        pExt;
    188188    BOOL        fOpenFile = FALSE;
     189    BOOL        fLoadNewHeader = FALSE;
     190    ULONG       ulNewHeaderOfs = 0;       // V0.9.12 (2001-05-03) [umoeller]
    189191
    190192    if (!ppExec)
     
    240242    }
    241243
    242     if (    (fOpenFile)     // not one of the above
     244    if (    (fOpenFile)     // none of the above
    243245         && (!(arc = doshOpen((PSZ)pcszExecutable,
    244246                              XOPEN_READ_EXISTING,
    245247                              &cbFile,
    246248                              &pFile)))
     249            // file opened successfully:
    247250       )
    248251    {
    249         // file opened successfully:
    250252        pExec->pFile = pFile;
     253        pExec->cbDosExeHeader = sizeof(DOSEXEHEADER);
    251254
    252255        // read old DOS EXE header
    253256        if (!(pExec->pDosExeHeader = (PDOSEXEHEADER)malloc(sizeof(DOSEXEHEADER))))
    254257            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)))
    256263        {
    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)
    262266            {
    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;
    282290                }
    283291                else
    284292                {
    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;
    292341                    else
    293342                    {
    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;
    297349                    }
    298350                }
    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);
    314408                    if (!(arc = doshReadAt(pFile,
    315                                            ulNewHeaderOfs,
     409                                           ulOfs,
    316410                                           &cbRead,
    317                                            achNewHeaderType)))
     411                                           (PBYTE)&pPEHeader->FileHeader,
     412                                           0)))
    318413                    {
    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
    322419                        {
    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                               )
    335431                            {
    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)))
    339437                                {
    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);
    346458                                }
    347459                            }
    348460                        }
    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)
    476496
    477497    if (arc != NO_ERROR)
     
    769789                                       ulNRNTOfs,       // ofs determined above
    770790                                       &cb,             // 2000
    771                                        pszNameTable)))
     791                                       pszNameTable,
     792                                       0)))
    772793                {
    773794                    // the string is in Pascal format, so the
     
    20352056                                      + ulNewHeaderOfs,
    20362057                                    &cb,
    2037                                     (PBYTE)pExec->pRsTbl)))
     2058                                    (PBYTE)pExec->pRsTbl,
     2059                                    DRFL_FAILIFLESS)))
    20382060            )
    20392061        {
     
    20472069                                          + ulNewHeaderOfs,
    20482070                                        &cb,
    2049                                         (PBYTE)pExec->pObjTbl)))
     2071                                        (PBYTE)pExec->pObjTbl,
     2072                                        DRFL_FAILIFLESS)))
    20502073               )
    20512074            {
     
    20592082                                              + ulNewHeaderOfs,
    20602083                                            &cb,
    2061                                             (PBYTE)pExec->pObjPageTbl)))
     2084                                            (PBYTE)pExec->pObjPageTbl,
     2085                                            DRFL_FAILIFLESS)))
    20622086                   )
    20632087                {
     
    25242548                                    ulOffset,
    25252549                                    &ulSize,
    2526                                     pabCompressed)))
     2550                                    pabCompressed,
     2551                                    0)))
    25272552        {
    25282553            _Pmpf(("   %d bytes read", ulSize));
     
    28832908                                      + ulNewHeaderOfs,
    28842909                                    &cb,
    2885                                     (PBYTE)pExec->paOS2NEResTblEntry)))
     2910                                    (PBYTE)pExec->paOS2NEResTblEntry,
     2911                                    DRFL_FAILIFLESS)))
    28862912            )
    28872913        {
     
    28962922                                          - cb, // pNEHeader->usResSegmCount * sizeof(struct new_seg)
    28972923                                        &cb,
    2898                                         (PBYTE)pExec->paOS2NESegments)))
     2924                                        (PBYTE)pExec->paOS2NESegments,
     2925                                        DRFL_FAILIFLESS)))
    28992926                )
    29002927            {
     
    30323059                                           ulOffset,
    30333060                                           &cb,
    3034                                            *ppbResData)))
     3061                                           *ppbResData,
     3062                                           DRFL_FAILIFLESS)))
    30353063                    {
    30363064                        if (pcbResData)
  • trunk/src/helpers/gpih.c

    r129 r131  
    15491549                              &bih2,
    15501550                              0,            // do not initialize
    1551                               NULL,
     1551                              NULL,         // init data
    15521552                              NULL);
    15531553    }
Note: See TracChangeset for help on using the changeset viewer.