summaryrefslogtreecommitdiff
path: root/sal/osl/os2/helpers/debug.h
blob: 83edca5db676a8cf118bd55c3a1a30b3cb08a831 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
/*************************************************************************
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * Copyright 2000, 2010 Oracle and/or its affiliates.
 *
 * OpenOffice.org - a multi-platform office productivity suite
 *
 * This file is part of OpenOffice.org.
 *
 * OpenOffice.org is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * OpenOffice.org is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details
 * (a copy is included in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with OpenOffice.org.  If not, see
 * <http://www.openoffice.org/license.html>
 * for a copy of the LGPLv3 License.
 *
 ************************************************************************/

/*
 *@@sourcefile debug.h:
 *      header file for debug.c (exception handling and debugging).
 *      See remarks there.
 *
 *      Note: Version numbering in this file relates to XWorkplace version
 *            numbering.
 *
 *@@changed V0.9.0: included contents of newexe.h
 *
 *@@include #define INCL_BASE
 *@@include #include <os2.h>
 *@@include #include <stdio.h>
 *@@include #include "helpers\debug.h"
 */

/*
 *      This file incorporates code from the following:
 *      -- Marc Fiammante, John Currier, Kim Rasmussen,
 *         Anthony Cruise (EXCEPT3.ZIP package for a generic
 *         exception handling DLL, available at Hobbes).
 *
 *      This file Copyright (C) 1992-99 Ulrich M�ller,
 *                                      Kim Rasmussen,
 *                                      Marc Fiammante,
 *                                      John Currier,
 *                                      Anthony Cruise.
 *
 *      2009-06-15 published under LGPL3 with Ulrich M�ller permission.
 *
 */

