home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / header45.zip / exe386.h < prev    next >
C/C++ Source or Header  |  1999-04-30  |  26KB  |  656 lines

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