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

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