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

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

unix.superglobalmegacorp.com

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