| 1 |  | 
|---|
| 2 | /* | 
|---|
| 3 | *@@sourcefile exeh.h: | 
|---|
| 4 | *      header file for exeh.c. See remarks there. | 
|---|
| 5 | * | 
|---|
| 6 | *      Note: Version numbering in this file relates to XWorkplace version | 
|---|
| 7 | *            numbering. | 
|---|
| 8 | * | 
|---|
| 9 | *@@include #include <os2.h> | 
|---|
| 10 | *@@include #include "helpers\dosh.h" | 
|---|
| 11 | *@@include #include "helpers\exeh.h" | 
|---|
| 12 | */ | 
|---|
| 13 |  | 
|---|
| 14 | /*      This file Copyright (C) 2000-2002 Ulrich Mller, | 
|---|
| 15 | *                                        Martin Lafaix. | 
|---|
| 16 | *      This file is part of the "XWorkplace helpers" source package. | 
|---|
| 17 | *      This is free software; you can redistribute it and/or modify | 
|---|
| 18 | *      it under the terms of the GNU General Public License as published | 
|---|
| 19 | *      by the Free Software Foundation, in version 2 as it comes in the | 
|---|
| 20 | *      "COPYING" file of the XWorkplace main distribution. | 
|---|
| 21 | *      This program is distributed in the hope that it will be useful, | 
|---|
| 22 | *      but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 23 | *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
| 24 | *      GNU General Public License for more details. | 
|---|
| 25 | */ | 
|---|
| 26 |  | 
|---|
| 27 | #if __cplusplus | 
|---|
| 28 | extern "C" { | 
|---|
| 29 | #endif | 
|---|
| 30 |  | 
|---|
| 31 | #ifndef EXEH_HEADER_INCLUDED | 
|---|
| 32 | #define EXEH_HEADER_INCLUDED | 
|---|
| 33 |  | 
|---|
| 34 | #pragma pack(1) | 
|---|
| 35 |  | 
|---|
| 36 | /******************************************************************** | 
|---|
| 37 | * | 
|---|
| 38 | *   DOS exe header | 
|---|
| 39 | * | 
|---|
| 40 | ********************************************************************/ | 
|---|
| 41 |  | 
|---|
| 42 | /* | 
|---|
| 43 | *@@ DOSEXEHEADER: | 
|---|
| 44 | *      old DOS EXE header at offset 0 | 
|---|
| 45 | *      in any EXE file. | 
|---|
| 46 | * | 
|---|
| 47 | *@@changed V0.9.7 (2000-12-20) [umoeller]: fixed NE offset | 
|---|
| 48 | *@@changed V0.9.9 (2001-04-06) [lafaix]: additional fields defined | 
|---|
| 49 | */ | 
|---|
| 50 |  | 
|---|
| 51 | typedef struct _DOSEXEHEADER | 
|---|
| 52 | { | 
|---|
| 53 | USHORT usDosExeID;             // 00: DOS exeid (0x5a4d) | 
|---|
| 54 | USHORT usFileLenMod512;        // 02: filelen mod 512 | 
|---|
| 55 | USHORT usFileLenDiv512;        // 04: filelen div 512 | 
|---|
| 56 | USHORT usSegFix;               // 06: count of segment adds to fix | 
|---|
| 57 | USHORT usHdrPargCnt;           // 08: size of header in paragrphs | 
|---|
| 58 | USHORT usMinAddPargCnt;        // 0a: minimum addtl paragraphs count | 
|---|
| 59 | USHORT usMaxAddPargCnt;        // 0c: max addtl paragraphs count | 
|---|
| 60 | USHORT usSSStartup;            // 0e: SS at startup | 
|---|
| 61 | USHORT usSPStartup;            // 10: SP at startup | 
|---|
| 62 | USHORT usHdrChecksum;          // 12: header checksum | 
|---|
| 63 | USHORT usIPStartup;            // 14: IP at startup | 
|---|
| 64 | USHORT usCodeSegOfs;           // 16: code segment offset from EXE start | 
|---|
| 65 | USHORT usRelocTableOfs;        // 18: reloc table ofs.header (Win: >= 0x40 || 0) | 
|---|
| 66 | USHORT usOverlayNo;            // 1a: overlay no. | 
|---|
| 67 | USHORT usLinkerVersion;        // 1c: linker version (if 0x18 > 0x28) | 
|---|
| 68 | USHORT usUnused1;              // 1e: unused | 
|---|
| 69 | USHORT usBehaviorBits;         // 20: exe.h says this field contains | 
|---|
| 70 | //     'behavior bits' | 
|---|
| 71 | USHORT usUnused2;              // 22: unused | 
|---|
| 72 | USHORT usOEMIdentifier;        // 24: OEM identifier | 
|---|
| 73 | USHORT usOEMInformation;       // 26: OEM information | 
|---|
| 74 | ULONG  ulUnused3;              // 28: | 
|---|
| 75 | ULONG  ulUnused4;              // 2c: | 
|---|
| 76 | ULONG  ulUnused5;              // 30: | 
|---|
| 77 | ULONG  ulUnused6;              // 34: | 
|---|
| 78 | ULONG  ulUnused7;              // 38: | 
|---|
| 79 | ULONG  ulNewHeaderOfs;         // 3c: new header ofs (if 0x18 >= 0x40 || 0) | 
|---|
| 80 | // fixed this from USHORT, thanks Martin Lafaix | 
|---|
| 81 | // V0.9.7 (2000-12-20) [umoeller] | 
|---|
| 82 | } DOSEXEHEADER, *PDOSEXEHEADER; | 
|---|
| 83 |  | 
|---|
| 84 | /******************************************************************** | 
|---|
| 85 | * | 
|---|
| 86 | *   New Executable (NE) | 
|---|
| 87 | * | 
|---|
| 88 | ********************************************************************/ | 
|---|
| 89 |  | 
|---|
| 90 | // NE and LX OS types | 
|---|
| 91 | #define NEOS_UNKNOWN        0 | 
|---|
| 92 | #define NEOS_OS2            1   // Win16 SDK says: "reserved"... | 
|---|
| 93 | #define NEOS_WIN16          2 | 
|---|
| 94 | #define NEOS_DOS4           3   // Win16 SDK says: "reserved"... | 
|---|
| 95 | #define NEOS_WIN386         4   // Win16 SDK says: "reserved"... | 
|---|
| 96 |  | 
|---|
| 97 | /* | 
|---|
| 98 | *@@ NEHEADER: | 
|---|
| 99 | *      linear executable (LX) header format, | 
|---|
| 100 | *      which comes after the DOS header in the | 
|---|
| 101 | *      EXE file (at DOSEXEHEADER.ulNewHeaderOfs). | 
|---|
| 102 | * | 
|---|
| 103 | *@@changed V0.9.9 (2001-04-06) [lafaix]: fixed typo in usMoveableEntries | 
|---|
| 104 | */ | 
|---|
| 105 |  | 
|---|
| 106 | typedef struct _NEHEADER | 
|---|
| 107 | { | 
|---|
| 108 | CHAR      achNE[2];             // 00: "NE" magic                       ne_magic | 
|---|
| 109 | BYTE      bLinkerVersion;       // 02: linker version                   ne_ver | 
|---|
| 110 | BYTE      bLinkerRevision;      // 03: linker revision                  ne_rev | 
|---|
| 111 | USHORT    usEntryTblOfs;        // 04: ofs from this to entrytable      ne_enttab | 
|---|
| 112 | USHORT    usEntryTblLen;        // 06: length of entrytable             ne_cbenttab | 
|---|
| 113 | ULONG     ulChecksum;           // 08: MS: reserved, OS/2: checksum     ne_crc | 
|---|
| 114 | USHORT    usFlags;              // 0c: flags                            ne_flags | 
|---|
| 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 | 
|---|
| 142 | USHORT    usAutoDataSegNo;      // 0e: auto-data seg no.                ne_autodata | 
|---|
| 143 | // (Win3.1 SDK: "0 if both NEINST and NESOLO are cleared") | 
|---|
| 144 | USHORT    usInitlHeapSize;      // 10: initl. heap size                 ne_heap | 
|---|
| 145 | // (Win3.1 SDK: "0 if no local allocation") | 
|---|
| 146 | USHORT    usInitlStackSize;     // 12: initl. stack size                ne_stack | 
|---|
| 147 | // (Win3.1 SDK: "0 if SS != DS") | 
|---|
| 148 | ULONG     ulCSIP;               // 14: CS:IP                            ne_csip | 
|---|
| 149 | ULONG     ulSSSP;               // 18: SS:SP                            ne_sssp | 
|---|
| 150 | USHORT    usSegTblEntries;      // 1c: segment tbl entry count          ne_cseg | 
|---|
| 151 | USHORT    usModuleTblEntries;   // 1e: module ref. table entry count    ne_cmod | 
|---|
| 152 | USHORT    usNonResdTblLen;      // 20: non-resd. name tbl length        ne_cbnrestab | 
|---|
| 153 | USHORT    usSegTblOfs;          // 22: segment tbl ofs                  ne_segtab | 
|---|
| 154 | // (from start of NEHEADER) | 
|---|
| 155 | USHORT    usResTblOfs;          // 24: resource tbl ofs                 ne_rsrctab | 
|---|
| 156 | // (from start of NEHEADER) | 
|---|
| 157 | USHORT    usResdNameTblOfs;     // 26: resd. name tbl ofs               ne_restab | 
|---|
| 158 | // (from start of NEHEADER) | 
|---|
| 159 | USHORT    usModRefTblOfs;       // 28: module ref. table ofs            ne_modtab | 
|---|
| 160 | // (from start of NEHEADER) | 
|---|
| 161 | USHORT    usImportTblOfs;       // 2a: import name tbl ofs              ne_imptab | 
|---|
| 162 | // (from start of NEHEADER) | 
|---|
| 163 | ULONG     ulNonResdTblOfs;      // 2c: non-resd. name tbl ofs           ne_nrestab | 
|---|
| 164 | // (from start of EXE!) | 
|---|
| 165 | USHORT    usMoveableEntries;    // 30: moveable entry points count      ne_cmovent | 
|---|
| 166 | USHORT    usLogicalSectShift;   // 32: logcl. sector shift              ne_align | 
|---|
| 167 | // (Win3.1 SDK: "typically 4, but default is 9") | 
|---|
| 168 | USHORT    usResSegmCount;       // 34: resource segm. count             ne_cres | 
|---|
| 169 | BYTE      bTargetOS;            // 36: target OS (NEOS_* flags)         ne_exetyp | 
|---|
| 170 | BYTE      bFlags2;              // 37: addtl. flags                     ne_flagsothers | 
|---|
| 171 | // Win3.1 SDK: | 
|---|
| 172 | //      bit 1 --> Win2.x, but runs in Win3.x protected mode | 
|---|
| 173 | //      bit 2 --> Win2.x that supports prop. fonts | 
|---|
| 174 | //      bit 3 --> exec contains fastload area | 
|---|
| 175 | /* | 
|---|
| 176 | #define NELONGNAMES     0x01 | 
|---|
| 177 | #define NEWINISPROT     0x02 | 
|---|
| 178 | #define NEWINGETPROPFON 0x04 | 
|---|
| 179 | #define NEWLOAPPL       0x80 | 
|---|
| 180 | */ | 
|---|
| 181 | // the following are not listed in newexe.h, but are documented for Win3.x | 
|---|
| 182 | USHORT    usFastLoadOfs;        // 38: fast-load area ofs | 
|---|
| 183 | USHORT    usFastLoadLen;        // 3a: fast-load area length | 
|---|
| 184 | USHORT    usReserved;           // 3c: MS: 'reserved' | 
|---|
| 185 | USHORT    usReqWinVersion;      // 3e: Win-only: min. Win version | 
|---|
| 186 | } NEHEADER, *PNEHEADER; | 
|---|
| 187 |  | 
|---|
| 188 | /* | 
|---|
| 189 | *@@ OS2NERESTBLENTRY: | 
|---|
| 190 | *      OS/2 NE resource table entry. | 
|---|
| 191 | * | 
|---|
| 192 | *@@added V0.9.16 (2001-12-08) [umoeller] | 
|---|
| 193 | */ | 
|---|
| 194 |  | 
|---|
| 195 | typedef struct _OS2NERESTBLENTRY | 
|---|
| 196 | { | 
|---|
| 197 | USHORT      usType; | 
|---|
| 198 | USHORT      usID; | 
|---|
| 199 | } OS2NERESTBLENTRY, *POS2NERESTBLENTRY; | 
|---|
| 200 |  | 
|---|
| 201 | /* | 
|---|
| 202 | *@@ OS2NESEGMENT: | 
|---|
| 203 | *      OS/2 NE segment definition. | 
|---|
| 204 | * | 
|---|
| 205 | *@@added V0.9.16 (2001-12-08) [umoeller] | 
|---|
| 206 | */ | 
|---|
| 207 |  | 
|---|
| 208 | typedef struct _OS2NESEGMENT       // New .EXE segment table entry | 
|---|
| 209 | { | 
|---|
| 210 | USHORT      ns_sector;      // File sector of start of segment | 
|---|
| 211 | USHORT      ns_cbseg;       // Number of bytes in file | 
|---|
| 212 | USHORT      ns_flags;       // Attribute flags | 
|---|
| 213 | USHORT      ns_minalloc;    // Minimum allocation in bytes | 
|---|
| 214 | } OS2NESEGMENT, *POS2NESEGMENT; | 
|---|
| 215 |  | 
|---|
| 216 | /******************************************************************** | 
|---|
| 217 | * | 
|---|
| 218 | *   Linear Executable (LX) | 
|---|
| 219 | * | 
|---|
| 220 | ********************************************************************/ | 
|---|
| 221 |  | 
|---|
| 222 | /* | 
|---|
| 223 | *@@ LXHEADER: | 
|---|
| 224 | *      linear executable (LX) header format, | 
|---|
| 225 | *      which comes after the DOS header in the | 
|---|
| 226 | *      EXE file (at DOSEXEHEADER.ulNewHeaderOfs). | 
|---|
| 227 | * | 
|---|
| 228 | *@@changed V0.9.9 (2001-04-06) [lafaix]: fixed auto data object and ulinstanceDemdCnt | 
|---|
| 229 | */ | 
|---|
| 230 |  | 
|---|
| 231 | typedef struct _LXHEADER | 
|---|
| 232 | { | 
|---|
| 233 | CHAR      achLX[2];             // 00: e32_magic  "LX" or "LE" magic | 
|---|
| 234 | // this is "LX" for 32-bit OS/2 programs, but | 
|---|
| 235 | // "LE" for MS-DOS progs which use this format | 
|---|
| 236 | // (e.g. WINDOWS\SMARTDRV.EXE). IBM says the | 
|---|
| 237 | // LE format was never released and superceded | 
|---|
| 238 | // by LX... I am unsure what the differences are. | 
|---|
| 239 | BYTE      fByteBigEndian;       // 02: e32_border byte ordering (1 = big endian) | 
|---|
| 240 | BYTE      fWordBigEndian;       // 03: e32_worder word ordering (1 = big endian) | 
|---|
| 241 | ULONG     ulFormatLevel;        // 04: e32_level exe format level (0) | 
|---|
| 242 | USHORT    usCPU;                // 08: e32_cpu CPU type | 
|---|
| 243 | USHORT    usTargetOS;           // 0a: e32_os OS type (NEOS_* flags) | 
|---|
| 244 | ULONG     ulModuleVersion;      // 0c: e32_ver module version | 
|---|
| 245 | ULONG     ulFlags;              // 10: e32_mflags module flags | 
|---|
| 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 | 
|---|
| 259 | ULONG     ulPageCount;          // 14: e32_mpages no. of pages in module | 
|---|
| 260 | ULONG     ulEIPRelObj;          // 18: e32_startobj obj # for IP | 
|---|
| 261 | // object to which EIP is relative | 
|---|
| 262 | ULONG     ulEIPEntryAddr;       // 1c: e32_eip EIP entry addr | 
|---|
| 263 | ULONG     ulESPObj;             // 20: e32_stackobj ESP object | 
|---|
| 264 | ULONG     ulESP;                // 24: e32_esp ESP | 
|---|
| 265 | ULONG     ulPageSize;           // 28: e32_pagesize page size (4K) | 
|---|
| 266 | ULONG     ulPageLeftShift;      // 2c: e32_pageshift page left-shift | 
|---|
| 267 | ULONG     ulFixupTblLen;        // 30: e32_fixupsize fixup section total size | 
|---|
| 268 | ULONG     ulFixupTblChecksum;   // 34: e32_fixupsum fixup section checksum | 
|---|
| 269 | ULONG     ulLoaderLen;          // 38: e32_ldrsize size req. for loader section | 
|---|
| 270 | ULONG     ulLoaderChecksum;     // 3c: e32_ldrsum loader section checksum | 
|---|
| 271 | ULONG     ulObjTblOfs;          // 40: e32_objtab object table offset | 
|---|
| 272 | ULONG     ulObjCount;           // 44: e32_objcnt object count | 
|---|
| 273 | ULONG     ulObjPageTblOfs;      // 48: e32_objmap object page table ofs | 
|---|
| 274 | ULONG     ulObjIterPagesOfs;    // 4c: e32_itermap object iter pages ofs | 
|---|
| 275 | ULONG     ulResTblOfs;          // 50: e32_rsrctab resource table ofs | 
|---|
| 276 | ULONG     ulResTblCnt;          // 54: e32_rsrccnt resource entry count | 
|---|
| 277 | ULONG     ulResdNameTblOfs;     // 58: e32_restab resident name tbl ofs | 
|---|
| 278 | ULONG     ulEntryTblOfs;        // 5c: e32_enttab entry tbl ofs | 
|---|
| 279 | ULONG     ulModDirectivesOfs;   // 60: e32_dirtab module directives ofs | 
|---|
| 280 | ULONG     ulModDirectivesCnt;   // 64: e32_dircnt module directives count | 
|---|
| 281 | ULONG     ulFixupPagePageTblOfs;// 68: e32_fpagetab fixup page tbl ofs | 
|---|
| 282 | ULONG     ulFixupRecTblOfs;     // 6c: e32_frectab fixup record tbl ofs | 
|---|
| 283 | ULONG     ulImportModTblOfs;    // 70: e32_impmod import modl tbl ofs | 
|---|
| 284 | ULONG     ulImportModTblCnt;    // 74: e32_impmodcnt import modl tbl count | 
|---|
| 285 | ULONG     ulImportProcTblOfs;   // 78: e32_impproc import proc tbl ofs | 
|---|
| 286 | ULONG     ulPerPageCSOfs;       // 7c: e32_pagesum per page checksum ofs | 
|---|
| 287 | ULONG     ulDataPagesOfs;       // 80: e32_datapage data pages ofs | 
|---|
| 288 | ULONG     ulPreloadPagesCnt;    // 84: e32_preload preload pages count | 
|---|
| 289 | ULONG     ulNonResdNameTblOfs;  // 88: e32_nrestab non-resdnt name tbl ofs | 
|---|
| 290 | ULONG     ulNonResdNameTblLen;  // 8c: e32_cbnrestab non-resdnt name tbl length | 
|---|
| 291 | ULONG     ulNonResdNameTblCS;   // 90: e32_nressum non-res name tbl checksum | 
|---|
| 292 | ULONG     ulAutoDataSegObj;     // 94: e32_autodata auto dataseg object | 
|---|
| 293 | ULONG     ulDebugOfs;           // 98: e32_debuginfo debug info ofs | 
|---|
| 294 | ULONG     ulDebugLen;           // 9c: e32_debuglen debug info length | 
|---|
| 295 | ULONG     ulInstancePrelCnt;    // a0: e32_instpreload instance preload count | 
|---|
| 296 | ULONG     ulInstanceDemdCnt;    // a0: e32_instdemand instance demand count | 
|---|
| 297 | ULONG     ulHeapSize16;         // a8: e32_heapsize heap size (16-bit) | 
|---|
| 298 | ULONG     ulStackSize;          // ac: e32_stacksize stack size | 
|---|
| 299 | BYTE      e32_res3[20]; | 
|---|
| 300 | // Pad structure to 196 bytes | 
|---|
| 301 | } LXHEADER, *PLXHEADER; | 
|---|
| 302 |  | 
|---|
| 303 | // additional LX structures | 
|---|
| 304 |  | 
|---|
| 305 | /* | 
|---|
| 306 | *@@ RESOURCETABLEENTRY: | 
|---|
| 307 | *     LX resource table entry. | 
|---|
| 308 | * | 
|---|
| 309 | *@@added V0.9.16 (2001-12-08) [umoeller] | 
|---|
| 310 | */ | 
|---|
| 311 |  | 
|---|
| 312 | typedef struct _RESOURCETABLEENTRY     // rsrc32 | 
|---|
| 313 | { | 
|---|
| 314 | USHORT  type;   // Resource type | 
|---|
| 315 | USHORT  name;   // Resource name | 
|---|
| 316 | ULONG   cb;     // Resource size | 
|---|
| 317 | USHORT  obj;    // Object number | 
|---|
| 318 | ULONG   offset; // Offset within object | 
|---|
| 319 | } RESOURCETABLEENTRY; | 
|---|
| 320 |  | 
|---|
| 321 | /* | 
|---|
| 322 | *@@ OBJECTTABLEENTRY: | 
|---|
| 323 | *     LX object table entry. | 
|---|
| 324 | * | 
|---|
| 325 | *@@added V0.9.16 (2001-12-08) [umoeller] | 
|---|
| 326 | */ | 
|---|
| 327 |  | 
|---|
| 328 | typedef struct _OBJECTTABLEENTRY       // o32_obj | 
|---|
| 329 | { | 
|---|
| 330 | ULONG   o32_size;     // Object virtual size | 
|---|
| 331 | ULONG   o32_base;     // Object base virtual address | 
|---|
| 332 | ULONG   o32_flags;    // Attribute flags | 
|---|
| 333 | ULONG   o32_pagemap;  // Object page map index | 
|---|
| 334 | ULONG   o32_mapsize;  // Number of entries in object page map | 
|---|
| 335 | ULONG   o32_reserved; // Reserved | 
|---|
| 336 | } OBJECTTABLEENTRY; | 
|---|
| 337 |  | 
|---|
| 338 | /* | 
|---|
| 339 | *@@ OBJECTPAGETABLEENTRY: | 
|---|
| 340 | *     LX object _page_ table entry, sometimes | 
|---|
| 341 | *     referred to as map entry. | 
|---|
| 342 | * | 
|---|
| 343 | *@@added V0.9.16 (2001-12-08) [umoeller] | 
|---|
| 344 | */ | 
|---|
| 345 |  | 
|---|
| 346 | typedef struct _OBJECTPAGETABLEENTRY   // o32_map | 
|---|
| 347 | { | 
|---|
| 348 | ULONG   o32_pagedataoffset;     // file offset of page | 
|---|
| 349 | USHORT  o32_pagesize;           // # of real bytes of page data | 
|---|
| 350 | USHORT  o32_pageflags;          // Per-Page attributes | 
|---|
| 351 | } OBJECTPAGETABLEENTRY; | 
|---|
| 352 |  | 
|---|
| 353 | /* | 
|---|
| 354 | *@@ LXITER: | 
|---|
| 355 | *      iteration Record format for 'EXEPACK'ed pages. | 
|---|
| 356 | * | 
|---|
| 357 | *@@added V0.9.16 (2001-12-08) [umoeller] | 
|---|
| 358 | */ | 
|---|
| 359 |  | 
|---|
| 360 | typedef struct _LXITER | 
|---|
| 361 | { | 
|---|
| 362 | USHORT          LX_nIter;            // number of iterations | 
|---|
| 363 | USHORT          LX_nBytes;           // number of bytes | 
|---|
| 364 | unsigned char   LX_Iterdata;         // iterated data byte(s) | 
|---|
| 365 | } LXITER, *PLXITER; | 
|---|
| 366 |  | 
|---|
| 367 | // object/segment flags (in NE and LX) | 
|---|
| 368 | #define OBJWRITE         0x0002L    // Writeable Object | 
|---|
| 369 | #define OBJDISCARD       0x0010L    // Object is Discardable | 
|---|
| 370 | #define OBJSHARED        0x0020L    // Object is Shared | 
|---|
| 371 | #define OBJPRELOAD       0x0040L    // Object has preload pages | 
|---|
| 372 |  | 
|---|
| 373 | // resource flags | 
|---|
| 374 | #define RNMOVE           0x0010     // Moveable resource | 
|---|
| 375 | #define RNPURE           0x0020     // Pure (read-only) resource | 
|---|
| 376 | #define RNPRELOAD        0x0040     // Preloaded resource | 
|---|
| 377 | #define RNDISCARD        0xF000     // Discard priority level for resource | 
|---|
| 378 |  | 
|---|
| 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 | ********************************************************************/ | 
|---|
| 1121 |  | 
|---|
| 1122 | #ifndef __STRIP_DOWN_EXECUTABLE__ | 
|---|
| 1123 | // for mini stubs in warpin, which has its own | 
|---|
| 1124 | // implementation of this | 
|---|
| 1125 |  | 
|---|
| 1126 | /* | 
|---|
| 1127 | *@@ EXECUTABLE: | 
|---|
| 1128 | *      structure used with all the exeh* | 
|---|
| 1129 | *      functions. | 
|---|
| 1130 | */ | 
|---|
| 1131 |  | 
|---|
| 1132 | typedef struct _EXECUTABLE | 
|---|
| 1133 | { | 
|---|
| 1134 | // executable opened by doshOpen; | 
|---|
| 1135 | // note, NULL for .COM, .BAT, .CMD files (V0.9.16) | 
|---|
| 1136 | PXFILE          pFile; | 
|---|
| 1137 |  | 
|---|
| 1138 | // Most of the following fields are set by | 
|---|
| 1139 | // exehOpen if NO_ERROR is returned: | 
|---|
| 1140 |  | 
|---|
| 1141 | // old DOS EXE header; | 
|---|
| 1142 | // warning, this is NULL if | 
|---|
| 1143 | // --   the executable has a new header only | 
|---|
| 1144 | //      (NOSTUB, V0.9.12); | 
|---|
| 1145 | // --   for .COM, .BAT, .CMD files (V0.9.16) | 
|---|
| 1146 | PDOSEXEHEADER   pDosExeHeader; | 
|---|
| 1147 | ULONG           cbDosExeHeader; | 
|---|
| 1148 |  | 
|---|
| 1149 | // New Executable (NE) header, if ulExeFormat == EXEFORMAT_NE | 
|---|
| 1150 | PNEHEADER       pNEHeader; | 
|---|
| 1151 | ULONG           cbNEHeader; | 
|---|
| 1152 |  | 
|---|
| 1153 | // Linear Executable (LX) header, if ulExeFormat == EXEFORMAT_LX | 
|---|
| 1154 | PLXHEADER       pLXHeader; | 
|---|
| 1155 | ULONG           cbLXHeader; | 
|---|
| 1156 |  | 
|---|
| 1157 | // Portable Executable (PE) header, if ulExeFormat == EXEFORMAT_PE | 
|---|
| 1158 | PPEHEADER       pPEHeader; | 
|---|
| 1159 | ULONG           cbPEHeader; | 
|---|
| 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): | 
|---|
| 1166 | ULONG           ulExeFormat; | 
|---|
| 1167 | #endif | 
|---|
| 1168 | #define EXEFORMAT_OLDDOS        1 | 
|---|
| 1169 | #define EXEFORMAT_NE            2 | 
|---|
| 1170 | #define EXEFORMAT_PE            3 | 
|---|
| 1171 | #define EXEFORMAT_LX            4 | 
|---|
| 1172 | #define EXEFORMAT_TEXT_BATCH    5 | 
|---|
| 1173 | #define EXEFORMAT_TEXT_CMD      6       // REXX or plain OS/2 batch | 
|---|
| 1174 | #define EXEFORMAT_COM           7       // added V0.9.16 (2002-01-04) [umoeller] | 
|---|
| 1175 |  | 
|---|
| 1176 | #ifndef __STRIP_DOWN_EXECUTABLE__ | 
|---|
| 1177 | BOOL            fLibrary,           // TRUE if this is a DLL | 
|---|
| 1178 | // (works for NE, LX, PE) | 
|---|
| 1179 | f32Bits;            // TRUE if this a 32-bits module | 
|---|
| 1180 | // (TRUE always for PE) | 
|---|
| 1181 |  | 
|---|
| 1182 | ULONG           ulOS; | 
|---|
| 1183 | #endif | 
|---|
| 1184 | // target operating system as flagged in one of | 
|---|
| 1185 | // the EXE headers; one of: | 
|---|
| 1186 | #define EXEOS_UNKNOWN           0 | 
|---|
| 1187 | // set for non-standard PE files too | 
|---|
| 1188 | #define EXEOS_DOS3              1 | 
|---|
| 1189 | #define EXEOS_DOS4              2 | 
|---|
| 1190 | // there is a flag for this in NE | 
|---|
| 1191 | #define EXEOS_OS2               3 | 
|---|
| 1192 | #define EXEOS_WIN16             4 | 
|---|
| 1193 | #define EXEOS_WIN386            5 | 
|---|
| 1194 | // according to IBM, there are flags | 
|---|
| 1195 | // for this both in NE and LX | 
|---|
| 1196 | #define EXEOS_WIN32_GUI         6 | 
|---|
| 1197 | // Win32 GUI (see IMAGE_OPTIONAL_HEADER.usSubsystem), | 
|---|
| 1198 | // if PE optional header was successfully read | 
|---|
| 1199 | #define EXEOS_WIN32_CLI         7 | 
|---|
| 1200 | // Win32 command line (see IMAGE_OPTIONAL_HEADER.usSubsystem), | 
|---|
| 1201 | // if PE optional header was successfully read | 
|---|
| 1202 |  | 
|---|
| 1203 | #ifndef __STRIP_DOWN_EXECUTABLE__ | 
|---|
| 1204 | // The following fields are only set after | 
|---|
| 1205 | // an extra call to exehQueryBldLevel (NE and LX only): | 
|---|
| 1206 |  | 
|---|
| 1207 | PSZ             pszDescription; | 
|---|
| 1208 | // whole string (first non-res name tbl entry) | 
|---|
| 1209 | PSZ             pszVendor; | 
|---|
| 1210 | // vendor substring (if IBM BLDLEVEL format) | 
|---|
| 1211 | PSZ             pszVersion; | 
|---|
| 1212 | // version substring (if IBM BLDLEVEL format) | 
|---|
| 1213 |  | 
|---|
| 1214 | PSZ             pszInfo; | 
|---|
| 1215 | // module info substring (if IBM BLDLEVEL format) | 
|---|
| 1216 |  | 
|---|
| 1217 | // if pszInfo is extended DESCRIPTION field, the following | 
|---|
| 1218 | // are set as well: | 
|---|
| 1219 | PSZ             pszBuildDateTime, | 
|---|
| 1220 | pszBuildMachine, | 
|---|
| 1221 | pszASD, | 
|---|
| 1222 | pszLanguage, | 
|---|
| 1223 | pszCountry, | 
|---|
| 1224 | pszRevision, | 
|---|
| 1225 | pszUnknown, | 
|---|
| 1226 | pszFixpak; | 
|---|
| 1227 |  | 
|---|
| 1228 | // the following fields are set after exehLoadLXMaps (LX only) | 
|---|
| 1229 | BOOL                    fLXMapsLoaded;  // TRUE after good exehLoadLXMaps | 
|---|
| 1230 | RESOURCETABLEENTRY      *pRsTbl;        // pLXHeader->ulResTblCnt | 
|---|
| 1231 | OBJECTTABLEENTRY        *pObjTbl;       // pLXHeader->ulObjCount | 
|---|
| 1232 | OBJECTPAGETABLEENTRY    *pObjPageTbl;   // pLXHeader->ulPageCount | 
|---|
| 1233 |  | 
|---|
| 1234 | // the following fields are set after exehLoadOS2NEMaps (OS/2 NE only) | 
|---|
| 1235 | BOOL                    fOS2NEMapsLoaded;   // TRUE after good exehLoadOS2NEMaps | 
|---|
| 1236 | POS2NERESTBLENTRY       paOS2NEResTblEntry; | 
|---|
| 1237 | POS2NESEGMENT           paOS2NESegments; | 
|---|
| 1238 | } EXECUTABLE, *PEXECUTABLE; | 
|---|
| 1239 |  | 
|---|
| 1240 | APIRET exehOpen(const char* pcszExecutable, | 
|---|
| 1241 | PEXECUTABLE* ppExec); | 
|---|
| 1242 |  | 
|---|
| 1243 | APIRET exehQueryBldLevel(PEXECUTABLE pExec); | 
|---|
| 1244 |  | 
|---|
| 1245 | /* | 
|---|
| 1246 | *@@ FSYSMODULE: | 
|---|
| 1247 | * | 
|---|
| 1248 | *@@added V0.9.9 (2001-03-11) [lafaix] | 
|---|
| 1249 | */ | 
|---|
| 1250 |  | 
|---|
| 1251 | typedef struct _FSYSMODULE | 
|---|
| 1252 | { | 
|---|
| 1253 | CHAR achModuleName[256]; | 
|---|
| 1254 | } FSYSMODULE, *PFSYSMODULE; | 
|---|
| 1255 |  | 
|---|
| 1256 | APIRET exehQueryImportedModules(PEXECUTABLE pExec, | 
|---|
| 1257 | PFSYSMODULE *ppaModules, | 
|---|
| 1258 | PULONG pcModules); | 
|---|
| 1259 |  | 
|---|
| 1260 | APIRET exehFreeImportedModules(PFSYSMODULE paModules); | 
|---|
| 1261 |  | 
|---|
| 1262 | /* | 
|---|
| 1263 | *@@ FSYSFUNCTION: | 
|---|
| 1264 | * | 
|---|
| 1265 | *@@added V0.9.9 (2001-03-11) [lafaix] | 
|---|
| 1266 | */ | 
|---|
| 1267 |  | 
|---|
| 1268 | typedef struct _FSYSFUNCTION | 
|---|
| 1269 | { | 
|---|
| 1270 | ULONG ulOrdinal; | 
|---|
| 1271 | ULONG ulType; | 
|---|
| 1272 | CHAR achFunctionName[256]; | 
|---|
| 1273 | } FSYSFUNCTION, *PFSYSFUNCTION; | 
|---|
| 1274 |  | 
|---|
| 1275 | APIRET exehQueryExportedFunctions(PEXECUTABLE pExec, | 
|---|
| 1276 | PFSYSFUNCTION *ppaFunctions, | 
|---|
| 1277 | PULONG pcFunctions); | 
|---|
| 1278 |  | 
|---|
| 1279 | APIRET exehFreeExportedFunctions(PFSYSFUNCTION paFunctions); | 
|---|
| 1280 |  | 
|---|
| 1281 | #define WINRT_CURSOR                1 | 
|---|
| 1282 | #define WINRT_BITMAP                2 | 
|---|
| 1283 | #define WINRT_ICON                  3 | 
|---|
| 1284 | #define WINRT_MENU                  4 | 
|---|
| 1285 | #define WINRT_DIALOG                5 | 
|---|
| 1286 | #define WINRT_STRING                6 | 
|---|
| 1287 | #define WINRT_FONTDIR               7 | 
|---|
| 1288 | #define WINRT_FONT                  8 | 
|---|
| 1289 | #define WINRT_ACCELERATOR           9 | 
|---|
| 1290 | #define WINRT_RCDATA               10 | 
|---|
| 1291 | #define WINRT_MESSAGELIST          11       // Win32 | 
|---|
| 1292 | #define WINRT_GROUP_CURSOR         12       // Win32 | 
|---|
| 1293 | #define WINRT_GROUP_ICON           13       // Win32 | 
|---|
| 1294 |  | 
|---|
| 1295 | /* | 
|---|
| 1296 | *@@ FSYSRESOURCE: | 
|---|
| 1297 | * | 
|---|
| 1298 | *@@added V0.9.7 (2000-12-18) [lafaix] | 
|---|
| 1299 | */ | 
|---|
| 1300 |  | 
|---|
| 1301 | typedef struct _FSYSRESOURCE | 
|---|
| 1302 | { | 
|---|
| 1303 | ULONG ulID;                     // resource ID | 
|---|
| 1304 | ULONG ulType;                   // resource type | 
|---|
| 1305 | ULONG ulSize;                   // resource size in bytes | 
|---|
| 1306 | ULONG ulFlag;                   // resource flags | 
|---|
| 1307 |  | 
|---|
| 1308 | } FSYSRESOURCE, *PFSYSRESOURCE; | 
|---|
| 1309 |  | 
|---|
| 1310 | APIRET exehQueryResources(PEXECUTABLE pExec, | 
|---|
| 1311 | PFSYSRESOURCE *ppaResources, | 
|---|
| 1312 | PULONG pcResources); | 
|---|
| 1313 |  | 
|---|
| 1314 | APIRET exehFreeResources(PFSYSRESOURCE paResources); | 
|---|
| 1315 |  | 
|---|
| 1316 | APIRET exehLoadLXMaps(PEXECUTABLE pExec); | 
|---|
| 1317 |  | 
|---|
| 1318 | VOID exehFreeLXMaps(PEXECUTABLE pExec); | 
|---|
| 1319 |  | 
|---|
| 1320 | APIRET exehLoadLXResource(PEXECUTABLE pExec, | 
|---|
| 1321 | ULONG ulType, | 
|---|
| 1322 | ULONG idResource, | 
|---|
| 1323 | PBYTE *ppbResData, | 
|---|
| 1324 | PULONG pcbResData); | 
|---|
| 1325 |  | 
|---|
| 1326 | APIRET exehLoadOS2NEMaps(PEXECUTABLE pExec); | 
|---|
| 1327 |  | 
|---|
| 1328 | VOID exehFreeNEMaps(PEXECUTABLE pExec); | 
|---|
| 1329 |  | 
|---|
| 1330 | APIRET exehLoadOS2NEResource(PEXECUTABLE pExec, | 
|---|
| 1331 | ULONG ulType, | 
|---|
| 1332 | ULONG idResource, | 
|---|
| 1333 | PBYTE *ppbResData, | 
|---|
| 1334 | PULONG pcbResData); | 
|---|
| 1335 |  | 
|---|
| 1336 | APIRET exehClose(PEXECUTABLE *ppExec); | 
|---|
| 1337 |  | 
|---|
| 1338 | #endif | 
|---|
| 1339 |  | 
|---|
| 1340 | #endif | 
|---|
| 1341 |  | 
|---|
| 1342 | #if __cplusplus | 
|---|
| 1343 | } | 
|---|
| 1344 | #endif | 
|---|
| 1345 |  | 
|---|