#ifndef DEBUG_HEADER_INCLUDED
    #define DEBUG_HEADER_INCLUDED

    /********************************************************************
     *
     *   SYM file declarations
     *
     ********************************************************************/

    // Pointer means offset from beginning of file or beginning of struct
    #pragma pack(1)

    typedef struct
    {
        unsigned short int ppNextMap;     // paragraph pointer to next map
        unsigned char      bFlags;        // symbol types
        unsigned char      bReserved1;    // reserved
        unsigned short int pSegEntry;     // segment entry point value
        unsigned short int cConsts;       // count of constants in map
        unsigned short int pConstDef;     // pointer to constant chain
        unsigned short int cSegs;         // count of segments in map
        unsigned short int ppSegDef;      // paragraph pointer to first segment
        unsigned char      cbMaxSym;      // maximum symbol-name length
        unsigned char      cbModName;     // length of module name
        char               achModName[1]; // cbModName Bytes of module-name member
    } MAPDEF;

    typedef struct
    {
        unsigned short int ppNextMap;     // always zero
        unsigned char      release;       // release number (minor version number)
        unsigned char      version;       // major version number
    } LAST_MAPDEF;

    typedef struct
    {
        unsigned short int ppNextSeg;     // paragraph pointer to next segment
        unsigned short int cSymbols;      // count of symbols in list
        unsigned short int pSymDef;       // offset of symbol chain
        unsigned short int wReserved1;    // reserved
        unsigned short int wReserved2;    // reserved
        unsigned short int wReserved3;    // reserved
        unsigned short int wReserved4;    // reserved
        unsigned char      bFlags;        // symbol types; bit 0 signals 32-bit (*UM)
        unsigned char      bReserved1;    // reserved
        unsigned short int ppLineDef;     // offset of line number record
        unsigned char      bReserved2;    // reserved
        unsigned char      bReserved3;    // reserved
        unsigned char      cbSegName;     // length of segment name
        char               achSegName[1]; /* cbSegName Bytes of segment-name member*/
    } SEGDEF;

    typedef struct
    {
        unsigned short int wSymVal;       // symbol address or constant
        unsigned char      cbSymName;     // length of symbol name
        char               achSymName[1]; // cbSymName Bytes of symbol-name member
    } SYMDEF16;

    typedef struct
    {
        unsigned       int wSymVal;       // symbol address or constant
        unsigned char      cbSymName;     // length of symbol name
        char               achSymName[1]; // cbSymName Bytes of symbol-name member
    } SYMDEF32;

    typedef struct
    {
        unsigned short int ppNextLine;    // ptr to next linedef (0 if last)
        unsigned short int wReserved1;    // reserved
        unsigned short int pLines;        // pointer to line numbers
        unsigned short int cLines;        // reserved
        unsigned char      cbFileName;    // length of filename
        char               achFileName[1];// cbFileName Bytes of filename
    } LINEDEF;

    typedef struct
    {
        unsigned short int wCodeOffset;   // executable offset
        unsigned short int dwFileOffset;  // source offset
    } LINEINF;

    #define SEGDEFOFFSET(MapDef)     (MapDef.ppSegDef*16)
    #define NEXTSEGDEFOFFSET(SegDef)  (SegDef.ppNextSeg*16)

    #define ASYMPTROFFSET(SegDefOffset,Segdef) (SegDefOffset+SegDef.pSymDef)
    #define SYMDEFOFFSET(SegDefOffset,SegDef,n) (ASYMPTROFFSET(SegDefOffset,SegDef)+(n)*(sizeof(unsigned short int)))

    #define ACONSTPTROFFSET(MapDef) (MapDef.ppConstDef)
    #define CONSTDEFOFFSET(MapDef,n) ((MapDef.ppConstDef)+(n)*(sizeof(unsigned short int)))

    #define LINEDEFOFFSET(SegDef) (SegDef.ppLineDef*16)
    #define NEXTLINEDEFOFFSET(LineDef) (LineDef.ppNextLine*16)
    #define LINESOFFSET(LinedefOffset,LineDef) ((LinedefOffset)+LineDef.pLines)

    /********************************************************************
     *
     *   EXE declarations taken from exe.h
     *
     ********************************************************************/

    #ifndef WORD
    typedef unsigned short WORD;
    #endif

    typedef WORD bbmask;

    struct exe {
            WORD eid;                       // contains EXEID, below
            WORD elast;                     // # of bytes in last page
            WORD epagsiz;                   // # of pages in whole file
            WORD erelcnt;                   // # of relocation entrys
            WORD ehdrsiz;                   // size of header, in paragraphs
            WORD eminfre;                   // min # of free paragraphs needed
            WORD emaxfre;                   // max # of free paragraphs needed
            WORD eiSS;                      // initial SS value
            WORD eiSP;                      // initial SP value
            WORD enegsum;                   // negative sum of entire file
            WORD eiIP;                      // initial IP value
            WORD eiCS;                      // initial CS value
            WORD ereloff;                   // offset in file of relocation table
            WORD eovlnum;                   // number of the overlay

    /*      the following fields may not be present.
     *              ereloff = 28            not present
     *                      = 30            exe.ever present and valid
     *                      = 32            exe.ever field contains garbage
     *              ereloff > 32            exe.ever present and valid
     *                                              = 0 if "don't know"
     */

            WORD ever;                      // version # of producing linker
            WORD dumy;                      // unused

    /*      the following fields may not be present - if the exe.ereloff
     *      value encompasses the fields then they are present and valid.
     */

            bbmask  ebb;                    // behavior bits
            WORD dumy2[7];                  // must be 0 until defined
    };


    #define EXEID 0x5a4d                    // magic ID value

    /********************************************************************
     *
     *   Object Module Format (OMF) declarations
     *
     ********************************************************************/

    struct exehdr_rec
    {
       BYTE     signature[2];              // Must be "MZ"
       USHORT   image_len;                 // Image Length
       USHORT   pages;                     // Pages
       USHORT   reloc_items;               // Relocation table items
       USHORT   min_paragraphs;            // Mininum 16-bytes paragraphs
       USHORT   max_paragraphs;            // Maximum 16-bytes paragraphs
       USHORT   stack_pos;                 // Stack position
       USHORT   offset_in_sp;              // Offset in SP
       USHORT   checksum;                  // Checksum
       USHORT   offset_in_ip;              // Offset in IP
       USHORT   code_pos;                  // Code segment pos.
       USHORT   reloc_item_pos;            // Position of first relocation item
       USHORT   overlay_number;            // Overlay number
       BYTE     unused[8];                 // Unused bytes
       USHORT   oem_id;                    // OEM Identifier
       BYTE     oem_info[24];              // OEM Info
       ULONG    lexe_offset;               // Offset to linear header
    };

    struct lexehdr_rec
    {
       BYTE     signature[2];              // Must be "LX"
       BYTE     b_ord;                     // Byte ordering
       BYTE     w_ord;                     // Word ordering
       ULONG    format_level;              // Format level
       USHORT   cpu_type;                  // CPU Type
       USHORT   os_type;                   // Operating system
       ULONG    module_version;            // Module version
       ULONG    mod_flags;                 // Module flags
       ULONG    mod_pages;                 // Module pages
       ULONG    EIP_object;                // EIP Object no.
       ULONG    EIP;                       // EIP Value
       ULONG    ESP_object;                // ESP Object no
       ULONG    ESP;                       // ESP Value
       ULONG    page_size;                 // Page size
       ULONG    page_ofs_shift;            // Page offset shift
       ULONG    fixup_sect_size;           // Fixup section size
       ULONG    fixup_sect_checksum;       // Fixup section checksum
       ULONG    loader_sect_size;          // Loader section size
       ULONG    loader_sect_checksum;      // Loader section checksum
       ULONG    obj_table_ofs;             // Object table offset
       ULONG    obj_count;                 // Object count
       ULONG    obj_page_tab_ofs;          // Object page table offset
       ULONG    obj_iter_page_ofs;         // Object iteration pages offset
       ULONG    res_tab_ofs;               // Resource table offset
       ULONG    res_table_entries;         // Resource table entries
       ULONG    res_name_tab_ofs;          // Resident name table offset;
       ULONG    ent_tab_ofs;               // Entry table offset
       ULONG    mod_dir_ofs;               // Module directives offset
       ULONG    mod_dir_count;             // Number of module directives
       ULONG    fixup_page_tab_ofs;        // Fixup page table offset
       ULONG    fixup_rec_tab_ofs;         // Fixup record table offset
       ULONG    imp_tab_ofs;               // Import module table offset
       ULONG    imp_mod_entries;           // Import module entries
       ULONG    imp_proc_tab_ofs;          // Import proc table offset
       ULONG    per_page_check_ofs;        // Per page checksum offset
       ULONG    data_page_offset;          // Data pages offset
       ULONG    preload_page_count;        // Preload pages count
       ULONG    nonres_tab_ofs;            // Nonresident name table offset
       ULONG    nonres_tab_len;            // Nonresident name table len
       ULONG    nonres_tab_check;          // Nonresident tables checksum
       ULONG    auto_ds_objectno;          // Auto DS object number
       ULONG    debug_info_ofs;            // Debug info offset
       ULONG    debug_info_len;            // Debug info length
       ULONG    inst_preload_count;        // Instance preload count
       ULONG    inst_demand_count;         // Instance demand count
       ULONG    heapsize;                  // Heap size
       ULONG    stacksize;                 // Stack size
    };

    struct debug_head_rec
    {
       BYTE signature[3];                  // Debug signature
       BYTE type;                          // Debug info type
    };

    struct dir_inf_rec
    {
       USHORT   dirstruct_size;            // Size of directory structure
       USHORT   number_of_entries;         // Number of dnt_rec's in the array
       USHORT   unknown;                   // Unknown data
       // Followed by an array of dnt_rec structures
    };

    struct dnt_rec
    {
       USHORT   subsect_type;              // sst Subsection type
       USHORT   mod_index;                 // Module index (1-based)
       ULONG    offset;                    // Offset of start of section
       ULONG    size;                      // Size of section
    };

    // Modules subsection
    struct modules_rec
    {
       USHORT   code_seg_base;             // Code segment base
       ULONG    code_seg_offset;           // Code segment offset
       ULONG    code_seg_len;              // Code segment length
       USHORT   overlay_no;                // Overlay number
       USHORT   lib_idx;                   // Index into library section or 0
       BYTE     segments;                  // Number of segments
       BYTE     reserved;
       BYTE     debug_style[2];            // "HL" for HLL, "CV" or 0 for CodeView
       BYTE     debug_version[2];          // 00 01 or 00 03 for HLL, 00 00 for CV
       BYTE     name_len;                  // Length of name (which follows)
    };

    // Publics subsection
    struct publics_rec
    {
       ULONG    offset;                    // Offset
       USHORT   segment;                   // Segment
       USHORT   type;                      // Type index
       BYTE     name_len;                  // Length of name (wich follows)
    };

    #if 0
    // Linenumbers header
    struct linhead_rec
    {
       BYTE     id;                        // 0x95 for flat mem, 32 bit progs
       USHORT   length;                    // Record length
       USHORT   base_group;                // Base group
       USHORT   base_segment;              // Base segment
    };
    #endif

    // First linenumber record
    struct linfirst_rec
    {
       USHORT   lineno;                    // Line number (0)
       BYTE     entry_type;                // Entry type
       BYTE     reserved;                  // Reserved
       USHORT   entries_count;             // Number of table entries
       USHORT   segment_no;                // Segment number
       ULONG    filename_tabsize;          // File names table size
    };

    // Source line numbers
    struct linsource_rec
    {
       USHORT   source_line;               // Source file line number
       USHORT   source_idx;                // Source file index
       ULONG    offset;                    // Offset into segment
    };

    // Listing statement numbers
    struct linlist_rec
    {
       ULONG    list_line;                 // Listing file linenumber
       ULONG    statement;                 // Listing file statement number
       ULONG    offset;                    // Offset into segment
    };

    // Source and Listing statement numbers
    struct linsourcelist_rec
    {
       USHORT   source_line;               // Source file line number
       USHORT   source_idx;                // Source file index
       ULONG    list_line;                 // Listing file linenumber
       ULONG    statement;                 // Listing file statement number
       ULONG    offset;                    // Offset into segment
    };

    // Path table
    struct pathtab_rec
    {
       ULONG    offset;                    // Offset into segment
       USHORT   path_code;                 // Path code
       USHORT   source_idx;                // Source file index
    };

    // File names table
    struct filenam_rec
    {
       ULONG    first_char;                // First displayable char in list file
       ULONG    disp_chars;                // Number of displayable chars in list line
       ULONG    filecount;                 // Number of source/listing files
    };

    // Symbol types
    #define SYM_BEGIN          0x00        // Begin block
    #define SYM_PROC           0x01        // Function
    #define SYM_END            0x02        // End block of function
    #define SYM_AUTO           0x04        // Auto variable
    #define SYM_STATIC         0x05        // Static variable
    #define SYM_LABEL          0x0B        // Label
    #define SYM_WITH           0x0C        // With start symbol (not used)
    #define SYM_REG            0x0D        // Register variable
    #define SYM_CONST          0x0E        // Constant
    #define SYM_ENTRY          0x0F        // Secondary entry (not in C)
    #define SYM_SKIP           0x10        // For incremental linking (not used)
    #define SYM_CHANGESEG      0x11        // Change segment (#pragma alloc_text)
    #define SYM_TYPEDEF        0x12        // Typedef variable
    #define SYM_PUBLIC         0x13        // Public reference
    #define SYM_MEMBER         0x14        // Member of minor or major structure
    #define SYM_BASED          0x15        // Based variable
    #define SYM_TAG            0x16        // Tag in struct, union, enum ...
    #define SYM_TABLE          0x17        // Table (used in RPG - not C)
    #define SYM_MAP            0x18        // Map variable (extern in C)
    #define SYM_CLASS          0x19        // Class symbol (C++)
    #define SYM_MEMFUNC        0x1A        // Member function
    #define SYM_AUTOSCOPE      0x1B        // Scoped auto for C++ (not used)
    #define SYM_STATICSCOPE    0x1C        // scoped static for C++ (not used)
    #define SYM_CPPPROC        0x1D        // C++ Proc
    #define SYM_CPPSTAT        0x1E        // C++ Static var
    #define SYM_COMP           0x40        // Compiler information

    // Symbolic begin record
    struct symbegin_rec
    {
       ULONG    offset;                    // Segment offset
       ULONG    length;                    // Length of block
       BYTE     name_len;                  // Length of block name
       // Block name follows
    };

    // Symbolic auto var record
    struct symauto_rec
    {
       ULONG    stack_offset;              // Stack offset
       USHORT   type_idx;                  // Type index
       BYTE     name_len;                  // Length of name
       // Var name follows
    };

    // Symbolic procedure record
    struct symproc_rec
    {
       ULONG    offset;                    // Segment offset
       USHORT   type_idx;                  // Type index
       ULONG    length;                    // Length of procedure
       USHORT   pro_len;                   // Length of prologue
       ULONG    pro_bodylen;               // Length of prologue + body
       USHORT   class_type;                // Class type
       BYTE     near_far;                  // Near or far
       BYTE     name_len;                  // Length of name
       // Function name follows
    };

    // Symbolic static var record
    struct symstatic_rec
    {
       ULONG    offset;                    // Segment offset
       USHORT   segaddr;                   // Segment address
       USHORT   type_idx;                  // Type index
       BYTE     name_len;                  // Length of name
       // Var name follows
    };

    // Symbolic label var record
    struct symlabel_rec
    {
       ULONG    offset;                    // Segment offset
       BYTE     near_far;                  // Near or far
       BYTE     name_len;                  // Length of name
       // Var name follows
    };

    // Symbolic register var record
    struct symreg_rec
    {
       USHORT   type_idx;                  // Type index
       BYTE     reg_no;                    // Register number
       BYTE     name_len;                  // Length of name
       // Var name follows
    };

    // Symbolic change-segment record
    struct symseg_rec
    {
       USHORT   seg_no;                    // Segment number
    };

    // Symbolic typedef record
    struct symtypedef_rec
    {
       USHORT   type_idx;                  // Type index
       BYTE     name_len;                  // Length of name
       // Name follows
    };

    // Symbolic public record
    struct sympublic_rec
    {
       ULONG    offset;                    // Segment offset
       USHORT   segaddr;                   // Segment address
       USHORT   type_idx;                  // Type index
       BYTE     name_len;                  // Length of name
       // Name follows
    };

    // Symbolic member record
    struct symmember_rec
    {
       ULONG    offset;                    // Offset to subrecord
       BYTE     name_len;                  // Length of name
       // Name follows
    };

    // Symbolic based record
    struct symbased_rec
    {
       ULONG    offset;                    // Offset to subrecord
       USHORT   type_idx;                  // Type index
       BYTE     name_len;                  // Length of name
       // Name follows
    };

    // Symbolic tag record
    struct symtag_rec
    {
       USHORT   type_idx;                  // Type index
       BYTE     name_len;                  // Length of name
       // Name follows
    };

    // Symbolic table record
    struct symtable_rec
    {
       ULONG    offset;                    // Segment offset
       USHORT   segaddr;                   // Segment address
       USHORT   type_idx;                  // Type index
       ULONG    idx_ofs;                   // Index offset to subrecord
       BYTE     name_len;                  // Length of name
       // Name follows
    };

    // Type record
    struct type_rec
    {
       USHORT   length;                    // Length of sub-record
       BYTE     type;                      // Sub-record type
       BYTE     type_qual;                 // Type qualifier
    };

    // Types
    #define TYPE_CLASS         0x40        // Class
    #define TYPE_BASECLASS     0x41        // Base class
    #define TYPE_FRIEND        0x42        // Friend
    #define TYPE_CLASSDEF      0x43        // Class definition
    #define TYPE_MEMBERFUNC    0x45        // Member function
    #define TYPE_CLASSMEMBER   0x46        // Class member
    #define TYPE_REF           0x48        // Reference
    #define TYPE_MEMBERPTR     0x49        // Member pointer
    #define TYPE_SCALARS       0x51        // Scalars
    #define TYPE_SET           0x52        // Set
    #define TYPE_ENTRY         0x53        // Entry
    #define TYPE_FUNCTION      0x54        // Function
    #define TYPE_AREA          0x55        // Area
    #define TYPE_LOGICAL       0x56        // Logical
    #define TYPE_STACK         0x57        // Stack
    #define TYPE_MACRO         0x59        // Macro
    #define TYPE_BITSTRING     0x5C        // Bit string
    #define TYPE_USERDEF       0x5D        // User defined
    #define TYPE_CHARSTR       0x60        // Character string
    #define TYPE_PICTURE       0x61        // Picture
    #define TYPE_GRAPHIC       0x62        // Graphic
    #define TYPE_FORMATLAB     0x65        // Format label
    #define TYPE_FILE          0x67        // File
    #define TYPE_SUBRANGE      0x6F        // Subrange
    #define TYPE_CODELABEL     0x72        // Code label
    #define TYPE_PROCEDURE     0x75        // Procedure
    #define TYPE_ARRAY         0x78        // Array
    #define TYPE_STRUCT        0x79        // Structure / Union / Record
    #define TYPE_POINTER       0x7A        // Pointer
    #define TYPE_ENUM          0x7B        // Enum
    #define TYPE_LIST          0x7F        // List

    // Type userdef
    struct type_userdefrec
    {
       BYTE     FID_index;                 // Field ID
       USHORT   type_index;                // Type index
       BYTE     FID_string;                // String ID
       BYTE     name_len;                  // Length of name which follows
    };

    // Type function
    struct type_funcrec
    {
       USHORT   params;
       USHORT   max_params;
       BYTE     FID_index;                 // Field ID
       USHORT   type_index;                // Type index of return value
       BYTE     FID_index1;                // String ID
       USHORT   typelist_index;            // Index of list of params
    };

    // Type struct
    struct type_structrec
    {
       ULONG    size;                      // Size of structure
       USHORT   field_count;               // Number of fields in structure
       BYTE     FID_index;                 // Field ID
       USHORT   type_list_idx;             // Index to type list
       BYTE     FID_index1;                // Field ID
       USHORT   type_name_idx;             // Index to names / offsets
       BYTE     dont_know;                 // Haven't a clue, but it seems to be needed
       BYTE     name_len;                  // Length of structure name which follows
    };

    // Type list, type qualifier 1: contains types for structures
    // This record is repeated for the number of items in the structure definition
    struct type_list1
    {
       BYTE     FID_index;                 // Field identifier for index
       USHORT   type_index;                // Type index.
    };

    // Type list, type qualifier 2: contains names and offsets for structure items
    // This record is repeated for the number of items in the structure definition
    struct type_list2
    {
       BYTE     FID_string;                // String identifier
       BYTE     name_len;                  // Length of name which follows
    };

    // Type list, subrecord to the above, contains offset of variable in the structure
    struct type_list2_1
    {
       BYTE     FID_span;                  // Defines what type of variable follows
       union {
          BYTE   b_len;
          USHORT s_len;
          ULONG  l_len;
       } u;
    };

    // Type pointer
    struct type_pointerrec
    {
       BYTE     FID_index;                 // Index identifier
       USHORT   type_index;                // Type index
       BYTE     FID_string;                // String identifier
       BYTE     name_len;                  // Length of name which follows
    };

    /********************************************************************
     *
     *   Prototypes
     *
     ********************************************************************/

    BOOL dbgPrintStackFrame(FILE *LogFile,
                            PSZ pszModuleName,  // in: module name (fully q'fied)
                            ULONG ulObject,
                            ULONG ulOffset);

    VOID dbgPrintStack(FILE *file,
                       PUSHORT StackBottom,
                       PUSHORT StackTop,
                       PUSHORT Ebp,
                       PUSHORT ExceptionAddress);

    APIRET APIENTRY DosQueryModFromEIP(HMODULE *phMod,   // out: trapping module
                                       ULONG *pulObjNum, // out: object/segment number
                                       ULONG ulBuffLen,  // in:  sizeof(*pszBuff)
                                       CHAR *pszBuff,    // out: module name
                                       ULONG *pulOffset, // out: offset in module
                                       ULONG ulAddress); // in:  address to be analyzed

    APIRET APIENTRY DOSQUERYMODFROMEIP(HMODULE * phMod,
                                       ULONG * pObjNum,
                                       ULONG BuffLen,
                                       PCHAR pBuff,
                                       ULONG * pOffset,
                                       PVOID Address);

    typedef ULONG  *_Seg16 PULONG16;
    APIRET16 APIENTRY16 DOS16SIZESEG(USHORT Seg, PULONG16 Size);
    typedef         APIRET16(APIENTRY16 _PFN16) (VOID);
    ULONG APIENTRY  DosSelToFlat(ULONG);

    APIRET16 APIENTRY16 DOSQPROCSTATUS(ULONG * _Seg16 pBuf, USHORT cbBuf);

    #define CONVERT(fp,QSsel) MAKEP((QSsel),OFFSETOF(fp))

    #pragma pack()              // added V0.9.0


    /********************************************************************
     *
     *   Executable definitions
     *
     ********************************************************************/

    #define EXE386 1

    #ifndef __NEWEXE__
        #define __NEWEXE__

        #pragma pack(1)

        /*_________________________________________________________________*
         |                                                                 |
         |                                                                 |
         |  DOS3 .EXE FILE HEADER DEFINITION                               |
         |                                                                 |
         |_________________________________________________________________|
         *                                                                 */


        #define EMAGIC          0x5A4D          // Old magic number
        #define ENEWEXE         sizeof(struct exe_hdr)
                                                // Value of E_LFARLC for new .EXEs
        #define ENEWHDR         0x003C          // Offset in old hdr. of ptr. to new
        #define ERESWDS         0x0010          // No. of reserved words (OLD)
        #define ERES1WDS        0x0004          // No. of reserved words in e_res
        #define ERES2WDS        0x000A          // No. of reserved words in e_res2
        #define ECP             0x0004          // Offset in struct of E_CP
        #define ECBLP           0x0002          // Offset in struct of E_CBLP
        #define EMINALLOC       0x000A          // Offset in struct of E_MINALLOC

        /*
         *@@ exe_hdr:
         *      DOS 1, 2, 3 .EXE header.
         */

        struct exe_hdr
        {
            unsigned short      e_magic;        // Magic number
            unsigned short      e_cblp;         // Bytes on last page of file
            unsigned short      e_cp;           // Pages in file
            unsigned short      e_crlc;         // Relocations
            unsigned short      e_cparhdr;      // Size of header in paragraphs
            unsigned short      e_minalloc;     // Minimum extra paragraphs needed
            unsigned short      e_maxalloc;     // Maximum extra paragraphs needed
            unsigned short      e_ss;           // Initial (relative) SS value
            unsigned short      e_sp;           // Initial SP value
            unsigned short      e_csum;         // Checksum
            unsigned short      e_ip;           // Initial IP value
            unsigned short      e_cs;           // Initial (relative) CS value
            unsigned short      e_lfarlc;       // File address of relocation table
            unsigned short      e_ovno;         // Overlay number
            unsigned short      e_res[ERES1WDS];// Reserved words
            unsigned short      e_oemid;        // OEM identifier (for e_oeminfo)
            unsigned short      e_oeminfo;      // OEM information; e_oemid specific
            unsigned short      e_res2[ERES2WDS];// Reserved words
            long                e_lfanew;       // File address of new exe header
        };

        #define E_MAGIC(x)      (x).e_magic
        #define E_CBLP(x)       (x).e_cblp
        #define E_CP(x)         (x).e_cp
        #define E_CRLC(x)       (x).e_crlc
        #define E_CPARHDR(x)    (x).e_cparhdr
        #define E_MINALLOC(x)   (x).e_minalloc
        #define E_MAXALLOC(x)   (x).e_maxalloc
        #define E_SS(x)         (x).e_ss
        #define E_SP(x)         (x).e_sp
        #define E_CSUM(x)       (x).e_csum
        #define E_IP(x)         (x).e_ip
        #define E_CS(x)         (x).e_cs
        #define E_LFARLC(x)     (x).e_lfarlc
        #define E_OVNO(x)       (x).e_ovno
        #define E_RES(x)        (x).e_res
        #define E_OEMID(x)      (x).e_oemid
        #define E_OEMINFO(x)    (x).e_oeminfo
        #define E_RES2(x)       (x).e_res2
        #define E_LFANEW(x)     (x).e_lfanew


            /*_________________________________________________________________*
             |                                                                 |
             |                                                                 |
             |  OS/2 & WINDOWS .EXE FILE HEADER DEFINITION - 286 version       |
             |                                                                 |
             |_________________________________________________________________|
             *                                                                 */

        #define NEMAGIC         0x454E          // New magic number
        #define NERESBYTES      8               // Eight bytes reserved (now)
        #define NECRC           8               // Offset into new header of NE_CRC

        /*
         *@@ new_exe:
         *      New Executable (NE) header.
         *      Follows DOS header in the executable file.
         */

        struct new_exe
        {
            unsigned short      ne_magic;       // Magic number NE_MAGIC
            unsigned char       ne_ver;         // Version number
            unsigned char       ne_rev;         // Revision number
            unsigned short      ne_enttab;      // Offset of Entry Table
            unsigned short      ne_cbenttab;    // Number of bytes in Entry Table
            long                ne_crc;         // Checksum of whole file
            unsigned short      ne_flags;       // Flag word
            unsigned short      ne_autodata;    // Automatic data segment number
            unsigned short      ne_heap;        // Initial heap allocation
            unsigned short      ne_stack;       // Initial stack allocation
            long                ne_csip;        // Initial CS:IP setting
            long                ne_sssp;        // Initial SS:SP setting
            unsigned short      ne_cseg;        // Count of file segments
            unsigned short      ne_cmod;        // Entries in Module Reference Table
            unsigned short      ne_cbnrestab;   // Size of non-resident name table
            unsigned short      ne_segtab;      // Offset of Segment Table
            unsigned short      ne_rsrctab;     // Offset of Resource Table
            unsigned short      ne_restab;      // Offset of resident name table
            unsigned short      ne_modtab;      // Offset of Module Reference Table
            unsigned short      ne_imptab;      // Offset of Imported Names Table
            long                ne_nrestab;     // Offset of Non-resident Names Table
            unsigned short      ne_cmovent;     // Count of movable entries
            unsigned short      ne_align;       // Segment alignment shift count
            unsigned short      ne_cres;        // Count of resource entries
            unsigned char       ne_exetyp;      // Target operating system
            unsigned char       ne_flagsothers; // Other .EXE flags
            char                ne_res[NERESBYTES]; // Pad structure to 64 bytes
        };

        #pragma pack()

        #define NE_MAGIC(x)         (x).ne_magic
        #define NE_VER(x)           (x).ne_ver
        #define NE_REV(x)           (x).ne_rev
        #define NE_ENTTAB(x)        (x).ne_enttab
        #define NE_CBENTTAB(x)      (x).ne_cbenttab
        #define NE_CRC(x)           (x).ne_crc
        #define NE_FLAGS(x)         (x).ne_flags
        #define NE_AUTODATA(x)      (x).ne_autodata
        #define NE_HEAP(x)          (x).ne_heap
        #define NE_STACK(x)         (x).ne_stack
        #define NE_CSIP(x)          (x).ne_csip
        #define NE_SSSP(x)          (x).ne_sssp
        #define NE_CSEG(x)          (x).ne_cseg
        #define NE_CMOD(x)          (x).ne_cmod
        #define NE_CBNRESTAB(x)     (x).ne_cbnrestab
        #define NE_SEGTAB(x)        (x).ne_segtab
        #define NE_RSRCTAB(x)       (x).ne_rsrctab
        #define NE_RESTAB(x)        (x).ne_restab
        #define NE_MODTAB(x)        (x).ne_modtab
        #define NE_IMPTAB(x)        (x).ne_imptab
        #define NE_NRESTAB(x)       (x).ne_nrestab
        #define NE_CMOVENT(x)       (x).ne_cmovent
        #define NE_ALIGN(x)         (x).ne_align
        #define NE_CRES(x)          (x).ne_cres
        #define NE_RES(x)           (x).ne_res
        #define NE_EXETYP(x)        (x).ne_exetyp
        #define NE_FLAGSOTHERS(x)   (x).ne_flagsothers

        #define NE_USAGE(x)     (WORD)*((WORD *)(x)+1)
        #define NE_PNEXTEXE(x)  (WORD)(x).ne_cbenttab
        #define NE_ONEWEXE(x)   (WORD)(x).ne_crc
        #define NE_PFILEINFO(x) (WORD)((DWORD)(x).ne_crc >> 16)


        /*
         *  Target operating systems
         */

        #define NE_UNKNOWN      0x0             /* Unknown (any "new-format" OS) */
        #define NE_OS2          0x1             /* OS/2 (default)  */
        #define NE_WINDOWS      0x2             /* Windows */
        #define NE_DOS4         0x3             /* DOS 4.x */
        #define NE_DEV386       0x4             /* Windows 386 */


        /*
         *  Format of NE_FLAGS(x):
         *
         *  p                                   Not-a-process
         *   x                                  Unused
         *    e                                 Errors in image
         *     x                                Unused
         *      b                               Bound Family/API
         *       ttt                            Application type
         *          f                           Floating-point instructions
         *           3                          386 instructions
         *            2                         286 instructions
         *             0                        8086 instructions
         *              P                       Protected mode only
         *               p                      Per-process library initialization
         *                i                     Instance data
         *                 s                    Solo data
         */
        #define NENOTP          0x8000          /* Not a process */
        #define NEIERR          0x2000          /* Errors in image */
        #define NEBOUND         0x0800          /* Bound Family/API */
        #define NEAPPTYP        0x0700          /* Application type mask */
        #define NENOTWINCOMPAT  0x0100          /* Not compatible with P.M. Windowing */
        #define NEWINCOMPAT     0x0200          /* Compatible with P.M. Windowing */
        #define NEWINAPI        0x0300          /* Uses P.M. Windowing API */
        #define NEFLTP          0x0080          /* Floating-point instructions */
        #define NEI386          0x0040          /* 386 instructions */
        #define NEI286          0x0020          /* 286 instructions */
        #define NEI086          0x0010          /* 8086 instructions */
        #define NEPROT          0x0008          /* Runs in protected mode only */
        #define NEPPLI          0x0004          /* Per-Process Library Initialization */
        #define NEINST          0x0002          /* Instance data */
        #define NESOLO          0x0001          /* Solo data */

        /*
         *  Format of NE_FLAGSOTHERS(x):
         *
         *      7 6 5 4 3 2 1 0  - bit no
         *      |         | | |
         *      |         | | +---------------- Support for long file names
         *      |         | +------------------ Windows 2.x app runs in prot mode
         *      |         +-------------------- Windows 2.x app gets prop. font
         *      +------------------------------ WLO appl on OS/2 (markwlo.exe)
         *
         */

        #define NELONGNAMES     0x01
        #define NEWINISPROT     0x02
        #define NEWINGETPROPFON 0x04
        #define NEWLOAPPL       0x80



        struct new_seg                          /* New .EXE segment table entry */
          {
            unsigned short      ns_sector;      /* File sector of start of segment */
            unsigned short      ns_cbseg;       /* Number of bytes in file */
            unsigned short      ns_flags;       /* Attribute flags */
            unsigned short      ns_minalloc;    /* Minimum allocation in bytes */
          };

        #define NS_SECTOR(x)    (x).ns_sector
        #define NS_CBSEG(x)     (x).ns_cbseg
        #define NS_FLAGS(x)     (x).ns_flags
        #define NS_MINALLOC(x)  (x).ns_minalloc


        /*
         *  Format of NS_FLAGS(x)
         *
         *  Flag word has the following format:
         *
         *      15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  - bit no
         *          |  |  |  |  | | | | | | | | | | |
         *          |  |  |  |  | | | | | | | | +-+-+--- Segment type DATA/CODE
         *          |  |  |  |  | | | | | | | +--------- Iterated segment
         *          |  |  |  |  | | | | | | +----------- Movable segment
         *          |  |  |  |  | | | | | +------------- Segment can be shared
         *          |  |  |  |  | | | | +--------------- Preload segment
         *          |  |  |  |  | | | +----------------- Execute/read-only for code/data segment
         *          |  |  |  |  | | +------------------- Segment has relocations
         *          |  |  |  |  | +--------------------- Code conforming/Data is expand down
         *          |  |  |  +--+----------------------- I/O privilege level
         *          |  |  +----------------------------- Discardable segment
         *          |  +-------------------------------- 32-bit code segment
         *          +----------------------------------- Huge segment/GDT allocation requested
         *
         */

        #define NSTYPE          0x0007          /* Segment type mask */

        #ifdef EXE386
            #define NSCODE          0x0000          /* Code segment */
            #define NSDATA          0x0001          /* Data segment */
            #define NSITER          0x0008          /* Iterated segment flag */
            #define NSMOVE          0x0010          /* Movable segment flag */
            #define NSSHARED        0x0020          /* Shared segment flag */
            #define NSPRELOAD       0x0040          /* Preload segment flag */
            #define NSEXRD          0x0080          /* Execute-only (code segment), or
                                                    *  read-only (data segment)
                                                    */
            #define NSRELOC         0x0100          /* Segment has relocations */
            #define NSCONFORM       0x0200          /* Conforming segment */
            #define NSEXPDOWN       0x0200          /* Data segment is expand down */
            #define NSDPL           0x0C00          /* I/O privilege level (286 DPL bits) */
            #define SHIFTDPL        10              /* Left shift count for SEGDPL field */
            #define NSDISCARD       0x1000          /* Segment is discardable */
            #define NS32BIT         0x2000          /* 32-bit code segment */
            #define NSHUGE          0x4000          /* Huge memory segment, length of
                                                     * segment and minimum allocation
                                                     * size are in segment sector units
                                                     */
            #define NSGDT           0x8000          /* GDT allocation requested */

            #define NSPURE          NSSHARED        /* For compatibility */

            #define NSALIGN 9       /* Segment data aligned on 512 byte boundaries */

            #define NSLOADED    0x0004      /* ns_sector field contains memory addr */
        #endif


        struct new_segdata                      /* Segment data */
          {
            union
              {
                struct
                  {
                    unsigned short      ns_niter;       /* number of iterations */
                    unsigned short      ns_nbytes;      /* number of bytes */
                    char                ns_iterdata;    /* iterated data bytes */
                  } ns_iter;
                struct
                  {
                    char                ns_data;        /* data bytes */
                  } ns_noniter;
              } ns_union;
          };

        struct new_rlcinfo                      /* Relocation info */
          {
            unsigned short      nr_nreloc;      /* number of relocation items that */
          };                                    /* follow */

        #pragma pack(1)


        struct new_rlc                          /* Relocation item */
          {
            char                nr_stype;       /* Source type */
            char                nr_flags;       /* Flag byte */
            unsigned short      nr_soff;        /* Source offset */
            union
              {
                struct
                  {
                    char        nr_segno;       /* Target segment number */
                    char        nr_res;         /* Reserved */
                    unsigned short nr_entry;    /* Target Entry Table offset */
                  }             nr_intref;      /* Internal reference */
                struct
                  {
                    unsigned short nr_mod;      /* Index into Module Reference Table */
                    unsigned short nr_proc;     /* Procedure ordinal or name offset */
                  }             nr_import;      /* Import */
                struct
                  {
                    unsigned short nr_ostype;   /* OSFIXUP type */
                    unsigned short nr_osres;    /* reserved */
                  }             nr_osfix;       /* Operating system fixup */
              }                 nr_union;       /* Union */
          };

        #pragma pack()


        #define NR_STYPE(x)     (x).nr_stype
        #define NR_FLAGS(x)     (x).nr_flags
        #define NR_SOFF(x)      (x).nr_soff
        #define NR_SEGNO(x)     (x).nr_union.nr_intref.nr_segno
        #define NR_RES(x)       (x).nr_union.nr_intref.nr_res
        #define NR_ENTRY(x)     (x).nr_union.nr_intref.nr_entry
        #define NR_MOD(x)       (x).nr_union.nr_import.nr_mod
        #define NR_PROC(x)      (x).nr_union.nr_import.nr_proc
        #define NR_OSTYPE(x)    (x).nr_union.nr_osfix.nr_ostype
        #define NR_OSRES(x)     (x).nr_union.nr_osfix.nr_osres



        /*
         *  Format of NR_STYPE(x) and R32_STYPE(x):
         *
         *       7 6 5 4 3 2 1 0  - bit no
         *               | | | |
         *               +-+-+-+--- source type
         *
         */

        #define NRSTYP          0x0f            /* Source type mask */
        #define NRSBYT          0x00            /* lo byte (8-bits)*/
        #define NRSSEG          0x02            /* 16-bit segment (16-bits) */
        #define NRSPTR          0x03            /* 16:16 pointer (32-bits) */
        #define NRSOFF          0x05            /* 16-bit offset (16-bits) */
        #define NRPTR48         0x06            /* 16:32 pointer (48-bits) */
        #define NROFF32         0x07            /* 32-bit offset (32-bits) */
        #define NRSOFF32        0x08            /* 32-bit self-relative offset (32-bits) */


        /*
         *  Format of NR_FLAGS(x) and R32_FLAGS(x):
         *
         *       7 6 5 4 3 2 1 0  - bit no
         *                 | | |
         *                 | +-+--- Reference type
         *                 +------- Additive fixup
         */

        #define NRADD           0x04            /* Additive fixup */
        #define NRRTYP          0x03            /* Reference type mask */
        #define NRRINT          0x00            /* Internal reference */
        #define NRRORD          0x01            /* Import by ordinal */
        #define NRRNAM          0x02            /* Import by name */
        #define NRROSF          0x03            /* Operating system fixup */


        #if (EXE386 == 0)

        /* Resource type or name string */
        struct rsrc_string
            {
            char rs_len;            /* number of bytes in string */
            char rs_string[ 1 ];    /* text of string */
            };

        #define RS_LEN( x )    (x).rs_len
        #define RS_STRING( x ) (x).rs_string

        /* Resource type information block */
        struct rsrc_typeinfo
            {
            unsigned short rt_id;
            unsigned short rt_nres;
            long rt_proc;
            };

        #define RT_ID( x )   (x).rt_id
        #define RT_NRES( x ) (x).rt_nres
        #define RT_PROC( x ) (x).rt_proc

        /* Resource name information block */
        struct rsrc_nameinfo
            {
            /* The following two fields must be shifted left by the value of  */
            /* the rs_align field to compute their actual value.  This allows */
            /* resources to be larger than 64k, but they do not need to be    */
            /* aligned on 512 byte boundaries, the way segments are           */
            unsigned short rn_offset;   /* file offset to resource data */
            unsigned short rn_length;   /* length of resource data */
            unsigned short rn_flags;    /* resource flags */
            unsigned short rn_id;       /* resource name id */
            unsigned short rn_handle;   /* If loaded, then global handle */
            unsigned short rn_usage;    /* Initially zero.  Number of times */
                                        /* the handle for this resource has */
                                        /* been given out */
            };

        #define RN_OFFSET( x ) (x).rn_offset
        #define RN_LENGTH( x ) (x).rn_length
        #define RN_FLAGS( x )  (x).rn_flags
        #define RN_ID( x )     (x).rn_id
        #define RN_HANDLE( x ) (x).rn_handle
        #define RN_USAGE( x )  (x).rn_usage

        #define RSORDID     0x8000      /* if high bit of ID set then integer id */
                                        /* otherwise ID is offset of string from
                                           the beginning of the resource table */

                                        /* Ideally these are the same as the */
                                        /* corresponding segment flags */
        #define RNMOVE      0x0010      /* Moveable resource */
        #define RNPURE      0x0020      /* Pure (read-only) resource */
        #define RNPRELOAD   0x0040      /* Preloaded resource */
        #define RNDISCARD   0xF000      /* Discard priority level for resource */

        /* Resource table */
        struct new_rsrc
            {
            unsigned short rs_align;    /* alignment shift count for resources */
            struct rsrc_typeinfo rs_typeinfo;
            };

        #define RS_ALIGN( x ) (x).rs_align


        #endif /* NOT EXE386 */

    #endif /* __NEWEXE__ */

    #ifndef DWORD
    #define DWORD long int
    #endif

    #ifndef WORD
    #define WORD  short int
    #endif

    #ifndef __EXE386__
        #define __EXE386__

        #pragma pack(1)    /* Force byte alignment */

            /*_________________________________________________________________*
             |                                                                 |
             |                                                                 |
             |  OS/2 .EXE FILE HEADER DEFINITION - 386 version 0:32            |
             |                                                                 |
             |_________________________________________________________________|
             *                                                                 */

        #define BITPERWORD      16
        #define BITPERBYTE      8
        #define OBJPAGELEN      4096
        #define E32MAGIC1       'L'        /* New magic number  "LX" */
        #define E32MAGIC2       'X'        /* New magic number  "LX" */
        #define E32MAGIC        0x584c     /* New magic number  "LX" */
        #define E32RESBYTES1    0          /* First bytes reserved */
        #define E32RESBYTES2    0          /* Second bytes reserved */
        #define E32RESBYTES3    20         /* Third bytes reserved */
        #define E32LEBO         0x00       /* Little Endian Byte Order */
        #define E32BEBO         0x01       /* Big Endian Byte Order */
        #define E32LEWO         0x00       /* Little Endian Word Order */
        #define E32BEWO         0x01       /* Big Endian Word Order */
        #define E32LEVEL        0L         /* 32-bit EXE format level */
        #define E32CPU286       0x001      /* Intel 80286 or upwardly compatibile */
        #define E32CPU386       0x002      /* Intel 80386 or upwardly compatibile */
        #define E32CPU486       0x003      /* Intel 80486 or upwardly compatibile */



        struct e32_exe                          /* New 32-bit .EXE header */
        {
            unsigned char       e32_magic[2];   /* Magic number E32_MAGIC */
            unsigned char       e32_border;     /* The byte ordering for the .EXE */
            unsigned char       e32_worder;     /* The word ordering for the .EXE */
            unsigned long       e32_level;      /* The EXE format level for now = 0 */
            unsigned short      e32_cpu;        /* The CPU type */
            unsigned short      e32_os;         /* The OS type */
            unsigned long       e32_ver;        /* Module version */
            unsigned long       e32_mflags;     /* Module flags */
            unsigned long       e32_mpages;     /* Module # pages */
            unsigned long       e32_startobj;   /* Object # for instruction pointer */
            unsigned long       e32_eip;        /* Extended instruction pointer */
            unsigned long       e32_stackobj;   /* Object # for stack pointer */
            unsigned long       e32_esp;        /* Extended stack pointer */
            unsigned long       e32_pagesize;   /* .EXE page size */
            unsigned long       e32_pageshift;  /* Page alignment shift in .EXE */
            unsigned long       e32_fixupsize;  /* Fixup section size */
            unsigned long       e32_fixupsum;   /* Fixup section checksum */
            unsigned long       e32_ldrsize;    /* Loader section size */
            unsigned long       e32_ldrsum;     /* Loader section checksum */
            unsigned long       e32_objtab;     /* Object table offset */
            unsigned long       e32_objcnt;     /* Number of objects in module */
            unsigned long       e32_objmap;     /* Object page map offset */
            unsigned long       e32_itermap;    /* Object iterated data map offset */
            unsigned long       e32_rsrctab;    /* Offset of Resource Table */
            unsigned long       e32_rsrccnt;    /* Number of resource entries */
            unsigned long       e32_restab;     /* Offset of resident name table */
            unsigned long       e32_enttab;     /* Offset of Entry Table */
            unsigned long       e32_dirtab;     /* Offset of Module Directive Table */
            unsigned long       e32_dircnt;     /* Number of module directives */
            unsigned long       e32_fpagetab;   /* Offset of Fixup Page Table */
            unsigned long       e32_frectab;    /* Offset of Fixup Record Table */
            unsigned long       e32_impmod;     /* Offset of Import Module Name Table */
            unsigned long       e32_impmodcnt;  /* Number of entries in Import Module Name Table */
            unsigned long       e32_impproc;    /* Offset of Import Procedure Name Table */
            unsigned long       e32_pagesum;    /* Offset of Per-Page Checksum Table */
            unsigned long       e32_datapage;   /* Offset of Enumerated Data Pages */
            unsigned long       e32_preload;    /* Number of preload pages */
            unsigned long       e32_nrestab;    /* Offset of Non-resident Names Table */
            unsigned long       e32_cbnrestab;  /* Size of Non-resident Name Table */
            unsigned long       e32_nressum;    /* Non-resident Name Table Checksum */
            unsigned long       e32_autodata;   /* Object # for automatic data object */
            unsigned long       e32_debuginfo;  /* Offset of the debugging information */
            unsigned long       e32_debuglen;   /* The length of the debugging info. in bytes */
            unsigned long       e32_instpreload;/* Number of instance pages in preload section of .EXE file */
            unsigned long       e32_instdemand; /* Number of instance pages in demand load section of .EXE file */
            unsigned long       e32_heapsize;   /* Size of heap - for 16-bit apps */
            unsigned long       e32_stacksize;  /* Size of stack */
            unsigned char       e32_res3[E32RESBYTES3];
                                                /* Pad structure to 196 bytes */
          };



        #define E32_MAGIC1(x)       (x).e32_magic[0]
        #define E32_MAGIC2(x)       (x).e32_magic[1]
        #define E32_BORDER(x)       (x).e32_border
        #define E32_WORDER(x)       (x).e32_worder
        #define E32_LEVEL(x)        (x).e32_level
        #define E32_CPU(x)          (x).e32_cpu
        #define E32_OS(x)           (x).e32_os
        #define E32_VER(x)          (x).e32_ver
        #define E32_MFLAGS(x)       (x).e32_mflags
        #define E32_MPAGES(x)       (x).e32_mpages
        #define E32_STARTOBJ(x)     (x).e32_startobj
        #define E32_EIP(x)          (x).e32_eip
        #define E32_STACKOBJ(x)     (x).e32_stackobj
        #define E32_ESP(x)          (x).e32_esp
        #define E32_PAGESIZE(x)     (x).e32_pagesize
        #define E32_PAGESHIFT(x)    (x).e32_pageshift
        #define E32_FIXUPSIZE(x)    (x).e32_fixupsize
        #define E32_FIXUPSUM(x)     (x).e32_fixupsum
        #define E32_LDRSIZE(x)      (x).e32_ldrsize
        #define E32_LDRSUM(x)       (x).e32_ldrsum
        #define E32_OBJTAB(x)       (x).e32_objtab
        #define E32_OBJCNT(x)       (x).e32_objcnt
        #define E32_OBJMAP(x)       (x).e32_objmap
        #define E32_ITERMAP(x)      (x).e32_itermap
        #define E32_RSRCTAB(x)      (x).e32_rsrctab
        #define E32_RSRCCNT(x)      (x).e32_rsrccnt
        #define E32_RESTAB(x)       (x).e32_restab
        #define E32_ENTTAB(x)       (x).e32_enttab
        #define E32_DIRTAB(x)       (x).e32_dirtab
        #define E32_DIRCNT(x)       (x).e32_dircnt
        #define E32_FPAGETAB(x)     (x).e32_fpagetab
        #define E32_FRECTAB(x)      (x).e32_frectab
        #define E32_IMPMOD(x)       (x).e32_impmod
        #define E32_IMPMODCNT(x)    (x).e32_impmodcnt
        #define E32_IMPPROC(x)      (x).e32_impproc
        #define E32_PAGESUM(x)      (x).e32_pagesum
        #define E32_DATAPAGE(x)     (x).e32_datapage
        #define E32_PRELOAD(x)      (x).e32_preload
        #define E32_NRESTAB(x)      (x).e32_nrestab
        #define E32_CBNRESTAB(x)    (x).e32_cbnrestab
        #define E32_NRESSUM(x)      (x).e32_nressum
        #define E32_AUTODATA(x)     (x).e32_autodata
        #define E32_DEBUGINFO(x)    (x).e32_debuginfo
        #define E32_DEBUGLEN(x)     (x).e32_debuglen
        #define E32_INSTPRELOAD(x)  (x).e32_instpreload
        #define E32_INSTDEMAND(x)   (x).e32_instdemand
        #define E32_HEAPSIZE(x)     (x).e32_heapsize
        #define E32_STACKSIZE(x)    (x).e32_stacksize



        /*
         *  Format of E32_MFLAGS(x):
         *
         *  Low word has the following format:
         *
         *  15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  - bit no
         *   |     |          | |     | | | |
         *   |     |          | |     | | | +------- Per-Process Library Initialization
         *   |     |          | |     | | +--------- SystemDLL (internal fixups discarded)
         *   |     |          | |     | +----------- No Internal Fixups for Module in .EXE
         *   |     |          | |     +------------- No External Fixups for Module in .EXE
         *   |     |          | +------------------- Incompatible with PM Windowing
         *   |     |          +--------------------- Compatible with PM Windowing
         *   |     |                                 Uses PM Windowing API
         *   |     +-------------------------------- Module not Loadable
         *   +-------------------------------------- Library Module
         */


        #define E32NOTP          0x8000L        /* Library Module - used as NENOTP */
        #define E32NOLOAD        0x2000L        /* Module not Loadable */
        #define E32PMAPI         0x0300L        /* Uses PM Windowing API */
        #define E32PMW           0x0200L        /* Compatible with PM Windowing */
        #define E32NOPMW         0x0100L        /* Incompatible with PM Windowing */
        #define E32NOEXTFIX      0x0020L        /* NO External Fixups in .EXE */
        #define E32NOINTFIX      0x0010L        /* NO Internal Fixups in .EXE */
        #define E32SYSDLL        0x0008L        /* System DLL, Internal Fixups discarded*/
        #define E32LIBINIT       0x0004L        /* Per-Process Library Initialization */
        #define E32LIBTERM       0x40000000L    /* Per-Process Library Termination */
        #define E32APPMASK       0x0300L        /* Application Type Mask */


        /*
         *  Format of E32_MFLAGS(x):
         *
         *  High word has the following format:
         *
         *  15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  - bit no
         *                                    | |
         *                                    | +--- Protected memory library module
         *                                    +----- Device driver
         */

        #define E32PROTDLL       0x10000L       /* Protected memory library module */
        #define E32DEVICE        0x20000L       /* Device driver                   */
        #define E32MODEXE        0x00000L       /* .EXE module                     */
        #define E32MODDLL        0x08000L       /* .DLL module                     */
        #define E32MODPROTDLL    0x18000L       /* Protected memory library module */
        #define E32MODPDEV       0x20000L       /* Physical device driver          */
        #define E32MODVDEV       0x28000L       /* Virtual device driver           */
        #define E32MODMASK       0x38000L       /* Module type mask                */

        /*
         *  RELOCATION DEFINITIONS - RUN-TIME FIXUPS
         */

        typedef union _RELOC_OFS
        {
            unsigned short offset16;
            unsigned long  offset32;
        } RELOC_OFS;                            /* 16-bit or 32-bit offset */


        /***ET+ r32_rlc - Relocation item */

        struct r32_rlc                          /* Relocation item */
        {
            unsigned char       nr_stype;       /* Source type - field shared with new_rlc */
            unsigned char       nr_flags;       /* Flag byte - field shared with new_rlc */
            short               r32_soff;       /* Source offset */
            unsigned short      r32_objmod;     /* Target object number or Module ordinal */

            union targetid
            {
                RELOC_OFS         intref;      /* Internal fixup */

                union extfixup
                {
                    RELOC_OFS      proc;        /* Procedure name offset */
                    unsigned long  ord;         /* Procedure odrinal */
                } extref;      /* External fixup */

                struct addfixup
                {
                    unsigned short entry;       /* Entry ordinal */
                    RELOC_OFS      addval;      /* Value added to the address */
                } addfix;      /* Additive fixup */
            }
                                r32_target;     /* Target data */
            unsigned short      r32_srccount;   /* Number of chained fixup records */
            unsigned short      r32_chain;      /* Chain head */
        };

        /*
         *  In 32-bit .EXE file run-time relocations are written as varying size
         *  records, so we need many size definitions.
         */

        #define RINTSIZE16      8
        #define RINTSIZE32      10
        #define RORDSIZE        8
        #define RNAMSIZE16      8
        #define RNAMSIZE32      10
        #define RADDSIZE16      10
        #define RADDSIZE32      12

        #if FALSE
        /*
         *  Access macros defined in NEWEXE.H !!!
         */
        #define NR_STYPE(x)      (x).nr_stype
        #define NR_FLAGS(x)      (x).nr_flags
        #endif

        #define R32_SOFF(x)      (x).r32_soff
        #define R32_OBJNO(x)     (x).r32_objmod
        #define R32_MODORD(x)    (x).r32_objmod
        #define R32_OFFSET16(x)  (x).r32_target.intref.offset16
        #define R32_OFFSET32(x)  (x).r32_target.intref.offset32
        #define R32_PROCOFF16(x) (x).r32_target.extref.proc.offset16
        #define R32_PROCOFF32(x) (x).r32_target.extref.proc.offset32
        #define R32_PROCORD(x)   (x).r32_target.extref.ord
        #define R32_ENTRY(x)     (x).r32_target.addfix.entry
        #define R32_ADDVAL16(x)  (x).r32_target.addfix.addval.offset16
        #define R32_ADDVAL32(x)  (x).r32_target.addfix.addval.offset32
        #define R32_SRCCNT(x)    (x).r32_srccount
        #define R32_CHAIN(x)     (x).r32_chain



        /*
         *  Format of NR_STYPE(x)
         *
         *       7 6 5 4 3 2 1 0  - bit no
         *           | | | | | |
         *           | | +-+-+-+--- Source type
         *           | +----------- Fixup to 16:16 alias
         *           +------------- List of source offset follows fixup record
         */

        #if FALSE

                    /* DEFINED in newexe.h !!! */

        #define NRSTYP          0x0f            /* Source type mask */
        #define NRSBYT          0x00            /* lo byte (8-bits)*/
        #define NRSSEG          0x02            /* 16-bit segment (16-bits) */
        #define NRSPTR          0x03            /* 16:16 pointer (32-bits) */
        #define NRSOFF          0x05            /* 16-bit offset (16-bits) */
        #define NRPTR48         0x06            /* 16:32 pointer (48-bits) */
        #define NROFF32         0x07            /* 32-bit offset (32-bits) */
        #define NRSOFF32        0x08            /* 32-bit self-relative offset (32-bits) */
        #endif


        #define NRSRCMASK       0x0f            /* Source type mask */
        #define NRALIAS         0x10            /* Fixup to alias */
        #define NRCHAIN         0x20            /* List of source offset follows */
                                                /* fixup record, source offset field */
                                                /* in fixup record contains number */
                                                /* of elements in list */

        /*
         *  Format of NR_FLAGS(x) and R32_FLAGS(x):
         *
         *       7 6 5 4 3 2 1 0  - bit no
         *       | | | |   | | |
         *       | | | |   | +-+--- Reference type
         *       | | | |   +------- Additive fixup
         *       | | | +----------- 32-bit Target Offset Flag (1 - 32-bit; 0 - 16-bit)
         *       | | +------------- 32-bit Additive Flag (1 - 32-bit; 0 - 16-bit)
         *       | +--------------- 16-bit Object/Module ordinal (1 - 16-bit; 0 - 8-bit)
         *       +----------------- 8-bit import ordinal (1 - 8-bit;
         *                                                0 - NR32BITOFF toggles
         *                                                    between 16 and 32 bit
         *                                                    ordinal)
         */

        #ifdef NEVER_INCLUDE_THE_FOLLWING
                    /* DEFINED in newexe.h !!! */
            #define NRRTYP          0x03            /* Reference type mask */
            #define NRRINT          0x00            /* Internal reference */
            #define NRRORD          0x01            /* Import by ordinal */
            #define NRRNAM          0x02            /* Import by name */
            #define NRADD           0x04            /* Additive fixup */
        #endif

        #define NRRENT          0x03            /* Internal entry table fixup */

        #define NR32BITOFF      0x10            /* 32-bit Target Offset */
        #define NR32BITADD      0x20            /* 32-bit Additive fixup */
        #define NR16OBJMOD      0x40            /* 16-bit Object/Module ordinal */
        #define NR8BITORD       0x80            /* 8-bit import ordinal */
        /*end*/

        /*
         *  Data structures for storing run-time fixups in linker virtual memory.
         *
         *  Each object has a list of Object Page Directories which specify
         *  fixups for given page. Each page has its own hash table which is
         *  used to detect fixups to the same target.
         */

        #define PAGEPERDIR      62
        #define LG2DIR          7


        typedef struct _OBJPAGEDIR
        {
            DWORD   next;                       /* Virtual pointer to next dir on list */
            WORD    ht[PAGEPERDIR];             /* Pointers to individual hash tables */
        }
            OBJPAGEDIR;

        /*
         *  OBJECT TABLE
         */

        /***ET+ o32_obj Object Table Entry */

        struct o32_obj                          /* Flat .EXE object table entry */
        {
            unsigned long       o32_size;       /* Object virtual size */
            unsigned long       o32_base;       /* Object base virtual address */
            unsigned long       o32_flags;      /* Attribute flags */
            unsigned long       o32_pagemap;    /* Object page map index */
            unsigned long       o32_mapsize;    /* Number of entries in object page map */
            unsigned long       o32_reserved;   /* Reserved */
        };


        #define O32_SIZE(x)     (x).o32_size
        #define O32_BASE(x)     (x).o32_base
        #define O32_FLAGS(x)    (x).o32_flags
        #define O32_PAGEMAP(x)  (x).o32_pagemap
        #define O32_MAPSIZE(x)  (x).o32_mapsize
        #define O32_RESERVED(x) (x).o32_reserved

        /*
         *  Format of O32_FLAGS(x)
         *
         *  High word of dword flag field is not used for now.
         *  Low word has the following format:
         *
         *  15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  - bit no
         *   |  |  |  |     | | | | | | | | | | |
         *   |  |  |  |     | | | | | | | | | | +--- Readable Object
         *   |  |  |  |     | | | | | | | | | +----- Writeable Object
         *   |  |  |  |     | | | | | | | | +------- Executable Object
         *   |  |  |  |     | | | | | | | +--------- Resource Object
         *   |  |  |  |     | | | | | | +----------- Object is Discardable
         *   |  |  |  |     | | | | | +------------- Object is Shared
         *   |  |  |  |     | | | | +--------------- Object has preload pages
         *   |  |  |  |     | | | +----------------- Object has invalid pages
         *   |  |  |  |     | | +------------------- Object is permanent and swappable
         *   |  |  |  |     | +--------------------- Object is permanent and resident
         *   |  |  |  |     +----------------------- Object is permanent and long lockable
         *   |  |  |  +----------------------------- 16:16 alias required (80x86 specific)
         *   |  |  +-------------------------------- Big/Default bit setting (80x86 specific)
         *   |  +----------------------------------- Object is conforming for code (80x86 specific)
         *   +-------------------------------------- Object I/O privilege level (80x86 specific)
         *
         */

        #define OBJREAD         0x0001L             /* Readable Object   */
        #define OBJWRITE        0x0002L             /* Writeable Object  */
        #define OBJRSRC         0x0008L             /* Resource Object   */
        #define OBJINVALID      0x0080L             /* Object has invalid pages  */
        #define LNKNONPERM      0x0600L             /* Object is nonpermanent - should be */
        #define OBJNONPERM      0x0000L             /* zero in the .EXE but LINK386 uses 6 */
        #define OBJPERM         0x0100L             /* Object is permanent and swappable */
        #define OBJRESIDENT     0x0200L             /* Object is permanent and resident */
        #define OBJCONTIG       0x0300L             /* Object is resident and contiguous */
        #define OBJDYNAMIC      0x0400L             /* Object is permanent and long locable */
        #define OBJTYPEMASK     0x0700L             /* Object type mask */
        #define OBJALIAS16      0x1000L             /* 16:16 alias required (80x86 specific)           */
        #define OBJBIGDEF       0x2000L             /* Big/Default bit setting (80x86 specific)        */
        #define OBJIOPL         0x8000L             /* Object I/O privilege level (80x86 specific)     */
        #if FOR_EXEHDR
        /*
         *  Name these flags differently for EXEHDR.EXE - avoid conflicts with 286 version
         */
        #define OBJDISCARD       0x0010L            /* Object is Discardable */
        #define OBJSHARED        0x0020L            /* Object is Shared */
        #define OBJPRELOAD       0x0040L            /* Object has preload pages  */
        #define OBJEXEC          0x0004L            /* Executable Object */
        #define OBJCONFORM       0x4000L            /* Object is conforming for code (80x86 specific)  */
        #else
        /*
         *  Life will be easier, if we keep the same names for the following flags:
         */
        #ifndef NSDISCARD
            #define NSDISCARD       0x0010L             /* Object is Discardable */
        #endif
        #ifndef NSMOVE
            #define NSMOVE          NSDISCARD           /* Moveable object is for sure Discardable */
        #endif
        #ifndef NSSHARED
            #define NSSHARED        0x0020L             /* Object is Shared */
        #endif
        #ifndef NSPRELOAD
            #define NSPRELOAD       0x0040L             /* Object has preload pages  */
        #endif
        #ifndef NSEXRD
            #define NSEXRD          0x0004L             /* Executable Object */
        #endif
        #ifndef NSCONFORM
            #define NSCONFORM       0x4000L             /* Object is conforming for code (80x86 specific)  */
        #endif
        #endif
        /*end*/

        /***ET+ o32_map - Object Page Map entry */

        struct o32_map                              /* Object Page Table entry */
        {
            unsigned long   o32_pagedataoffset;     /* file offset of page */
            unsigned short  o32_pagesize;           /* # bytes of page data */
            unsigned short  o32_pageflags;          /* Per-Page attributes */
        };


        #define GETPAGEIDX(x)    ((x).o32_pagedataoffset)

        #define PUTPAGEIDX(x,i)  ((x).o32_pagedataoffset = ((unsigned long)(i)))

        #define PUTPAGESIZ(x,i)  ((x).o32_pagesize = ((unsigned int)(i)))

        #define GETPAGESIZ(x)    ((x).o32_pagesize)

        #define PAGEFLAGS(x)    (x).o32_pageflags


        #define VALID           0x0000                /* Valid Physical Page in .EXE */
        #define ITERDATA        0x0001                /* Iterated Data Page */
        #define INVALID         0x0002                /* Invalid Page */
        #define ZEROED          0x0003                /* Zero Filled Page */
        #define RANGE           0x0004                /* Range of pages */
        #define ITERDATA2       0x0005                /* Iterated Data Page Type II */
        /*end*/

        /*
         *  RESOURCE TABLE
         */

        /***ET+ rsrc32 - Resource Table Entry */

        struct rsrc32                               /* Resource Table Entry */
        {
            unsigned short      type;               /* Resource type */
            unsigned short      name;               /* Resource name */
            unsigned long       cb;                 /* Resource size */
            unsigned short      obj;                /* Object number */
            unsigned long       offset;             /* Offset within object */
        };
        /*end*/


         /*
          * Iteration Record format for 'EXEPACK'ed pages.
          */
        struct LX_Iter
        {
            unsigned short LX_nIter;            /* number of iterations */
            unsigned short LX_nBytes;           /* number of bytes */
            unsigned char  LX_Iterdata;         /* iterated data byte(s) */
        };


        /*
         *  ENTRY TABLE DEFINITIONS
         */

        /***ET+ b32_bundle - Entry Table */

        struct b32_bundle
        {
            unsigned char       b32_cnt;        /* Number of entries in this bundle */
            unsigned char       b32_type;       /* Bundle type */
            unsigned short      b32_obj;        /* Object number */
        };                                      /* Follows entry types */

        struct e32_entry
        {
            unsigned char       e32_flags;      /* Entry point flags */
            union entrykind
            {
                RELOC_OFS       e32_offset;     /* 16-bit/32-bit offset entry */
                struct callgate
                {
                    unsigned short offset;      /* Offset in segment */
                    unsigned short callgate;    /* Callgate selector */
                }
                                e32_callgate;   /* 286 (16-bit) call gate */
                struct fwd
                {
                    unsigned short  modord;     /* Module ordinal number */
                    unsigned long   value;      /* Proc name offset or ordinal */
                }
                                e32_fwd;        /* Forwarder */
            }
                                e32_variant;    /* Entry variant */
        };



        #define B32_CNT(x)      (x).b32_cnt
        #define B32_TYPE(x)     (x).b32_type
        #define B32_OBJ(x)      (x).b32_obj

        #define E32_EFLAGS(x)   (x).e32_flags
        #define E32_OFFSET16(x) (x).e32_variant.e32_offset.offset16
        #define E32_OFFSET32(x) (x).e32_variant.e32_offset.offset32
        #define E32_GATEOFF(x)  (x).e32_variant.e32_callgate.offset
        #define E32_GATE(x)     (x).e32_variant.e32_callgate.callgate
        #define E32_MODORD(x)   (x).e32_variant.e32_fwd.modord
        #define E32_VALUE(x)    (x).e32_variant.e32_fwd.value

        #define FIXENT16        3
        #define FIXENT32        5
        #define GATEENT16       5
        #define FWDENT          7

        /*
         *  BUNDLE TYPES
         */

        #define EMPTY        0x00               /* Empty bundle */
        #define ENTRY16      0x01               /* 16-bit offset entry point */
        #define GATE16       0x02               /* 286 call gate (16-bit IOPL) */
        #define ENTRY32      0x03               /* 32-bit offset entry point */
        #define ENTRYFWD     0x04               /* Forwarder entry point */
        #define TYPEINFO     0x80               /* Typing information present flag */


        /*
         *  Format for E32_EFLAGS(x)
         *
         *       7 6 5 4 3 2 1 0  - bit no
         *       | | | | | | | |
         *       | | | | | | | +--- exported entry
         *       | | | | | | +----- uses shared data
         *       +-+-+-+-+-+------- parameter word count
         */

        #define E32EXPORT       0x01            /* Exported entry */
        #define E32SHARED       0x02            /* Uses shared data */
        #define E32PARAMS       0xf8            /* Parameter word count mask */

        /*
         *  Flags for forwarders only:
         */

        #define FWD_ORDINAL     0x01            /* Imported by ordinal */


        #pragma pack()       /* Restore default alignment */

        /*end*/

    #endif /* __EXE386__ */

#endif