|
|
1.1 ! root 1: /*static char *SCCSID = "@(#)exe386.h 13.14 90/04/17";*/ ! 2: ! 3: /* ! 4: * Title ! 5: * ! 6: * exe386.h ! 7: * (C) Copyright Microsoft Corp 1988 ! 8: * ! 9: * Description ! 10: * ! 11: * Data structure definitions for the OS/2 ! 12: * executable file format (flat model). ! 13: * ! 14: */ ! 15: ! 16: ! 17: ! 18: /*_________________________________________________________________* ! 19: | | ! 20: | | ! 21: | OS/2 .EXE FILE HEADER DEFINITION - 386 version 0:32 | ! 22: | | ! 23: |_________________________________________________________________| ! 24: * */ ! 25: ! 26: ! 27: #define BITPERWORD 16 ! 28: #define BITPERBYTE 8 ! 29: #define OBJPAGELEN 4096 ! 30: #define E32MAGIC1 'L' /* New magic number "LE" */ ! 31: #define E32MAGIC2 'E' /* New magic number "LE" */ ! 32: #define E32MAGIC 0x454c /* New magic number "LE" */ ! 33: #define E32RESBYTES1 0 /* First bytes reserved */ ! 34: #define E32RESBYTES2 0 /* Second bytes reserved */ ! 35: #define E32RESBYTES3 24 /* Third bytes reserved */ ! 36: #define E32LEBO 0x00 /* Little Endian Byte Order */ ! 37: #define E32BEBO 0x01 /* Big Endian Byte Order */ ! 38: #define E32LEWO 0x00 /* Little Endian Word Order */ ! 39: #define E32BEWO 0x01 /* Big Endian Word Order */ ! 40: #define E32LEVEL 0L /* 32-bit EXE format level */ ! 41: #define E32CPU286 0x001 /* Intel 80286 or upwardly compatibile */ ! 42: #define E32CPU386 0x002 /* Intel 80386 or upwardly compatibile */ ! 43: #define E32CPU486 0x003 /* Intel 80486 or upwardly compatibile */ ! 44: ! 45: ! 46: ! 47: struct e32_exe /* New 32-bit .EXE header */ ! 48: { ! 49: unsigned char e32_magic[2]; /* Magic number E32_MAGIC */ ! 50: unsigned char e32_border; /* The byte ordering for the .EXE */ ! 51: unsigned char e32_worder; /* The word ordering for the .EXE */ ! 52: unsigned long e32_level; /* The EXE format level for now = 0 */ ! 53: unsigned short e32_cpu; /* The CPU type */ ! 54: unsigned short e32_os; /* The OS type */ ! 55: unsigned long e32_ver; /* Module version */ ! 56: unsigned long e32_mflags; /* Module flags */ ! 57: unsigned long e32_mpages; /* Module # pages */ ! 58: unsigned long e32_startobj; /* Object # for instruction pointer */ ! 59: unsigned long e32_eip; /* Extended instruction pointer */ ! 60: unsigned long e32_stackobj; /* Object # for stack pointer */ ! 61: unsigned long e32_esp; /* Extended stack pointer */ ! 62: unsigned long e32_pagesize; /* .EXE page size */ ! 63: unsigned long e32_lastpagesize;/* Last page size in .EXE */ ! 64: unsigned long e32_fixupsize; /* Fixup section size */ ! 65: unsigned long e32_fixupsum; /* Fixup section checksum */ ! 66: unsigned long e32_ldrsize; /* Loader section size */ ! 67: unsigned long e32_ldrsum; /* Loader section checksum */ ! 68: unsigned long e32_objtab; /* Object table offset */ ! 69: unsigned long e32_objcnt; /* Number of objects in module */ ! 70: unsigned long e32_objmap; /* Object page map offset */ ! 71: unsigned long e32_itermap; /* Object iterated data map offset */ ! 72: unsigned long e32_rsrctab; /* Offset of Resource Table */ ! 73: unsigned long e32_rsrccnt; /* Number of resource entries */ ! 74: unsigned long e32_restab; /* Offset of resident name table */ ! 75: unsigned long e32_enttab; /* Offset of Entry Table */ ! 76: unsigned long e32_dirtab; /* Offset of Module Directive Table */ ! 77: unsigned long e32_dircnt; /* Number of module directives */ ! 78: unsigned long e32_fpagetab; /* Offset of Fixup Page Table */ ! 79: unsigned long e32_frectab; /* Offset of Fixup Record Table */ ! 80: unsigned long e32_impmod; /* Offset of Import Module Name Table */ ! 81: unsigned long e32_impmodcnt; /* Number of entries in Import Module Name Table */ ! 82: unsigned long e32_impproc; /* Offset of Import Procedure Name Table */ ! 83: unsigned long e32_pagesum; /* Offset of Per-Page Checksum Table */ ! 84: unsigned long e32_datapage; /* Offset of Enumerated Data Pages */ ! 85: unsigned long e32_preload; /* Number of preload pages */ ! 86: unsigned long e32_nrestab; /* Offset of Non-resident Names Table */ ! 87: unsigned long e32_cbnrestab; /* Size of Non-resident Name Table */ ! 88: unsigned long e32_nressum; /* Non-resident Name Table Checksum */ ! 89: unsigned long e32_autodata; /* Object # for automatic data object */ ! 90: unsigned long e32_debuginfo; /* Offset of the debugging information */ ! 91: unsigned long e32_debuglen; /* The length of the debugging info. in bytes */ ! 92: unsigned long e32_instpreload;/* Number of instance pages in preload section of .EXE file */ ! 93: unsigned long e32_instdemand; /* Number of instance pages in demand load section of .EXE file */ ! 94: unsigned long e32_heapsize; /* Size of heap - for 16-bit apps */ ! 95: unsigned char e32_res3[E32RESBYTES3]; ! 96: /* Pad structure to 196 bytes */ ! 97: }; ! 98: ! 99: ! 100: ! 101: #define E32_MAGIC1(x) (x).e32_magic[0] ! 102: #define E32_MAGIC2(x) (x).e32_magic[1] ! 103: #define E32_BORDER(x) (x).e32_border ! 104: #define E32_WORDER(x) (x).e32_worder ! 105: #define E32_LEVEL(x) (x).e32_level ! 106: #define E32_CPU(x) (x).e32_cpu ! 107: #define E32_OS(x) (x).e32_os ! 108: #define E32_VER(x) (x).e32_ver ! 109: #define E32_MFLAGS(x) (x).e32_mflags ! 110: #define E32_MPAGES(x) (x).e32_mpages ! 111: #define E32_STARTOBJ(x) (x).e32_startobj ! 112: #define E32_EIP(x) (x).e32_eip ! 113: #define E32_STACKOBJ(x) (x).e32_stackobj ! 114: #define E32_ESP(x) (x).e32_esp ! 115: #define E32_PAGESIZE(x) (x).e32_pagesize ! 116: #define E32_LASTPAGESIZE(x) (x).e32_lastpagesize ! 117: #define E32_FIXUPSIZE(x) (x).e32_fixupsize ! 118: #define E32_FIXUPSUM(x) (x).e32_fixupsum ! 119: #define E32_LDRSIZE(x) (x).e32_ldrsize ! 120: #define E32_LDRSUM(x) (x).e32_ldrsum ! 121: #define E32_OBJTAB(x) (x).e32_objtab ! 122: #define E32_OBJCNT(x) (x).e32_objcnt ! 123: #define E32_OBJMAP(x) (x).e32_objmap ! 124: #define E32_ITERMAP(x) (x).e32_itermap ! 125: #define E32_RSRCTAB(x) (x).e32_rsrctab ! 126: #define E32_RSRCCNT(x) (x).e32_rsrccnt ! 127: #define E32_RESTAB(x) (x).e32_restab ! 128: #define E32_ENTTAB(x) (x).e32_enttab ! 129: #define E32_DIRTAB(x) (x).e32_dirtab ! 130: #define E32_DIRCNT(x) (x).e32_dircnt ! 131: #define E32_FPAGETAB(x) (x).e32_fpagetab ! 132: #define E32_FRECTAB(x) (x).e32_frectab ! 133: #define E32_IMPMOD(x) (x).e32_impmod ! 134: #define E32_IMPMODCNT(x) (x).e32_impmodcnt ! 135: #define E32_IMPPROC(x) (x).e32_impproc ! 136: #define E32_PAGESUM(x) (x).e32_pagesum ! 137: #define E32_DATAPAGE(x) (x).e32_datapage ! 138: #define E32_PRELOAD(x) (x).e32_preload ! 139: #define E32_NRESTAB(x) (x).e32_nrestab ! 140: #define E32_CBNRESTAB(x) (x).e32_cbnrestab ! 141: #define E32_NRESSUM(x) (x).e32_nressum ! 142: #define E32_AUTODATA(x) (x).e32_autodata ! 143: #define E32_DEBUGINFO(x) (x).e32_debuginfo ! 144: #define E32_DEBUGLEN(x) (x).e32_debuglen ! 145: #define E32_INSTPRELOAD(x) (x).e32_instpreload ! 146: #define E32_INSTDEMAND(x) (x).e32_instdemand ! 147: #define E32_HEAPSIZE(x) (x).e32_heapsize ! 148: ! 149: ! 150: ! 151: /* ! 152: * Format of E32_MFLAGS(x): ! 153: * ! 154: * Low word has the following format: ! 155: * ! 156: * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no ! 157: * | | | | | | | | ! 158: * | | | | | | | +------- Per-Process Library Initialization ! 159: * | | | | | | +----------- No Internal Fixups for Module in .EXE ! 160: * | | | | | +------------- No External Fixups for Module in .EXE ! 161: * | | | | +------------------- Incompatible with PM Windowing ! 162: * | | | +--------------------- Compatible with PM Windowing ! 163: * | | +----------------------- Uses PM Windowing API ! 164: * | +-------------------------------- Module not Loadable ! 165: * +-------------------------------------- Library Module ! 166: */ ! 167: ! 168: ! 169: #define E32NOTP 0x8000L /* Library Module - used as NENOTP */ ! 170: #define E32NOLOAD 0x2000L /* Module not Loadable */ ! 171: #define E32PMAPI 0x0300L /* Uses PM Windowing API */ ! 172: #define E32PMW 0x0200L /* Compatible with PM Windowing */ ! 173: #define E32NOPMW 0x0100L /* Incompatible with PM Windowing */ ! 174: #define E32NOEXTFIX 0x0020L /* NO External Fixups in .EXE */ ! 175: #define E32NOINTFIX 0x0010L /* NO Internal Fixups in .EXE */ ! 176: #define E32LIBINIT 0x0004L /* Per-Process Library Initialization */ ! 177: #define E32APPMASK 0x0700L /* Aplication Type Mask */ ! 178: ! 179: ! 180: /* ! 181: * Format of E32_MFLAGS(x): ! 182: * ! 183: * High word has the following format: ! 184: * ! 185: * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no ! 186: * | | ! 187: * | +--- Protected memory library module ! 188: * +----- Device driver ! 189: */ ! 190: ! 191: #define E32PROTDLL 0x10000L // Protected memory library module ! 192: #define E32DEVICE 0x20000L // Device driver ! 193: #define E32MODEXE 0x00000L // .EXE module ! 194: #define E32MODDLL 0x08000L // .DLL module ! 195: #define E32MODPROTDLL 0x18000L // Protected memory library module ! 196: #define E32MODPDEV 0x20000L // Physical device driver ! 197: #define E32MODVDEV 0x28000L // Virtual device driver ! 198: #define E32MODMASK 0x38000L // Module type mask ! 199: ! 200: /* ! 201: * RELOCATION DEFINITIONS - RUN-TIME FIXUPS ! 202: */ ! 203: ! 204: ! 205: #pragma pack(1) /* This data must be packed */ ! 206: ! 207: ! 208: typedef union _offset ! 209: { ! 210: unsigned short offset16; ! 211: unsigned long offset32; ! 212: } ! 213: offset; /* 16-bit or 32-bit offset */ ! 214: ! 215: ! 216: /***ET+ r32_rlc - Relocation item */ ! 217: ! 218: struct r32_rlc /* Relocation item */ ! 219: { ! 220: unsigned char nr_stype; /* Source type - field shared with new_rlc */ ! 221: unsigned char nr_flags; /* Flag byte - field shared with new_rlc */ ! 222: short r32_soff; /* Source offset */ ! 223: unsigned short r32_objmod; /* Target object number or Module ordinal */ ! 224: ! 225: union targetid ! 226: { ! 227: offset intref; /* Internal fixup */ ! 228: ! 229: union extfixup ! 230: { ! 231: offset proc; /* Procedure name offset */ ! 232: unsigned long ord; /* Procedure odrinal */ ! 233: } ! 234: extref; /* External fixup */ ! 235: ! 236: struct addfixup ! 237: { ! 238: unsigned short entry; /* Entry ordinal */ ! 239: offset addval; /* Value added to the address */ ! 240: } ! 241: addfix; /* Additive fixup */ ! 242: } ! 243: r32_target; /* Target data */ ! 244: unsigned short r32_srccount; /* Number of chained fixup records */ ! 245: unsigned short r32_chain; /* Chain head */ ! 246: }; ! 247: ! 248: ! 249: #pragma pack() /* Stop packing */ ! 250: ! 251: ! 252: /* ! 253: * In 32-bit .EXE file run-time relocations are written as varying size ! 254: * records, so we need many size definitions. ! 255: */ ! 256: ! 257: #define RINTSIZE16 8 ! 258: #define RINTSIZE32 10 ! 259: #define RORDSIZE 8 ! 260: #define RNAMSIZE16 8 ! 261: #define RNAMSIZE32 10 ! 262: #define RADDSIZE16 10 ! 263: #define RADDSIZE32 12 ! 264: ! 265: ! 266: ! 267: #if FALSE ! 268: /* ! 269: * Access macros defined in NEWEXE.H !!! ! 270: */ ! 271: #define NR_STYPE(x) (x).nr_stype ! 272: #define NR_FLAGS(x) (x).nr_flags ! 273: #endif ! 274: ! 275: #define R32_SOFF(x) (x).r32_soff ! 276: #define R32_OBJNO(x) (x).r32_objmod ! 277: #define R32_MODORD(x) (x).r32_objmod ! 278: #define R32_OFFSET16(x) (x).r32_target.intref.offset16 ! 279: #define R32_OFFSET32(x) (x).r32_target.intref.offset32 ! 280: #define R32_PROCOFF16(x) (x).r32_target.extref.proc.offset16 ! 281: #define R32_PROCOFF32(x) (x).r32_target.extref.proc.offset32 ! 282: #define R32_PROCORD(x) (x).r32_target.extref.ord ! 283: #define R32_ENTRY(x) (x).r32_target.addfix.entry ! 284: #define R32_ADDVAL16(x) (x).r32_target.addfix.addval.offset16 ! 285: #define R32_ADDVAL32(x) (x).r32_target.addfix.addval.offset32 ! 286: #define R32_SRCCNT(x) (x).r32_srccount ! 287: #define R32_CHAIN(x) (x).r32_chain ! 288: ! 289: ! 290: ! 291: /* ! 292: * Format of NR_STYPE(x) ! 293: * ! 294: * 7 6 5 4 3 2 1 0 - bit no ! 295: * | | | | | | ! 296: * | | +-+-+-+--- Source type ! 297: * | +----------- Fixup to 16:16 alias ! 298: * +------------- List of source offset follows fixup record ! 299: */ ! 300: ! 301: #if FALSE ! 302: ! 303: /* DEFINED in newexe.h !!! */ ! 304: ! 305: #define NRSTYP 0x0f /* Source type mask */ ! 306: #define NRSBYT 0x00 /* lo byte (8-bits)*/ ! 307: #define NRSSEG 0x02 /* 16-bit segment (16-bits) */ ! 308: #define NRSPTR 0x03 /* 16:16 pointer (32-bits) */ ! 309: #define NRSOFF 0x05 /* 16-bit offset (16-bits) */ ! 310: #define NRPTR48 0x06 /* 16:32 pointer (48-bits) */ ! 311: #define NROFF32 0x07 /* 32-bit offset (32-bits) */ ! 312: #define NRSOFF32 0x08 /* 32-bit self-relative offset (32-bits) */ ! 313: #endif ! 314: ! 315: ! 316: #define NRSRCMASK 0x0f /* Source type mask */ ! 317: #define NRALIAS 0x10 /* Fixup to alias */ ! 318: #define NRCHAIN 0x20 /* List of source offset follows */ ! 319: /* fixup record, source offset field */ ! 320: /* in fixup record contains number */ ! 321: /* of elements in list */ ! 322: ! 323: /* ! 324: * Format of NR_FLAGS(x) and R32_FLAGS(x): ! 325: * ! 326: * 7 6 5 4 3 2 1 0 - bit no ! 327: * | | | | | | | ! 328: * | | | | | +-+--- Reference type ! 329: * | | | | +------- Additive fixup ! 330: * | | | +----------- 32-bit Target Offset Flag (1 - 32-bit; 0 - 16-bit) ! 331: * | | +------------- 32-bit Additive Flag (1 - 32-bit; 0 - 16-bit) ! 332: * | +--------------- 16-bit Object/Module ordinal (1 - 16-bit; 0 - 8-bit) ! 333: * +----------------- 8-bit import ordinal (1 - 8-bit; ! 334: * 0 - NR32BITOFF toggles ! 335: * between 16 and 32 bit ! 336: * ordinal) ! 337: */ ! 338: ! 339: #if FALSE ! 340: ! 341: /* DEFINED in newexe.h !!! */ ! 342: ! 343: #define NRADD 0x04 /* Additive fixup */ ! 344: #define NRRTYP 0x03 /* Reference type mask */ ! 345: #define NRRINT 0x00 /* Internal reference */ ! 346: #define NRRORD 0x01 /* Import by ordinal */ ! 347: #define NRRNAM 0x02 /* Import by name */ ! 348: #endif ! 349: ! 350: #define NRRENT 0x03 /* Internal entry table fixup */ ! 351: ! 352: #define NR32BITOFF 0x10 /* 32-bit Target Offset */ ! 353: #define NR32BITADD 0x20 /* 32-bit Additive fixup */ ! 354: #define NR16OBJMOD 0x40 /* 16-bit Object/Module ordinal */ ! 355: #define NR8BITORD 0x80 /* 8-bit import ordinal */ ! 356: /*end*/ ! 357: ! 358: /* ! 359: * Data structures for storing run-time fixups in linker virtual memory. ! 360: * ! 361: * Each object has a list of Object Page Directories which specify ! 362: * fixups for given page. Each page has its own hash table which is ! 363: * used to detect fixups to the same target. ! 364: */ ! 365: ! 366: #define PAGEPERDIR 62 ! 367: #define LG2DIR 7 ! 368: ! 369: ! 370: typedef struct _OBJPAGEDIR ! 371: { ! 372: DWORD next; /* Virtual pointer to next dir on list */ ! 373: WORD ht[PAGEPERDIR]; /* Pointers to individual hash tables */ ! 374: } ! 375: OBJPAGEDIR; ! 376: ! 377: ! 378: ! 379: /* ! 380: * OBJECT TABLE ! 381: */ ! 382: ! 383: /***ET+ o32_obj Object Table Entry */ ! 384: ! 385: struct o32_obj /* Flat .EXE object table entry */ ! 386: { ! 387: unsigned long o32_size; /* Object virtual size */ ! 388: unsigned long o32_base; /* Object base virtual address */ ! 389: unsigned long o32_flags; /* Attribute flags */ ! 390: unsigned long o32_pagemap; /* Object page map index */ ! 391: unsigned long o32_mapsize; /* Number of entries in object page map */ ! 392: unsigned long o32_reserved; /* Reserved */ ! 393: }; ! 394: ! 395: ! 396: #define O32_SIZE(x) (x).o32_size ! 397: #define O32_BASE(x) (x).o32_base ! 398: #define O32_FLAGS(x) (x).o32_flags ! 399: #define O32_PAGEMAP(x) (x).o32_pagemap ! 400: #define O32_MAPSIZE(x) (x).o32_mapsize ! 401: #define O32_RESERVED(x) (x).o32_reserved ! 402: ! 403: ! 404: ! 405: /* ! 406: * Format of O32_FLAGS(x) ! 407: * ! 408: * High word of dword flag field is not used for now. ! 409: * Low word has the following format: ! 410: * ! 411: * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no ! 412: * | | | | | | | | | | | | | | | ! 413: * | | | | | | | | | | | | | | +--- Readable Object ! 414: * | | | | | | | | | | | | | +----- Writeable Object ! 415: * | | | | | | | | | | | | +------- Executable Object ! 416: * | | | | | | | | | | | +--------- Resource Object ! 417: * | | | | | | | | | | +----------- Object is Discardable ! 418: * | | | | | | | | | +------------- Object is Shared ! 419: * | | | | | | | | +--------------- Object has preload pages ! 420: * | | | | | | | +----------------- Object has invalid pages ! 421: * | | | | | | +------------------- Object is permanent and swappable ! 422: * | | | | | +--------------------- Object is permanent and resident ! 423: * | | | | +----------------------- Object is permanent and long lockable ! 424: * | | | +----------------------------- 16:16 alias required (80x86 specific) ! 425: * | | +-------------------------------- Big/Default bit setting (80x86 specific) ! 426: * | +----------------------------------- Object is conforming for code (80x86 specific) ! 427: * +-------------------------------------- Object I/O privilege level (80x86 specific) ! 428: * ! 429: */ ! 430: ! 431: #define OBJREAD 0x0001L /* Readable Object */ ! 432: #define OBJWRITE 0x0002L /* Writeable Object */ ! 433: #define OBJRSRC 0x0008L /* Resource Object */ ! 434: #define OBJINVALID 0x0080L /* Object has invalid pages */ ! 435: #define OBJNONPERM 0x0000L /* Object is nonpermanent */ ! 436: #define OBJPERM 0x0100L /* Object is permanent and swappable */ ! 437: #define OBJRESIDENT 0x0200L /* Object is permanent and resident */ ! 438: #define OBJCONTIG 0x0300L /* Object is resident and contiguous */ ! 439: #define OBJDYNAMIC 0x0400L /* Object is permanent and long locable */ ! 440: #define OBJTYPEMASK 0x0700L /* Object type mask */ ! 441: #define OBJALIAS16 0x1000L /* 16:16 alias required (80x86 specific) */ ! 442: #define OBJBIGDEF 0x2000L /* Big/Default bit setting (80x86 specific) */ ! 443: #define OBJIOPL 0x8000L /* Object I/O privilege level (80x86 specific) */ ! 444: #if FOR_EXEHDR ! 445: /* ! 446: * Name these flags differently for EXEHDR.EXE - avoid conflicts with 286 version ! 447: */ ! 448: #define OBJDISCARD 0x0010L /* Object is Discardable */ ! 449: #define OBJSHARED 0x0020L /* Object is Shared */ ! 450: #define OBJPRELOAD 0x0040L /* Object has preload pages */ ! 451: #define OBJEXEC 0x0004L /* Executable Object */ ! 452: #define OBJCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */ ! 453: #else ! 454: /* ! 455: * Life will be easier, if we keep the same names for the following flags: ! 456: */ ! 457: #define NSDISCARD 0x0010L /* Object is Discardable */ ! 458: #define NSMOVE NSDISCARD /* Moveable object is for sure Discardable */ ! 459: #define NSSHARED 0x0020L /* Object is Shared */ ! 460: #define NSPRELOAD 0x0040L /* Object has preload pages */ ! 461: #define NSEXRD 0x0004L /* Executable Object */ ! 462: #define NSCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */ ! 463: #endif ! 464: /*end*/ ! 465: ! 466: /***ET+ o32_map - Object Page Map entry */ ! 467: ! 468: struct o32_map /* Object Page Map entry */ ! 469: { ! 470: unsigned char o32_pageidx[3]; /* 24-bit page # in .EXE file */ ! 471: unsigned char o32_pageflags; /* Per-Page attributes */ ! 472: }; ! 473: ! 474: ! 475: #define GETPAGEIDX(x) ((((unsigned long)((x).o32_pageidx[0])) << BITPERWORD) + \ ! 476: (((x).o32_pageidx[1]) << BITPERBYTE) + \ ! 477: (x).o32_pageidx[2]) ! 478: ! 479: #define PUTPAGEIDX(x,i) ((x).o32_pageidx[0] = (unsigned char) ((unsigned long)(i) >> BITPERWORD), \ ! 480: (x).o32_pageidx[1] = (unsigned char) ((i) >> BITPERBYTE), \ ! 481: (x).o32_pageidx[2] = (unsigned char) ((i) & 0xff)) ! 482: ! 483: #define PAGEFLAGS(x) (x).o32_pageflags ! 484: ! 485: ! 486: #define VALID 0x00 /* Valid Physical Page in .EXE */ ! 487: #define ITERDATA 0x01 /* Iterated Data Page */ ! 488: #define INVALID 0x02 /* Invalid Page */ ! 489: #define ZEROED 0x03 /* Zero Filled Page */ ! 490: #define RANGE 0x04 /* Range of pages */ ! 491: /*end*/ ! 492: ! 493: /* ! 494: * RESOURCE TABLE ! 495: */ ! 496: ! 497: /***ET+ rsrc32 - Resource Table Entry */ ! 498: ! 499: struct rsrc32 /* Resource Table Entry */ ! 500: { ! 501: unsigned short type; /* Resource type */ ! 502: unsigned short name; /* Resource name */ ! 503: unsigned long cb; /* Resource size */ ! 504: unsigned short obj; /* Object number */ ! 505: unsigned long offset; /* Offset within object */ ! 506: }; ! 507: /*end*/ ! 508: ! 509: ! 510: #pragma pack(1) /* This data must be packed */ ! 511: ! 512: /* ! 513: * ENTRY TABLE DEFINITIONS ! 514: */ ! 515: ! 516: /***ET+ b32_bundle - Entry Table */ ! 517: ! 518: struct b32_bundle ! 519: { ! 520: unsigned char b32_cnt; /* Number of entries in this bundle */ ! 521: unsigned char b32_type; /* Bundle type */ ! 522: unsigned short b32_obj; /* Object number */ ! 523: }; /* Follows entry types */ ! 524: ! 525: struct e32_entry ! 526: { ! 527: unsigned char e32_flags; /* Entry point flags */ ! 528: union entrykind ! 529: { ! 530: offset e32_offset; /* 16-bit/32-bit offset entry */ ! 531: struct callgate ! 532: { ! 533: unsigned short offset; /* Offset in segment */ ! 534: unsigned short callgate; /* Callgate selector */ ! 535: } ! 536: e32_callgate; /* 286 (16-bit) call gate */ ! 537: struct fwd ! 538: { ! 539: unsigned short modord; /* Module ordinal number */ ! 540: unsigned long value; /* Proc name offset or ordinal */ ! 541: } ! 542: e32_fwd; /* Forwarder */ ! 543: } ! 544: e32_variant; /* Entry variant */ ! 545: }; ! 546: ! 547: #pragma pack() /* Stop packing */ ! 548: ! 549: ! 550: #define B32_CNT(x) (x).b32_cnt ! 551: #define B32_TYPE(x) (x).b32_type ! 552: #define B32_OBJ(x) (x).b32_obj ! 553: ! 554: #define E32_EFLAGS(x) (x).e32_flags ! 555: #define E32_OFFSET16(x) (x).e32_variant.e32_offset.offset16 ! 556: #define E32_OFFSET32(x) (x).e32_variant.e32_offset.offset32 ! 557: #define E32_GATEOFF(x) (x).e32_variant.e32_callgate.offset ! 558: #define E32_GATE(x) (x).e32_variant.e32_callgate.callgate ! 559: #define E32_MODORD(x) (x).e32_variant.e32_fwd.modord ! 560: #define E32_VALUE(x) (x).e32_variant.e32_fwd.value ! 561: ! 562: #define FIXENT16 3 ! 563: #define FIXENT32 5 ! 564: #define GATEENT16 5 ! 565: #define FWDENT 7 ! 566: ! 567: /* ! 568: * BUNDLE TYPES ! 569: */ ! 570: ! 571: #define EMPTY 0x00 /* Empty bundle */ ! 572: #define ENTRY16 0x01 /* 16-bit offset entry point */ ! 573: #define GATE16 0x02 /* 286 call gate (16-bit IOPL) */ ! 574: #define ENTRY32 0x03 /* 32-bit offset entry point */ ! 575: #define ENTRYFWD 0x04 /* Forwarder entry point */ ! 576: #define TYPEINFO 0x80 /* Typing information present flag */ ! 577: ! 578: ! 579: /* ! 580: * Format for E32_EFLAGS(x) ! 581: * ! 582: * 7 6 5 4 3 2 1 0 - bit no ! 583: * | | | | | | | | ! 584: * | | | | | | | +--- exported entry ! 585: * | | | | | | +----- uses shared data ! 586: * +-+-+-+-+-+------- parameter word count ! 587: */ ! 588: ! 589: #define E32EXPORT 0x01 /* Exported entry */ ! 590: #define E32SHARED 0x02 /* Uses shared data */ ! 591: #define E32PARAMS 0xf8 /* Parameter word count mask */ ! 592: ! 593: /* ! 594: * Flags for forwarders only: ! 595: */ ! 596: ! 597: #define FWD_ORDINAL 0x01 /* Imported by ordinal */ ! 598: /*end*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.