Annotation of os232sdk/toolkt20/c/os2h/exe386.h, revision 1.1.1.1

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*/

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.