Annotation of pmsdk/include/newexe.h, revision 1.1.1.1

1.1       root        1: /* SCCSID = @(#)newexe.h       1.1 87/11/16 */
                      2: /*
                      3:  *  Title
                      4:  *
                      5:  *     newexe.h
                      6:  *     Pete Stewart
                      7:  *     (C) Copyright Microsoft Corp 1984-1987
                      8:  *     17 August 1984
                      9:  *
                     10:  *  Description
                     11:  *
                     12:  *     Data structure definitions for the DOS 4.0/Windows 2.0
                     13:  *     executable file format.
                     14:  *
                     15:  *  Modification History
                     16:  *
                     17:  *     84/08/17        Pete Stewart    Initial version
                     18:  *     84/10/17        Pete Stewart    Changed some constants to match OMF
                     19:  *     84/10/23        Pete Stewart    Updates to match .EXE format revision
                     20:  *     84/11/20        Pete Stewart    Substantial .EXE format revision
                     21:  *     85/01/09        Pete Stewart    Added constants ENEWEXE and ENEWHDR
                     22:  *     85/01/10        Steve Wood      Added resource definitions
                     23:  *     85/03/04        Vic Heller      Reconciled Windows and DOS 4.0 versions
                     24:  *     85/03/07        Pete Stewart    Added movable entry count
                     25:  *     85/04/01        Pete Stewart    Segment alignment field, error bit
                     26:  *     85/10/03        Reuben Borman   Removed segment discard priority
                     27:  *     85/10/11        Vic Heller      Added PIF header fields
                     28:  *     86/03/10        Reuben Borman   Changes for DOS 5.0
                     29:  *     86/09/02        Reuben Borman   NSPURE ==> NSSHARED
                     30:  *     87/05/04        Reuben Borman   Added ne_cres and NSCONFORM
                     31:  *     87/07/08        Reuben Borman   Added NEAPPTYPE definitions
                     32:  *     87/09/08        Reuben Borman   Added NEBOUND
                     33:  *     87/10/28        Wieslaw Kalkus  Added ne_exetyp
                     34:  */
                     35: 
                     36: #define EMAGIC         0x5A4D          /* Old magic number */
                     37: #define        ENEWEXE         sizeof(struct exe_hdr)
                     38:                                        /* Value of E_LFARLC for new .EXEs */
                     39: #define        ENEWHDR         0x003C          /* Offset in old hdr. of ptr. to new */
                     40: #define        ERESWDS         0x0010          /* No. of reserved words (OLD) */
                     41: #define        ERES1WDS        0x0004          /* No. of reserved words in e_res */
                     42: #define        ERES2WDS        0x000A          /* No. of reserved words in e_res2 */
                     43: #define        ECP             0x0004          /* Offset in struct of E_CP */
                     44: #define        ECBLP           0x0002          /* Offset in struct of E_CBLP */
                     45: #define        EMINALLOC       0x000A          /* Offset in struct of E_MINALLOC */
                     46: 
                     47: struct exe_hdr                         /* DOS 1, 2, 3 .EXE header */
                     48:   {
                     49:     unsigned short     e_magic;        /* Magic number */
                     50:     unsigned short     e_cblp;         /* Bytes on last page of file */
                     51:     unsigned short     e_cp;           /* Pages in file */
                     52:     unsigned short     e_crlc;         /* Relocations */
                     53:     unsigned short     e_cparhdr;      /* Size of header in paragraphs */
                     54:     unsigned short     e_minalloc;     /* Minimum extra paragraphs needed */
                     55:     unsigned short     e_maxalloc;     /* Maximum extra paragraphs needed */
                     56:     unsigned short     e_ss;           /* Initial (relative) SS value */
                     57:     unsigned short     e_sp;           /* Initial SP value */
                     58:     unsigned short     e_csum;         /* Checksum */
                     59:     unsigned short     e_ip;           /* Initial IP value */
                     60:     unsigned short     e_cs;           /* Initial (relative) CS value */
                     61:     unsigned short     e_lfarlc;       /* File address of relocation table */
                     62:     unsigned short     e_ovno;         /* Overlay number */
                     63:     unsigned short     e_res[ERES1WDS];/* Reserved words */
                     64:     unsigned short     e_oemid;        /* OEM identifier (for e_oeminfo) */
                     65:     unsigned short     e_oeminfo;      /* OEM information; e_oemid specific */
                     66:     unsigned short     e_res2[ERES2WDS];/* Reserved words */
                     67:     long               e_lfanew;       /* File address of new exe header */
                     68:   };
                     69: 
                     70: #define E_MAGIC(x)     (x).e_magic
                     71: #define E_CBLP(x)      (x).e_cblp
                     72: #define E_CP(x)                (x).e_cp
                     73: #define E_CRLC(x)      (x).e_crlc
                     74: #define E_CPARHDR(x)   (x).e_cparhdr
                     75: #define E_MINALLOC(x)  (x).e_minalloc
                     76: #define E_MAXALLOC(x)  (x).e_maxalloc
                     77: #define E_SS(x)                (x).e_ss
                     78: #define E_SP(x)                (x).e_sp
                     79: #define E_CSUM(x)      (x).e_csum
                     80: #define E_IP(x)                (x).e_ip
                     81: #define E_CS(x)                (x).e_cs
                     82: #define E_LFARLC(x)    (x).e_lfarlc
                     83: #define E_OVNO(x)      (x).e_ovno
                     84: #define        E_RES(x)        (x).e_res
                     85: #define E_OEMID(x)     (x).e_oemid
                     86: #define E_OEMINFO(x)   (x).e_oeminfo
                     87: #define E_RES2(x)      (x).e_res2
                     88: #define        E_LFANEW(x)     (x).e_lfanew
                     89: 
                     90: #define NEMAGIC                0x454E          /* New magic number */
                     91: #define NERESBYTES     9               /* Nine bytes reserved (now) */
                     92: #define NECRC          8               /* Offset into new header of NE_CRC */
                     93: 
                     94: struct new_exe                         /* New .EXE header */
                     95:   {
                     96:     unsigned short     ne_magic;       /* Magic number NE_MAGIC */
                     97:     unsigned char      ne_ver;         /* Version number */
                     98:     unsigned char      ne_rev;         /* Revision number */
                     99:     unsigned short     ne_enttab;      /* Offset of Entry Table */
                    100:     unsigned short     ne_cbenttab;    /* Number of bytes in Entry Table */
                    101:     long               ne_crc;         /* Checksum of whole file */
                    102:     unsigned short     ne_flags;       /* Flag word */
                    103:     unsigned short     ne_autodata;    /* Automatic data segment number */
                    104:     unsigned short     ne_heap;        /* Initial heap allocation */
                    105:     unsigned short     ne_stack;       /* Initial stack allocation */
                    106:     long               ne_csip;        /* Initial CS:IP setting */
                    107:     long               ne_sssp;        /* Initial SS:SP setting */
                    108:     unsigned short     ne_cseg;        /* Count of file segments */
                    109:     unsigned short     ne_cmod;        /* Entries in Module Reference Table */
                    110:     unsigned short     ne_cbnrestab;   /* Size of non-resident name table */
                    111:     unsigned short     ne_segtab;      /* Offset of Segment Table */
                    112:     unsigned short     ne_rsrctab;     /* Offset of Resource Table */
                    113:     unsigned short     ne_restab;      /* Offset of resident name table */
                    114:     unsigned short     ne_modtab;      /* Offset of Module Reference Table */
                    115:     unsigned short     ne_imptab;      /* Offset of Imported Names Table */
                    116:     long               ne_nrestab;     /* Offset of Non-resident Names Table */
                    117:     unsigned short     ne_cmovent;     /* Count of movable entries */
                    118:     unsigned short     ne_align;       /* Segment alignment shift count */
                    119:     unsigned short     ne_cres;        /* Count of resource entries */
                    120:     unsigned char      ne_exetyp;      /* Target operating system */
                    121:     char               ne_res[NERESBYTES];
                    122:                                        /* Pad structure to 64 bytes */
                    123:   };
                    124: 
                    125: #define NE_MAGIC(x)    (x).ne_magic
                    126: #define NE_VER(x)      (x).ne_ver
                    127: #define NE_REV(x)      (x).ne_rev
                    128: #define NE_ENTTAB(x)   (x).ne_enttab
                    129: #define NE_CBENTTAB(x) (x).ne_cbenttab
                    130: #define NE_CRC(x)      (x).ne_crc
                    131: #define NE_FLAGS(x)    (x).ne_flags
                    132: #define NE_AUTODATA(x) (x).ne_autodata
                    133: #define NE_HEAP(x)     (x).ne_heap
                    134: #define NE_STACK(x)    (x).ne_stack
                    135: #define NE_CSIP(x)     (x).ne_csip
                    136: #define NE_SSSP(x)     (x).ne_sssp
                    137: #define NE_CSEG(x)     (x).ne_cseg
                    138: #define NE_CMOD(x)     (x).ne_cmod
                    139: #define NE_CBNRESTAB(x) (x).ne_cbnrestab
                    140: #define NE_SEGTAB(x)   (x).ne_segtab
                    141: #define NE_RSRCTAB(x)  (x).ne_rsrctab
                    142: #define NE_RESTAB(x)   (x).ne_restab
                    143: #define NE_MODTAB(x)   (x).ne_modtab
                    144: #define NE_IMPTAB(x)   (x).ne_imptab
                    145: #define NE_NRESTAB(x)  (x).ne_nrestab
                    146: #define        NE_CMOVENT(x)   (x).ne_cmovent
                    147: #define        NE_ALIGN(x)     (x).ne_align
                    148: #define NE_CRES(x)     (x).ne_cres
                    149: #define        NE_RES(x)       (x).ne_res
                    150: #define NE_EXETYP(x)   (x).ne_exetyp
                    151: 
                    152: #define NE_USAGE(x)    (WORD)*((WORD *)(x)+1)
                    153: #define NE_PNEXTEXE(x) (WORD)(x).ne_cbenttab
                    154: #define NE_ONEWEXE(x)  (WORD)(x).ne_crc
                    155: #define NE_PFILEINFO(x) (WORD)((DWORD)(x).ne_crc >> 16)
                    156: 
                    157: 
                    158: /*
                    159:  *  Target operating systems
                    160:  */
                    161: 
                    162: #define NE_UNKNOWN     0x0             /* Unknown (any "new-format" OS) */
                    163: #define NE_OS2         0x1             /* Microsoft/IBM OS/2 (default)  */
                    164: #define NE_WINDOWS     0x2             /* Microsoft Windows */
                    165: #define NE_DOS4                0x3             /* Microsoft MS-DOS 4.x */
                    166: 
                    167: 
                    168: 
                    169: /*
                    170:  *  Format of NE_FLAGS(x):
                    171:  *
                    172:  *  p                                  Not-a-process
                    173:  *   x                                 Unused
                    174:  *    e                                        Errors in image
                    175:  *     x                               Unused
                    176:  *     b                               Bound as family app
                    177:  *      ttt                            Application type
                    178:  *         f                           Floating-point instructions
                    179:  *          3                          386 instructions
                    180:  *           2                         286 instructions
                    181:  *            0                        8086 instructions
                    182:  *             P                       Protected mode only
                    183:  *              p                      Per-process library initialization
                    184:  *               i                     Instance data
                    185:  *                s                    Solo data
                    186:  */
                    187: #define NENOTP         0x8000          /* Not a process */
                    188: #define        NEIERR          0x2000          /* Errors in image */
                    189: #define NEBOUND                0x0800          /* Bound as family app */
                    190: #define NEAPPTYP       0x0700          /* Application type mask */
                    191: #define NENOTWINCOMPAT 0x0100          /* Not compatible with P.M. Windowing */
                    192: #define NEWINCOMPAT    0x0200          /* Compatible with P.M. Windowing */
                    193: #define NEWINAPI       0x0300          /* Uses P.M. Windowing API */
                    194: #define NEFLTP         0x0080          /* Floating-point instructions */
                    195: #define NEI386         0x0040          /* 386 instructions */
                    196: #define NEI286         0x0020          /* 286 instructions */
                    197: #define NEI086         0x0010          /* 8086 instructions */
                    198: #define NEPROT         0x0008          /* Runs in protected mode only */
                    199: #define NEPPLI         0x0004          /* Per-Process Library Initialization */
                    200: #define NEINST         0x0002          /* Instance data */
                    201: #define NESOLO         0x0001          /* Solo data */
                    202: 
                    203: 
                    204: struct new_seg                         /* New .EXE segment table entry */
                    205:   {
                    206:     unsigned short     ns_sector;      /* File sector of start of segment */
                    207:     unsigned short     ns_cbseg;       /* Number of bytes in file */
                    208:     unsigned short     ns_flags;       /* Attribute flags */
                    209:     unsigned short     ns_minalloc;    /* Minimum allocation in bytes */
                    210:   };
                    211: 
                    212: #define NS_SECTOR(x)   (x).ns_sector
                    213: #define NS_CBSEG(x)    (x).ns_cbseg
                    214: #define NS_FLAGS(x)    (x).ns_flags
                    215: #define NS_MINALLOC(x) (x).ns_minalloc
                    216: 
                    217: /*
                    218:  *  Format of NS_FLAGS(x):
                    219:  *
                    220:  *  x                          Unused
                    221:  *   h                         Huge segment
                    222:  *    c                                32-bit code segment
                    223:  *     d                       Discardable segment
                    224:  *     DD                      I/O privilege level (286 DPL bits)
                    225:  *       c                     Conforming segment
                    226:  *        r                    Segment has relocations
                    227:  *         e                   Execute/read only
                    228:  *          p                  Preload segment
                    229:  *           P                 Pure segment
                    230:  *            m                Movable segment
                    231:  *             i               Iterated segment
                    232:  *              ttt            Segment type
                    233:  */
                    234: #define NSTYPE         0x0007          /* Segment type mask */
                    235: #define NSCODE         0x0000          /* Code segment */
                    236: #define NSDATA         0x0001          /* Data segment */
                    237: #define NSITER         0x0008          /* Iterated segment flag */
                    238: #define NSMOVE         0x0010          /* Movable segment flag */
                    239: #define NSSHARED       0x0020          /* Shared segment flag */
                    240: #define NSPRELOAD      0x0040          /* Preload segment flag */
                    241: #define NSEXRD         0x0080          /* Execute-only (code segment), or
                    242:                                        *  read-only (data segment)
                    243:                                        */
                    244: #define NSRELOC                0x0100          /* Segment has relocations */
                    245: #define NSCONFORM      0x0200          /* Conforming segment */
                    246: #define NSDPL          0x0C00          /* I/O privilege level (286 DPL bits) */
                    247: #define SHIFTDPL       10              /* Left shift count for SEGDPL field */
                    248: #define NSDISCARD      0x1000          /* Segment is discardable */
                    249: #define NS32BIT                0x2000          /* 32-bit code segment */
                    250: #define NSHUGE         0x4000          /* Huge memory segment, length of
                    251:                                         * segment and minimum allocation
                    252:                                         * size are in segment sector units
                    253:                                         */
                    254: #define NSPURE         NSSHARED        /* For compatibility */
                    255: 
                    256: #define NSALIGN        9       /* Segment data aligned on 512 byte boundaries */
                    257: 
                    258: #define NSLOADED    0x0004     /* ns_sector field contains memory addr */
                    259: 
                    260: struct new_segdata                     /* Segment data */
                    261:   {
                    262:     union
                    263:       {
                    264:        struct
                    265:          {
                    266:            unsigned short      ns_niter;       /* number of iterations */
                    267:            unsigned short      ns_nbytes;      /* number of bytes */
                    268:            char                ns_iterdata;    /* iterated data bytes */
                    269:          } ns_iter;
                    270:        struct
                    271:          {
                    272:            char                ns_data;        /* data bytes */
                    273:          } ns_noniter;
                    274:       } ns_union;
                    275:   };
                    276: 
                    277: struct new_rlcinfo                     /* Relocation info */
                    278:   {
                    279:     unsigned short     nr_nreloc;      /* number of relocation items that */
                    280:   };                                   /* follow */
                    281: 
                    282: struct new_rlc                         /* Relocation item */
                    283:   {
                    284:     char               nr_stype;       /* Source type */
                    285:     char               nr_flags;       /* Flag byte */
                    286:     unsigned short     nr_soff;        /* Source offset */
                    287:     union
                    288:       {
                    289:        struct
                    290:          {
                    291:            char        nr_segno;       /* Target segment number */
                    292:            char        nr_res;         /* Reserved */
                    293:            unsigned short nr_entry;    /* Target Entry Table offset */
                    294:          }             nr_intref;      /* Internal reference */
                    295:        struct
                    296:          {
                    297:            unsigned short nr_mod;      /* Index into Module Reference Table */
                    298:            unsigned short nr_proc;     /* Procedure ordinal or name offset */
                    299:          }             nr_import;      /* Import */
                    300:        struct
                    301:          {
                    302:            unsigned short nr_ostype;   /* OSFIXUP type */
                    303:            unsigned short nr_osres;    /* reserved */
                    304:          }             nr_osfix;       /* Operating system fixup */
                    305:       }                        nr_union;       /* Union */
                    306:   };
                    307: 
                    308: #define NR_STYPE(x)    (x).nr_stype
                    309: #define NR_FLAGS(x)    (x).nr_flags
                    310: #define NR_SOFF(x)     (x).nr_soff
                    311: #define NR_SEGNO(x)    (x).nr_union.nr_intref.nr_segno
                    312: #define NR_RES(x)      (x).nr_union.nr_intref.nr_res
                    313: #define NR_ENTRY(x)    (x).nr_union.nr_intref.nr_entry
                    314: #define NR_MOD(x)      (x).nr_union.nr_import.nr_mod
                    315: #define NR_PROC(x)     (x).nr_union.nr_import.nr_proc
                    316: #define NR_OSTYPE(x)   (x).nr_union.nr_osfix.nr_ostype
                    317: #define NR_OSRES(x)    (x).nr_union.nr_osfix.nr_osres
                    318: 
                    319: /*
                    320:  *  Format of NR_STYPE(x):
                    321:  *
                    322:  *  xxxxx                              Unused
                    323:  *      sss                            Source type
                    324:  */
                    325: #define NRSTYP         0x0f            /* Source type mask */
                    326: #define NRSBYT         0x00            /* lo byte */
                    327: #define NRSSEG         0x02            /* 16-bit segment */
                    328: #define NRSPTR         0x03            /* 32-bit pointer */
                    329: #define NRSOFF         0x05            /* 16-bit offset */
                    330: #define NRSPTR48       0x0B            /* 48-bit pointer */
                    331: #define NRSOFF32       0x0D            /* 32-bit offset */
                    332: 
                    333: /*
                    334:  *  Format of NR_FLAGS(x):
                    335:  *
                    336:  *  xxxxx                              Unused
                    337:  *      a                              Additive fixup
                    338:  *       rr                            Reference type
                    339:  */
                    340: #define NRADD          0x04            /* Additive fixup */
                    341: #define NRRTYP         0x03            /* Reference type mask */
                    342: #define NRRINT         0x00            /* Internal reference */
                    343: #define NRRORD         0x01            /* Import by ordinal */
                    344: #define NRRNAM         0x02            /* Import by name */
                    345: #define NRROSF         0x03            /* Operating system fixup */
                    346: 
                    347: 
                    348: /* Resource type or name string */
                    349: struct rsrc_string
                    350:     {
                    351:     char rs_len;           /* number of bytes in string */
                    352:     char rs_string[ 1 ];    /* text of string */
                    353:     };
                    354: 
                    355: #define RS_LEN( x )    (x).rs_len
                    356: #define RS_STRING( x ) (x).rs_string
                    357: 
                    358: /* Resource type information block */
                    359: struct rsrc_typeinfo
                    360:     {
                    361:     unsigned short rt_id;
                    362:     unsigned short rt_nres;
                    363:     long rt_proc;
                    364:     };
                    365: 
                    366: #define RT_ID( x )   (x).rt_id
                    367: #define RT_NRES( x ) (x).rt_nres
                    368: #define RT_PROC( x ) (x).rt_proc
                    369: 
                    370: /* Resource name information block */
                    371: struct rsrc_nameinfo
                    372:     {
                    373:     /* The following two fields must be shifted left by the value of  */
                    374:     /* the rs_align field to compute their actual value.  This allows */
                    375:     /* resources to be larger than 64k, but they do not need to be    */
                    376:     /* aligned on 512 byte boundaries, the way segments are          */
                    377:     unsigned short rn_offset;  /* file offset to resource data */
                    378:     unsigned short rn_length;  /* length of resource data */
                    379:     unsigned short rn_flags;   /* resource flags */
                    380:     unsigned short rn_id;      /* resource name id */
                    381:     unsigned short rn_handle;  /* If loaded, then global handle */
                    382:     unsigned short rn_usage;   /* Initially zero.  Number of times */
                    383:                                /* the handle for this resource has */
                    384:                                /* been given out */
                    385:     };
                    386: 
                    387: #define RN_OFFSET( x ) (x).rn_offset
                    388: #define RN_LENGTH( x ) (x).rn_length
                    389: #define RN_FLAGS( x )  (x).rn_flags
                    390: #define RN_ID( x )     (x).rn_id
                    391: #define RN_HANDLE( x ) (x).rn_handle
                    392: #define RN_USAGE( x )  (x).rn_usage
                    393: 
                    394: #define RSORDID            0x8000      /* if high bit of ID set then integer id */
                    395:                                /* otherwise ID is offset of string from
                    396:                                   the beginning of the resource table */
                    397: 
                    398:                                /* Ideally these are the same as the */
                    399:                                /* corresponding segment flags */
                    400: #define RNMOVE     0x0010      /* Moveable resource */
                    401: #define RNPURE     0x0020      /* Pure (read-only) resource */
                    402: #define RNPRELOAD   0x0040     /* Preloaded resource */
                    403: #define RNDISCARD   0xF000     /* Discard priority level for resource */
                    404: 
                    405: /* Resource table */
                    406: struct new_rsrc
                    407:     {
                    408:     unsigned short rs_align;   /* alignment shift count for resources */
                    409:     struct rsrc_typeinfo rs_typeinfo;
                    410:     };
                    411: 
                    412: #define RS_ALIGN( x ) (x).rs_align

unix.superglobalmegacorp.com

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