| 1 | /* $Id: LXexe.h,v 1.1 2002-02-24 02:47:22 bird Exp $ | 
|---|
| 2 | * | 
|---|
| 3 | * LX DEFINITIONS AND DECLARATIONS. | 
|---|
| 4 | * -------------------------------- | 
|---|
| 5 | * | 
|---|
| 6 | * Copyright (c) IBM Corporation 1987, 1991 | 
|---|
| 7 | * Copyright (c) Microsoft Corp 1988, 1991 | 
|---|
| 8 | * | 
|---|
| 9 | * And knut st. osmundsen has been messing it up a little... | 
|---|
| 10 | * | 
|---|
| 11 | */ | 
|---|
| 12 |  | 
|---|
| 13 | #if !defined(__EXE386__) && !defined(_LXexe_h_) | 
|---|
| 14 | #define _LXexe_h_ | 
|---|
| 15 |  | 
|---|
| 16 |  | 
|---|
| 17 | #define IMAGE_OS2_SIGNATURE_LX  0x584C          /* LX */ | 
|---|
| 18 |  | 
|---|
| 19 |  | 
|---|
| 20 | #pragma pack(1)    /* Force byte alignment */ | 
|---|
| 21 |  | 
|---|
| 22 | /*_________________________________________________________________* | 
|---|
| 23 | |                                                                 | | 
|---|
| 24 | |                                                                 | | 
|---|
| 25 | |  OS/2 .EXE FILE HEADER DEFINITION - 386 version 0:32            | | 
|---|
| 26 | |                                                                 | | 
|---|
| 27 | |_________________________________________________________________| | 
|---|
| 28 | *                                                                 */ | 
|---|
| 29 |  | 
|---|
| 30 | /* | 
|---|
| 31 | * Misc stuff in the header. | 
|---|
| 32 | */ | 
|---|
| 33 | #define BITPERWORD      16 | 
|---|
| 34 | #define BITPERBYTE      8 | 
|---|
| 35 | #define OBJPAGELEN      4096 | 
|---|
| 36 | #define E32MAGIC1       'L'        /* New magic number  "LX" */ | 
|---|
| 37 | #define E32MAGIC2       'X'        /* New magic number  "LX" */ | 
|---|
| 38 | #define E32MAGIC        0x584c     /* New magic number  "LX" */ | 
|---|
| 39 | #define E32RESBYTES1    0          /* First bytes reserved */ | 
|---|
| 40 | #define E32RESBYTES2    0          /* Second bytes reserved */ | 
|---|
| 41 | #define E32RESBYTES3    20         /* Third bytes reserved */ | 
|---|
| 42 | #define E32LEBO         0x00       /* Little Endian Byte Order */ | 
|---|
| 43 | #define E32BEBO         0x01       /* Big Endian Byte Order */ | 
|---|
| 44 | #define E32LEWO         0x00       /* Little Endian Word Order */ | 
|---|
| 45 | #define E32BEWO         0x01       /* Big Endian Word Order */ | 
|---|
| 46 | #define E32LEVEL        0L         /* 32-bit EXE format level */ | 
|---|
| 47 | #define E32CPU286       0x001      /* Intel 80286 or upwardly compatibile */ | 
|---|
| 48 | #define E32CPU386       0x002      /* Intel 80386 or upwardly compatibile */ | 
|---|
| 49 | #define E32CPU486       0x003      /* Intel 80486 or upwardly compatibile */ | 
|---|
| 50 |  | 
|---|
| 51 |  | 
|---|
| 52 | /** | 
|---|
| 53 | * New 32-bit .EXE header for OS/2 version 2.0 and above. | 
|---|
| 54 | */ | 
|---|
| 55 | struct e32_exe | 
|---|
| 56 | { | 
|---|
| 57 | unsigned char       e32_magic[2];   /* Magic number E32_MAGIC */ | 
|---|
| 58 | unsigned char       e32_border;     /* The byte ordering for the .EXE */ | 
|---|
| 59 | unsigned char       e32_worder;     /* The word ordering for the .EXE */ | 
|---|
| 60 | unsigned long       e32_level;      /* The EXE format level for now = 0 */ | 
|---|
| 61 | unsigned short      e32_cpu;        /* The CPU type */ | 
|---|
| 62 | unsigned short      e32_os;         /* The OS type */ | 
|---|
| 63 | unsigned long       e32_ver;        /* Module version */ | 
|---|
| 64 | unsigned long       e32_mflags;     /* Module flags */ | 
|---|
| 65 | unsigned long       e32_mpages;     /* Module # pages */ | 
|---|
| 66 | unsigned long       e32_startobj;   /* Object # for instruction pointer */ | 
|---|
| 67 | unsigned long       e32_eip;        /* Extended instruction pointer */ | 
|---|
| 68 | unsigned long       e32_stackobj;   /* Object # for stack pointer */ | 
|---|
| 69 | unsigned long       e32_esp;        /* Extended stack pointer */ | 
|---|
| 70 | unsigned long       e32_pagesize;   /* .EXE page size */ | 
|---|
| 71 | unsigned long       e32_pageshift;  /* Page alignment shift in .EXE */ | 
|---|
| 72 | unsigned long       e32_fixupsize;  /* Fixup section size */ | 
|---|
| 73 | unsigned long       e32_fixupsum;   /* Fixup section checksum */ | 
|---|
| 74 | unsigned long       e32_ldrsize;    /* Loader section size */ | 
|---|
| 75 | unsigned long       e32_ldrsum;     /* Loader section checksum */ | 
|---|
| 76 | unsigned long       e32_objtab;     /* Object table offset */ | 
|---|
| 77 | unsigned long       e32_objcnt;     /* Number of objects in module */ | 
|---|
| 78 | unsigned long       e32_objmap;     /* Object page map offset */ | 
|---|
| 79 | unsigned long       e32_itermap;    /* Object iterated data map offset */ | 
|---|
| 80 | unsigned long       e32_rsrctab;    /* Offset of Resource Table */ | 
|---|
| 81 | unsigned long       e32_rsrccnt;    /* Number of resource entries */ | 
|---|
| 82 | unsigned long       e32_restab;     /* Offset of resident name table */ | 
|---|
| 83 | unsigned long       e32_enttab;     /* Offset of Entry Table */ | 
|---|
| 84 | unsigned long       e32_dirtab;     /* Offset of Module Directive Table */ | 
|---|
| 85 | unsigned long       e32_dircnt;     /* Number of module directives */ | 
|---|
| 86 | unsigned long       e32_fpagetab;   /* Offset of Fixup Page Table */ | 
|---|
| 87 | unsigned long       e32_frectab;    /* Offset of Fixup Record Table */ | 
|---|
| 88 | unsigned long       e32_impmod;     /* Offset of Import Module Name Table */ | 
|---|
| 89 | unsigned long       e32_impmodcnt;  /* Number of entries in Import Module Name Table */ | 
|---|
| 90 | unsigned long       e32_impproc;    /* Offset of Import Procedure Name Table */ | 
|---|
| 91 | unsigned long       e32_pagesum;    /* Offset of Per-Page Checksum Table */ | 
|---|
| 92 | unsigned long       e32_datapage;   /* Offset of Enumerated Data Pages */ | 
|---|
| 93 | unsigned long       e32_preload;    /* Number of preload pages */ | 
|---|
| 94 | unsigned long       e32_nrestab;    /* Offset of Non-resident Names Table */ | 
|---|
| 95 | unsigned long       e32_cbnrestab;  /* Size of Non-resident Name Table */ | 
|---|
| 96 | unsigned long       e32_nressum;    /* Non-resident Name Table Checksum */ | 
|---|
| 97 | unsigned long       e32_autodata;   /* Object # for automatic data object */ | 
|---|
| 98 | unsigned long       e32_debuginfo;  /* Offset of the debugging information */ | 
|---|
| 99 | unsigned long       e32_debuglen;   /* The length of the debugging info. in bytes */ | 
|---|
| 100 | unsigned long       e32_instpreload;/* Number of instance pages in preload section of .EXE file */ | 
|---|
| 101 | unsigned long       e32_instdemand; /* Number of instance pages in demand load section of .EXE file */ | 
|---|
| 102 | unsigned long       e32_heapsize;   /* Size of heap - for 16-bit apps */ | 
|---|
| 103 | unsigned long       e32_stacksize;  /* Size of stack */ | 
|---|
| 104 | unsigned char       e32_res3[E32RESBYTES3]; | 
|---|
| 105 | /* Pad structure to 196 bytes */ | 
|---|
| 106 | }; | 
|---|
| 107 |  | 
|---|
| 108 | /* | 
|---|
| 109 | *  Format of E32_MFLAGS(x): | 
|---|
| 110 | * | 
|---|
| 111 | *  Low word has the following format: | 
|---|
| 112 | * | 
|---|
| 113 | *  15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  - bit no | 
|---|
| 114 | *   |     |          | |     | | | | | 
|---|
| 115 | *   |     |          | |     | | | +------- Per-Process Library Initialization | 
|---|
| 116 | *   |     |          | |     | | +--------- SystemDLL (internal fixups discarded) | 
|---|
| 117 | *   |     |          | |     | +----------- No Internal Fixups for Module in .EXE | 
|---|
| 118 | *   |     |          | |     +------------- No External Fixups for Module in .EXE | 
|---|
| 119 | *   |     |          | +------------------- Incompatible with PM Windowing | 
|---|
| 120 | *   |     |          +--------------------- Compatible with PM Windowing | 
|---|
| 121 | *   |     |                                 Uses PM Windowing API | 
|---|
| 122 | *   |     +-------------------------------- Module not Loadable | 
|---|
| 123 | *   +-------------------------------------- Library Module | 
|---|
| 124 | */ | 
|---|
| 125 | #define E32NOTP          0x8000L        /* Library Module - used as NENOTP */ | 
|---|
| 126 | #define E32NOLOAD        0x2000L        /* Module not Loadable */ | 
|---|
| 127 | #define E32PMAPI         0x0300L        /* Uses PM Windowing API */ | 
|---|
| 128 | #define E32PMW           0x0200L        /* Compatible with PM Windowing */ | 
|---|
| 129 | #define E32NOPMW         0x0100L        /* Incompatible with PM Windowing */ | 
|---|
| 130 | #define E32NOEXTFIX      0x0020L        /* NO External Fixups in .EXE */ | 
|---|
| 131 | #define E32NOINTFIX      0x0010L        /* NO Internal Fixups in .EXE */ | 
|---|
| 132 | #define E32SYSDLL        0x0008L        /* System DLL, Internal Fixups discarded*/ | 
|---|
| 133 | #define E32LIBINIT       0x0004L        /* Per-Process Library Initialization */ | 
|---|
| 134 | #define E32LIBTERM       0x40000000L    /* Per-Process Library Termination */ | 
|---|
| 135 | #define E32APPMASK       0x0300L        /* Application Type Mask */ | 
|---|
| 136 |  | 
|---|
| 137 | /* | 
|---|
| 138 | *  Format of E32_MFLAGS(x): | 
|---|
| 139 | * | 
|---|
| 140 | *  High word has the following format: | 
|---|
| 141 | * | 
|---|
| 142 | *  15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  - bit no | 
|---|
| 143 | *                                    | | | 
|---|
| 144 | *                                    | +--- Protected memory library module | 
|---|
| 145 | *                                    +----- Device driver | 
|---|
| 146 | */ | 
|---|
| 147 | #define E32PROTDLL       0x10000L       /* Protected memory library module */ | 
|---|
| 148 | #define E32DEVICE        0x20000L       /* Device driver                   */ | 
|---|
| 149 | #define E32MODEXE        0x00000L       /* .EXE module                     */ | 
|---|
| 150 | #define E32MODDLL        0x08000L       /* .DLL module                     */ | 
|---|
| 151 | #define E32MODPROTDLL    0x18000L       /* Protected memory library module */ | 
|---|
| 152 | #define E32MODPDEV       0x20000L       /* Physical device driver          */ | 
|---|
| 153 | #define E32MODVDEV       0x28000L       /* Virtual device driver           */ | 
|---|
| 154 | #define E32MODMASK       0x38000L       /* Module type mask                */ | 
|---|
| 155 | #define E32NOTMPSAFE     0x80000L       /* Process is multi-processor unsafe */ | 
|---|
| 156 |  | 
|---|
| 157 |  | 
|---|
| 158 |  | 
|---|
| 159 | /* | 
|---|
| 160 | *  RELOCATION DEFINITIONS - RUN-TIME FIXUPS | 
|---|
| 161 | */ | 
|---|
| 162 |  | 
|---|
| 163 | typedef union _offset | 
|---|
| 164 | { | 
|---|
| 165 | unsigned short offset16; | 
|---|
| 166 | unsigned long  offset32; | 
|---|
| 167 | }   offset;                             /* 16-bit or 32-bit offset */ | 
|---|
| 168 |  | 
|---|
| 169 | /***ET+ r32_rlc - Relocation item */ | 
|---|
| 170 | struct r32_rlc                          /* Relocation item */ | 
|---|
| 171 | { | 
|---|
| 172 | unsigned char       nr_stype;       /* Source type - field shared with new_rlc */ | 
|---|
| 173 | unsigned char       nr_flags;       /* Flag byte - field shared with new_rlc */ | 
|---|
| 174 | short               r32_soff;       /* Source offset */ | 
|---|
| 175 | unsigned short      r32_objmod;     /* Target object number or Module ordinal */ | 
|---|
| 176 |  | 
|---|
| 177 | union targetid | 
|---|
| 178 | { | 
|---|
| 179 | offset          intref;         /* Internal fixup */ | 
|---|
| 180 | union extfixup | 
|---|
| 181 | { | 
|---|
| 182 | offset         proc;        /* Procedure name offset */ | 
|---|
| 183 | unsigned long  ord;         /* Procedure odrinal */ | 
|---|
| 184 | }               extref;         /* External fixup */ | 
|---|
| 185 | struct addfixup | 
|---|
| 186 | { | 
|---|
| 187 | unsigned short entry;       /* Entry ordinal */ | 
|---|
| 188 | offset         addval;      /* Value added to the address */ | 
|---|
| 189 | }               addfix;         /* Additive fixup */ | 
|---|
| 190 | }                   r32_target;     /* Target data */ | 
|---|
| 191 |  | 
|---|
| 192 | unsigned short      r32_srccount;   /* Number of chained fixup records */ | 
|---|
| 193 | unsigned short      r32_chain;      /* Chain head */ | 
|---|
| 194 | }; | 
|---|
| 195 |  | 
|---|
| 196 | /* | 
|---|
| 197 | *  In 32-bit .EXE file run-time relocations are written as varying size | 
|---|
| 198 | *  records, so we need many size definitions. | 
|---|
| 199 | */ | 
|---|
| 200 | #define RINTSIZE16      8 | 
|---|
| 201 | #define RINTSIZE32      10 | 
|---|
| 202 | #define RORDSIZE        8 | 
|---|
| 203 | #define RNAMSIZE16      8 | 
|---|
| 204 | #define RNAMSIZE32      10 | 
|---|
| 205 | #define RADDSIZE16      10 | 
|---|
| 206 | #define RADDSIZE32      12 | 
|---|
| 207 |  | 
|---|
| 208 | /* | 
|---|
| 209 | *  Format of NR_STYPE(x) | 
|---|
| 210 | * | 
|---|
| 211 | *       7 6 5 4 3 2 1 0  - bit no | 
|---|
| 212 | *           | | | | | | | 
|---|
| 213 | *           | | +-+-+-+--- Source type | 
|---|
| 214 | *           | +----------- Fixup to 16:16 alias | 
|---|
| 215 | *           +------------- List of source offset follows fixup record | 
|---|
| 216 | */ | 
|---|
| 217 |  | 
|---|
| 218 | #define NRSTYP          0x0f            /* Source type mask */ | 
|---|
| 219 | #define NRSBYT          0x00            /* lo byte (8-bits)*/ | 
|---|
| 220 | #define NRSSEG          0x02            /* 16-bit segment (16-bits) */ | 
|---|
| 221 | #define NRSPTR          0x03            /* 16:16 pointer (32-bits) */ | 
|---|
| 222 | #define NRSOFF          0x05            /* 16-bit offset (16-bits) */ | 
|---|
| 223 | #define NRPTR48         0x06            /* 16:32 pointer (48-bits) */ | 
|---|
| 224 | #define NROFF32         0x07            /* 32-bit offset (32-bits) */ | 
|---|
| 225 | #define NRSOFF32        0x08            /* 32-bit self-relative offset (32-bits) */ | 
|---|
| 226 | #define NRSRCMASK       0x0f            /* Source type mask */ | 
|---|
| 227 | #define NRALIAS         0x10            /* Fixup to alias */ | 
|---|
| 228 | #define NRCHAIN         0x20            /* List of source offset follows */ | 
|---|
| 229 | /* fixup record, source offset field */ | 
|---|
| 230 | /* in fixup record contains number */ | 
|---|
| 231 | /* of elements in list */ | 
|---|
| 232 | /* | 
|---|
| 233 | *  Format of NR_FLAGS(x) and R32_FLAGS(x): | 
|---|
| 234 | * | 
|---|
| 235 | *       7 6 5 4 3 2 1 0  - bit no | 
|---|
| 236 | *       | | | |   | | | | 
|---|
| 237 | *       | | | |   | +-+--- Reference type | 
|---|
| 238 | *       | | | |   +------- Additive fixup | 
|---|
| 239 | *       | | | +----------- 32-bit Target Offset Flag (1 - 32-bit; 0 - 16-bit) | 
|---|
| 240 | *       | | +------------- 32-bit Additive Flag (1 - 32-bit; 0 - 16-bit) | 
|---|
| 241 | *       | +--------------- 16-bit Object/Module ordinal (1 - 16-bit; 0 - 8-bit) | 
|---|
| 242 | *       +----------------- 8-bit import ordinal (1 - 8-bit; | 
|---|
| 243 | *                                                0 - NR32BITOFF toggles | 
|---|
| 244 | *                                                    between 16 and 32 bit | 
|---|
| 245 | *                                                    ordinal) | 
|---|
| 246 | */ | 
|---|
| 247 | #define NRRTYP          0x03            /* Reference type mask */ | 
|---|
| 248 | #define NRRINT          0x00            /* Internal reference */ | 
|---|
| 249 | #define NRRORD          0x01            /* Import by ordinal */ | 
|---|
| 250 | #define NRRNAM          0x02            /* Import by name */ | 
|---|
| 251 | #define NRADD           0x04            /* Additive fixup */ | 
|---|
| 252 | #define NRICHAIN        0x08            /* Internal Chaining Fixup */ | 
|---|
| 253 | #define NRRENT          0x03            /* Internal entry table fixup */ | 
|---|
| 254 | #define NR32BITOFF      0x10            /* 32-bit Target Offset */ | 
|---|
| 255 | #define NR32BITADD      0x20            /* 32-bit Additive fixup */ | 
|---|
| 256 | #define NR16OBJMOD      0x40            /* 16-bit Object/Module ordinal */ | 
|---|
| 257 | #define NR8BITORD       0x80            /* 8-bit import ordinal */ | 
|---|
| 258 |  | 
|---|
| 259 | /* | 
|---|
| 260 | *  Data structures for storing run-time fixups in linker virtual memory. | 
|---|
| 261 | * | 
|---|
| 262 | *  Each object has a list of Object Page Directories which specify | 
|---|
| 263 | *  fixups for given page. Each page has its own hash table which is | 
|---|
| 264 | *  used to detect fixups to the same target. | 
|---|
| 265 | */ | 
|---|
| 266 | #define PAGEPERDIR      62 | 
|---|
| 267 | #define LG2DIR          7 | 
|---|
| 268 | typedef struct _OBJPAGEDIR | 
|---|
| 269 | { | 
|---|
| 270 | unsigned long       next;           /* Virtual pointer to next dir on list */ | 
|---|
| 271 | unsigned short      ht[PAGEPERDIR]; /* Pointers to individual hash tables */ | 
|---|
| 272 | } OBJPAGEDIR; | 
|---|
| 273 |  | 
|---|
| 274 |  | 
|---|
| 275 |  | 
|---|
| 276 | /* | 
|---|
| 277 | *  OBJECT TABLE | 
|---|
| 278 | */ | 
|---|
| 279 |  | 
|---|
| 280 | /***ET+ o32_obj Object Table Entry */ | 
|---|
| 281 | struct o32_obj                          /* Flat .EXE object table entry */ | 
|---|
| 282 | { | 
|---|
| 283 | unsigned long       o32_size;       /* Object virtual size */ | 
|---|
| 284 | unsigned long       o32_base;       /* Object base virtual address */ | 
|---|
| 285 | unsigned long       o32_flags;      /* Attribute flags */ | 
|---|
| 286 | unsigned long       o32_pagemap;    /* Object page map index */ | 
|---|
| 287 | unsigned long       o32_mapsize;    /* Number of entries in object page map */ | 
|---|
| 288 | unsigned long       o32_reserved;   /* Reserved */ | 
|---|
| 289 | }; | 
|---|
| 290 |  | 
|---|
| 291 | /* | 
|---|
| 292 | *  Format of O32_FLAGS(x) | 
|---|
| 293 | * | 
|---|
| 294 | *  High word of dword flag field is not used for now. | 
|---|
| 295 | *  Low word has the following format: | 
|---|
| 296 | * | 
|---|
| 297 | *  15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  - bit no | 
|---|
| 298 | *   |  |  |  |     | | | | | | | | | | | | 
|---|
| 299 | *   |  |  |  |     | | | | | | | | | | +--- Readable Object | 
|---|
| 300 | *   |  |  |  |     | | | | | | | | | +----- Writeable Object | 
|---|
| 301 | *   |  |  |  |     | | | | | | | | +------- Executable Object | 
|---|
| 302 | *   |  |  |  |     | | | | | | | +--------- Resource Object | 
|---|
| 303 | *   |  |  |  |     | | | | | | +----------- Object is Discardable | 
|---|
| 304 | *   |  |  |  |     | | | | | +------------- Object is Shared | 
|---|
| 305 | *   |  |  |  |     | | | | +--------------- Object has preload pages | 
|---|
| 306 | *   |  |  |  |     | | | +----------------- Object has invalid pages | 
|---|
| 307 | *   |  |  |  |     | | +------------------- Object is permanent and swappable | 
|---|
| 308 | *   |  |  |  |     | +--------------------- Object is permanent and resident | 
|---|
| 309 | *   |  |  |  |     +----------------------- Object is permanent and long lockable | 
|---|
| 310 | *   |  |  |  +----------------------------- 16:16 alias required (80x86 specific) | 
|---|
| 311 | *   |  |  +-------------------------------- Big/Default bit setting (80x86 specific) | 
|---|
| 312 | *   |  +----------------------------------- Object is conforming for code (80x86 specific) | 
|---|
| 313 | *   +-------------------------------------- Object I/O privilege level (80x86 specific) | 
|---|
| 314 | * | 
|---|
| 315 | */ | 
|---|
| 316 | #define OBJREAD         0x0001L             /* Readable Object   */ | 
|---|
| 317 | #define OBJWRITE        0x0002L             /* Writeable Object  */ | 
|---|
| 318 | #define OBJRSRC         0x0008L             /* Resource Object   */ | 
|---|
| 319 | #define OBJINVALID      0x0080L             /* Object has invalid pages  */ | 
|---|
| 320 | #define LNKNONPERM      0x0600L             /* Object is nonpermanent - should be */ | 
|---|
| 321 | #define OBJNONPERM      0x0000L             /* zero in the .EXE but LINK386 uses 6 */ | 
|---|
| 322 | #define OBJPERM         0x0100L             /* Object is permanent and swappable */ | 
|---|
| 323 | #define OBJRESIDENT     0x0200L             /* Object is permanent and resident */ | 
|---|
| 324 | #define OBJCONTIG       0x0300L             /* Object is resident and contiguous */ | 
|---|
| 325 | #define OBJDYNAMIC      0x0400L             /* Object is permanent and long locable */ | 
|---|
| 326 | #define OBJTYPEMASK     0x0700L             /* Object type mask */ | 
|---|
| 327 | #define OBJALIAS16      0x1000L             /* 16:16 alias required (80x86 specific)           */ | 
|---|
| 328 | #define OBJBIGDEF       0x2000L             /* Big/Default bit setting (80x86 specific)        */ | 
|---|
| 329 | #define OBJIOPL         0x8000L             /* Object I/O privilege level (80x86 specific)     */ | 
|---|
| 330 |  | 
|---|
| 331 | /* | 
|---|
| 332 | *  Name these flags differently for EXEHDR.EXE - avoid conflicts with 286 version | 
|---|
| 333 | */ | 
|---|
| 334 | #define OBJDISCARD       0x0010L            /* Object is Discardable */ | 
|---|
| 335 | #define OBJSHARED        0x0020L            /* Object is Shared */ | 
|---|
| 336 | #define OBJPRELOAD       0x0040L            /* Object has preload pages  */ | 
|---|
| 337 | #define OBJEXEC          0x0004L            /* Executable Object */ | 
|---|
| 338 | #define OBJCONFORM       0x4000L            /* Object is conforming for code (80x86 specific)  */ | 
|---|
| 339 |  | 
|---|
| 340 | /***ET+ o32_map - Object Page Map entry */ | 
|---|
| 341 | struct o32_map                              /* Object Page Table entry */ | 
|---|
| 342 | { | 
|---|
| 343 | unsigned long   o32_pagedataoffset;     /* file offset of page */ | 
|---|
| 344 | unsigned short  o32_pagesize;           /* # bytes of page data */ | 
|---|
| 345 | unsigned short  o32_pageflags;          /* Per-Page attributes */ | 
|---|
| 346 | }; | 
|---|
| 347 |  | 
|---|
| 348 | /* | 
|---|
| 349 | * Page flags | 
|---|
| 350 | */ | 
|---|
| 351 | #define VALID           0x0000                /* Valid Physical Page in .EXE */ | 
|---|
| 352 | #define ITERDATA        0x0001                /* Iterated Data Page */ | 
|---|
| 353 | #define INVALID         0x0002                /* Invalid Page */ | 
|---|
| 354 | #define ZEROED          0x0003                /* Zero Filled Page */ | 
|---|
| 355 | #define RANGE           0x0004                /* Range of pages */ | 
|---|
| 356 | #define ITERDATA2       0x0005                /* Iterated Data Page Type II */ | 
|---|
| 357 |  | 
|---|
| 358 |  | 
|---|
| 359 |  | 
|---|
| 360 | /* | 
|---|
| 361 | *  RESOURCE TABLE | 
|---|
| 362 | */ | 
|---|
| 363 |  | 
|---|
| 364 | /***ET+ rsrc32 - Resource Table Entry */ | 
|---|
| 365 | struct rsrc32                               /* Resource Table Entry */ | 
|---|
| 366 | { | 
|---|
| 367 | unsigned short      type;               /* Resource type */ | 
|---|
| 368 | unsigned short      name;               /* Resource name */ | 
|---|
| 369 | unsigned long       cb;                 /* Resource size */ | 
|---|
| 370 | unsigned short      obj;                /* Object number */ | 
|---|
| 371 | unsigned long       offset;             /* Offset within object */ | 
|---|
| 372 | }; | 
|---|
| 373 |  | 
|---|
| 374 | /* | 
|---|
| 375 | * Iteration Record format for 'EXEPACK'ed pages. | 
|---|
| 376 | */ | 
|---|
| 377 | struct LX_Iter | 
|---|
| 378 | { | 
|---|
| 379 | unsigned short LX_nIter;            /* number of iterations */ | 
|---|
| 380 | unsigned short LX_nBytes;           /* number of bytes */ | 
|---|
| 381 | unsigned char  LX_Iterdata;         /* iterated data byte(s) */ | 
|---|
| 382 | }; | 
|---|
| 383 |  | 
|---|
| 384 |  | 
|---|
| 385 |  | 
|---|
| 386 | /* | 
|---|
| 387 | *  ENTRY TABLE DEFINITIONS | 
|---|
| 388 | */ | 
|---|
| 389 |  | 
|---|
| 390 | /***ET+ b32_bundle - Entry Table */ | 
|---|
| 391 | struct b32_bundle | 
|---|
| 392 | { | 
|---|
| 393 | unsigned char       b32_cnt;        /* Number of entries in this bundle */ | 
|---|
| 394 | unsigned char       b32_type;       /* Bundle type */ | 
|---|
| 395 | unsigned short      b32_obj;        /* Object number */ | 
|---|
| 396 | };                                      /* Follows entry types */ | 
|---|
| 397 |  | 
|---|
| 398 | /* | 
|---|
| 399 | *  Bundle types. | 
|---|
| 400 | */ | 
|---|
| 401 | #define EMPTY        0x00               /* Empty bundle */ | 
|---|
| 402 | #define ENTRY16      0x01               /* 16-bit offset entry point */ | 
|---|
| 403 | #define GATE16       0x02               /* 286 call gate (16-bit IOPL) */ | 
|---|
| 404 | #define ENTRY32      0x03               /* 32-bit offset entry point */ | 
|---|
| 405 | #define ENTRYFWD     0x04               /* Forwarder entry point */ | 
|---|
| 406 | #define TYPEINFO     0x80               /* Typing information present flag */ | 
|---|
| 407 |  | 
|---|
| 408 | struct e32_entry | 
|---|
| 409 | { | 
|---|
| 410 | unsigned char       e32_flags;      /* Entry point flags */ | 
|---|
| 411 | union entrykind | 
|---|
| 412 | { | 
|---|
| 413 | offset          e32_offset;     /* 16-bit/32-bit offset entry */ | 
|---|
| 414 | struct callgate | 
|---|
| 415 | { | 
|---|
| 416 | unsigned short offset;      /* Offset in segment */ | 
|---|
| 417 | unsigned short callgate;    /* Callgate selector */ | 
|---|
| 418 | }               e32_callgate;   /* 286 (16-bit) call gate */ | 
|---|
| 419 | struct fwd | 
|---|
| 420 | { | 
|---|
| 421 | unsigned short  modord;     /* Module ordinal number */ | 
|---|
| 422 | unsigned long   value;      /* Proc name offset or ordinal */ | 
|---|
| 423 | }               e32_fwd;        /* Forwarder */ | 
|---|
| 424 | }                   e32_variant;    /* Entry variant */ | 
|---|
| 425 | }; | 
|---|
| 426 |  | 
|---|
| 427 | /* | 
|---|
| 428 | *  Entry flags. | 
|---|
| 429 | */ | 
|---|
| 430 | #define FIXENT16        3 | 
|---|
| 431 | #define FIXENT32        5 | 
|---|
| 432 | #define GATEENT16       5 | 
|---|
| 433 | #define FWDENT          7 | 
|---|
| 434 |  | 
|---|
| 435 | /* | 
|---|
| 436 | *  Format for E32_EFLAGS(x) | 
|---|
| 437 | * | 
|---|
| 438 | *       7 6 5 4 3 2 1 0  - bit no | 
|---|
| 439 | *       | | | | | | | | | 
|---|
| 440 | *       | | | | | | | +--- exported entry | 
|---|
| 441 | *       | | | | | | +----- uses shared data | 
|---|
| 442 | *       +-+-+-+-+-+------- parameter word count | 
|---|
| 443 | */ | 
|---|
| 444 | #define E32EXPORT       0x01            /* Exported entry */ | 
|---|
| 445 | #define E32SHARED       0x02            /* Uses shared data */ | 
|---|
| 446 | #define E32PARAMS       0xf8            /* Parameter word count mask */ | 
|---|
| 447 |  | 
|---|
| 448 | /* | 
|---|
| 449 | *  Flags for forwarders only: | 
|---|
| 450 | */ | 
|---|
| 451 | #define FWD_ORDINAL     0x01            /* Imported by ordinal */ | 
|---|
| 452 |  | 
|---|
| 453 |  | 
|---|
| 454 | #pragma pack()       /* Restore default alignment */ | 
|---|
| 455 |  | 
|---|
| 456 |  | 
|---|
| 457 | #endif | 
|---|