summaryrefslogblamecommitdiffstats
path: root/private/os2/ldr/exe386.h
blob: 63134142332d04cede48e69ce94eb2b5702ae747 (plain) (tree)
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





































































































































































































































































































































































































































































































































































































































































































































































































































































































                                                                                                                    
/*
 *  Title
 *
 *	exe386.h
 *	(C) Copyright Microsoft Corp 1988-1990
 *
 *  Description
 *
 *	Data structure definitions for the OS/2
 *	executable file format (flat model).
 *
 *  Modification History
 *
 *	90/07/30	Wieslaw Kalkus	Modified linear-executable
 *	88/08/05	Wieslaw Kalkus	Initial version
 */



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

#define BITPERBYTE	8	    /* Should never change		   */
#define BITPERWORD	16	    /* I'm not sure about this one         */
#define OBJPAGELEN	4096	    /* Memory page size in bytes	   */
#define E32RESBYTES1	1	    /* First bytes reserved		   */
#define E32RESBYTES2	0	    /* Second bytes reserved		   */
#define E32RESBYTES3	8	    /* Third bytes reserved		   */
#define	E32RESBYTES4	28
#define STD_EXTRA	7	    /* Standard number of extra information*/
				    /* units palced in the header; this    */
				    /* includes the following tables:	   */
				    /*	- export, import, resource,	   */
				    /*	  exception, security, fixup and   */
				    /*	  debug information		   */
#define EXP		0	    /* Export table position		   */
#define IMP		1	    /* Import table position		   */
#define RES		2	    /* Resource table position		   */
#define EXC		3	    /* Exception table position 	   */
#define SEC		4	    /* Security table position		   */
#define FIX		5	    /* Fixup table position		   */
#define DEB		6	    /* Debug table position		   */

struct info			    /* Extra information header block	   */
{
    unsigned long   rva;	    /* Virtual relative address of info    */
    unsigned long   size;	    /* Size of information block	   */
};


struct e32_exe			    /* LE 32-bit .EXE header		   */
{
    unsigned char   e32_magic[4];   /* Magic number E32_MAGIC		   */
    unsigned char   e32_bworder;    /* The byte/word ordering for the .EXE */
    unsigned char   e32_res1[E32RESBYTES1];
				    /* Reserved bytes - must be zero	   */
    unsigned short  e32_cpu;	    /* The CPU type			   */
    unsigned short  e32_os;	    /* The OS type			   */
    unsigned short  e32_subsys;     /* The subsystem type		   */
    unsigned short  e32_osmajor;    /* The operating system major ver. no. */
    unsigned short  e32_osminor;    /* The operating system minor ver. no. */
    unsigned short  e32_linkmajor;  /* The linker major version number	   */
    unsigned short  e32_linkminor;  /* The linker minor version number	   */
    unsigned short  e32_usermajor;  /* The user major version number	   */
    unsigned short  e32_userminor;  /* The user minor version number	   */
    unsigned long   e32_mflags;	    /* Module flags			   */
    unsigned long   e32_vpages;     /* Number of pages in memory image     */
    unsigned long   e32_filechksum; /* Checksum for entire file 	   */
    unsigned long   e32_entryrva;   /* Relative virt. addr. of entry point */

    unsigned long   e32_vbase;	    /* Virtual base address of module	   */
    unsigned long   e32_vsize;	    /* Virtual size of the entire image    */
    unsigned long   e32_hdrsize;    /* Header information size		   */
    unsigned long   e32_filealign;  /* Alignment factor used to 	   */
				    /* align/truncate image pages	   */
    unsigned long   e32_pagesize;   /* The size of one page for this module*/
    unsigned long   e32_timestamp;  /* Time the .EXE file was created/modified*/
    unsigned long   e32_stackmax;   /* Maximum stack size		   */
    unsigned long   e32_stackinit;  /* Initial committed stack size	   */
    unsigned long   e32_heapmax;    /* Maximum heap size		   */
    unsigned long   e32_heapinit;   /* Initial committed heap size	   */
    unsigned long   e32_objcnt;     /* Number of memory objects 	   */
    unsigned long   e32_objtab;     /* Object table offset		   */
    unsigned long   e32_dircnt;     /* Number of module directives	   */
    unsigned long   e32_dirtab;     /* Module format directives table off  */
    unsigned char   e32_res3[E32RESBYTES3];
				    /* Reserved bytes - must be zero	   */
    unsigned long   e32_rescnt;     /* Number of resources		   */
    unsigned long   e32_hdrextra;   /* Number of extra info units in header*/
    struct info	    e32_unit[STD_EXTRA];
				    /* Array of extra info units	   */
    unsigned char   e32_res4[E32RESBYTES4];
};


#define E32HDR_SIZE	    sizeof(struct e32_exe)

#define E32_MAGIC(x)	    ((unsigned short)((x).e32_magic[0]<<BITPERBYTE)|(x).e32_magic[1])
#define E32_MAGIC1(x)	    (x).e32_magic[0]
#define E32_MAGIC2(x)	    (x).e32_magic[1]
#define E32_BWORDER(x)	    (x).e32_bworder
#define E32_CPU(x)	    (x).e32_cpu
#define E32_OS(x)	    (x).e32_os
#define E32_SUBSYS(x)	    (x).e32_subsys
#define E32_OSMAJOR(x)	    (x).e32_osmajor
#define E32_OSMINOR(x)	    (x).e32_osminor
#define E32_LINKMAJOR(x)    (x).e32_linkmajor
#define E32_LINKMINOR(x)    (x).e32_linkminor
#define E32_USERMAJOR(x)    (x).e32_usermajor
#define E32_USERMINOR(x)    (x).e32_userminor
#define E32_MFLAGS(x)	    (x).e32_mflags
#define E32_VPAGES(x)	    (x).e32_vpages
#define E32_FILECHKSUM(x)   (x).e32_filechksum
#define E32_ENTRYRVA(x)	    (x).e32_entryrva
#define E32_VBASE(x)	    (x).e32_vbase
#define E32_VSIZE(x)	    (x).e32_vsize
#define E32_HDRSIZE(x)	    (x).e32_hdrsize
#define E32_FILEALIGN(x)    (x).e32_filealign
#define E32_PAGESIZE(x)	    (x).e32_pagesize
#define E32_TIMESTAMP(x)    (x).e32_timestamp
#define E32_STACKMAX(x)	    (x).e32_stackmax
#define E32_STACKINIT(x)    (x).e32_stackinit
#define E32_HEAPMAX(x)	    (x).e32_heapmax
#define E32_HEAPINIT(x)	    (x).e32_heapinit
#define E32_OBJCNT(x)	    (x).e32_objcnt
#define E32_OBJTAB(x)	    (x).e32_objtab
#define E32_DIRCNT(x)	    (x).e32_dircnt
#define E32_DIRTAB(x)	    (x).e32_dirtab
#define E32_RESCNT(x)	    (x).e32_rescnt
#define E32_HDREXTRA(x)	    (x).e32_hdrextra
#define E32_EXPTAB(x)	    (x).e32_unit[EXP].rva
#define E32_EXPSIZ(x)	    (x).e32_unit[EXP].size
#define E32_IMPTAB(x)	    (x).e32_unit[IMP].rva
#define E32_IMPSIZ(x)	    (x).e32_unit[IMP].size
#define E32_RESTAB(x)	    (x).e32_unit[RES].rva
#define E32_RESSIZ(x)	    (x).e32_unit[RES].size
#define E32_EXCTAB(x)	    (x).e32_unit[EXC].rva
#define E32_EXCSIZ(x)	    (x).e32_unit[EXC].size
#define E32_SECTAB(x)	    (x).e32_unit[SEC].rva
#define E32_SECSIZ(x)	    (x).e32_unit[SEC].size
#define E32_FIXTAB(x)	    (x).e32_unit[FIX].rva
#define E32_FIXSIZ(x)	    (x).e32_unit[FIX].size
#define E32_DEBTAB(x)	    (x).e32_unit[DEB].rva
#define E32_DEBSIZ(x)	    (x).e32_unit[DEB].size



/*
 *  Valid linear-executable signature:
 */

#define E32MAGIC1	'L'		/* New magic number  "LE" */
#define E32MAGIC2	'E'		/* New magic number  "LE" */
#define E32MAGIC	0x454c		/* New magic number  "LE" */

/*
 *  Format of E32_BWORDER(x):
 *
 *	7 6 5 4 3 2 1 0  - bit no
 *		    | |
 *		    | +--- Big Endian Byte Ordering (else Little Endian)
 *		    +----- Big Endian Word Ordering (else Little Endian)
 */

#define E32LEBO 	0x00		/* Little Endian Byte Order	 */
#define E32BEBO 	0x01		/* Big Endian Byte Order	 */
#define E32LEWO 	0x00		/* Little Endian Word Order	 */
#define E32BEWO 	0x02		/* Big Endian Word Order	 */

/*
 *  Valid CPU types:
 */

#define E32CPUUNKNOWN	0x000		/* Unknown CPU			       */
#define E32CPU286	0x001		/* Intel 80286 or upwardly compatibile */
#define E32CPU386	0x002		/* Intel 80386 or upwardly compatibile */
#define E32CPU486	0x003		/* Intel 80486 or upwardly compatibile */
#define E32CPU586	0x004		/* Intel 80586 or upwardly compatibile */
#define E32CPUi860	0x020		/* Intel i860 or upwardly compatibile  */
#define E32CPUixxx	0x021		/* Intel i??? or upwardly compatibile  */
#define E32CPUMIPS_I	0x040		/* MIPS Mark I (R2000, R3000)	       */
#define E32CPUMIPS_II	0x041		/* MIPS Mark II (R6000) 	       */
#define E32CPUMIPS_III	0x042		/* MIPS Mark II (R4000) 	       */

/*
 *  Target operating systems
 */

#define E32_UNKNOWN	NE_UNKNOWN	/* Unknown (any "new-format" OS) */
#define E32_OS2		NE_OS2		/* Microsoft/IBM OS/2 (default)  */
#define E32_WINDOWS	NE_WINDOWS	/* Microsoft Windows		 */
#define E32_DOS		NE_DOS4 	/* Microsoft MS-DOS		 */
#define E32_NT		0x4		/* NT				 */
#define E32_UNIX	0x5		/* UNIX 			 */


#ifndef FALSE

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

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

/*
 *  Target subsystems required to run module
 */

#define E32_SUB_UNKNOWN 0x0		/* Unknown subsystem		 */
#define E32_SUB_OS2	0x1		/* OS/2 subsystem		 */
#define E32_SUB_WINDOWS 0x2		/* Windows subsystem		 */
#define E32_SUB_NATIVE	0x4		/* NT native subsystem		 */
#define E32_SUB_POSIX	0x5		/* POSIX subsystem		 */


/*
 *  Format of E32_MFLAGS(x):
 *
 * 31	    25 24	16 15	    8	7	0
 *  #### #### | #### #### | #### #### | #### #### - bit no
 *  |||| ||||	|||| ||||   |||| ||||	|||| ||||
 *  |||| ||||	|||| ||||   |||| ||||	|||| ||++-- Reserved - must be zero
 *  |||| ||||	|||| ||||   |||| ||||	|||| |+---- Per-Process Library Initialization
 *  |||| ||||	|||| ||||   |||| ||||	|||| +----- Reserved - must be zero
 *  |||| ||||	|||| ||||   |||| ||||	|||+------- Resolved fixups have been removed
 *  |||| ||||	|||| ||||   |||| ||||	+++-------- Reserved - must be zero
 *  |||| ||||	|||| ||||   |||| |+++-------------- Application type
 *  |||| ||||	|||| ||||   |||+-+----------------- Reserved - must be zero
 *  |||| ||||	|||| ||||   ||+-------------------- Module not Loadable
 *  |||| ||||	|||| ||||   |+--------------------- Reserved - must be zero
 *  |||| ||||	|||| ||++---+---------------------- Module type
 *  ||++-++++---++++-++---------------------------- Reserved - must be zero
 *  |+--------------------------------------------- Per-Process Library Termination
 *  +---------------------------------------------- Reserved - must be zero
 *
 */


#define E32_LIBINIT	 0x0004L	/* Per-Process Library Initialization */
#define E32_NOINTFIX	 0x0010L	/* Resolved fixups have been removed  */

/*
 *  Application types:
 *
 *	0x000 - Illegal - reserved for future use
 *	0x100 - Incompatible with PM windowing
 *	0x200 - Compatible with PM windowing
 *	0x300 - Uses PM windowing API
 *	0x400 - Illegal - reserved for future use
 *	0x500 - Illegal - reserved for future use
 *	0x600 - Illegal - reserved for future use
 *	0x700 - Illegal - reserved for future use
 */

#define E32_NOPMW	0x0100L		/* Incompatible with PM Windowing  */
#define E32_PMW		0x0200L		/* Compatible with PM Windowing    */
#define E32_PMAPI	0x0300L		/* Uses PM Windowing API	   */
#define E32_APPMASK	0x0700L		/* Aplication Type Mask 	   */

#define E32_NOLOAD	0x2000L		/* Module not Loadable		   */

/*
 *  Module types:
 *
 *	0x00000 - Program module
 *	0x08000 - Dynamic-Link Library module
 *	0x10000 - Illegal - reserved for future use
 *	0x18000 - Illegal - reserved for future use
 *	0x20000 - Physical Device Driver module
 *	0x28000 - Virtual Device Driver module
 *	0x30000 - Illegal - reserved for future use
 *	0x38000 - Illegal - reserved for future use
 */

#define E32_MODEXE	0x00000L	/* Program module		   */
#define E32_MODDLL	0x08000L	/* Library Module - used as NENOTP */
#define E32_MODPDEV	0x20000L	/* Physical device driver	   */
#define E32_MODVDEV	0x28000L	/* Virtual device driver	   */
#define E32_MODMASK	0x38000L	/* Module type mask		   */

#define E32_NOFIXUPS	0x20000000L	/* Image has no fixups that reference the IAT or EAT */
#define E32_LIBTERM	0x40000000L	/* Per-Process library termination */
#define E32_PURE32	0x80000000L	/* Image is pure 32 bit 	   */

#define IsINSTINIT(x)	((x)&E32_LIBINIT)
#define IsNOTRELOC(x)	((x)&E32_NOINTFIX)
#define IsNOTGUI(x)	(((x)&E32_APPMASK)==E32_NOPMW)
#define IsGUICOMPAT(x)	(((x)&E32_APPMASK)==E32_PMW)
#define IsGUI(x)	(((x)&E32_APPMASK)==E32_PMAPI)
#define IsLOADABLE(x)	(!((x)&E32_NOLOAD))
#define IsAPLIPROG(x)	(((x)&E32_MODMASK)==E32_MODEXE)
#define IsDLL(x)	(((x)&E32_MODMASK)==E32_MODDLL)
#define IsPDEVICE(x)	(((x)&E32_MODMASK)==E32_MODPDEV)
#define IsVDEVICE(x)	(((x)&E32_MODMASK)==E32_MODVDEV)
#define NoFIXUPS(x)     ((x)&E32_NOFIXUPS)
#define IsINSTTERM(x)	((x)&E32_LIBTERM)
#define IsPURE32(x)	((x)&E32_PURE32)

#define SetINSTINIT(x)	((x)|=E32_LIBINIT)
#define SetNOTRELOC(x)	((x)|=E32_NOINTFIX)
#define SetNOTGUI(x)	((x)=((x)&~E32_APPMASK)|E32_NOPMW)
#define SetGUICOMPAT(x)	((x)=((x)&~E32_APPMASK)|E32_PMW)
#define SetGUI(x)	((x)=((x)&~E32_APPMASK)|E32_PMAPI)
#define SetNOTLOADABLE(x) (((x)|=E32_NOLOAD))
#define SetAPLIPROG(x)	((x)=((x)&~E32_MODMASK)|E32_MODEXE)
#define SetDLL(x)	((x)=((x)&~E32_MODMASK)|E32_MODDLL)
#define SetPDEVICE(x)	((x)=((x)&~E32_MODMASK)|E32_MODPDEV)
#define SetVDEVICE(x)	((x)=((x)&~E32_MODMASK)|E32_MODVDEV)
#define SetNOFIXUPS(x)  ((x)|=E32_NOFIXUPS)
#define SetINSTTERM(x)	((x)|=E32_LIBTERM)
#define SetPURE32(x)	((x)|=E32_PURE32)


/*
 *  OBJECT TABLE
 */

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

struct o32_obj				/* .EXE memory object table entry  */
{
    unsigned long	o32_rva;	/* Object relative virtual address */
    unsigned long	o32_vsize;	/* Virtual memory size		   */
    unsigned long	o32_pages;	/* Image pages offset		   */
    unsigned long	o32_psize;	/* Physical file size of init. data*/
    unsigned long	o32_flags;	/* Attribute flags for the object  */
    unsigned long	o32_reserved;
};

#define O32_OBJSIZE	sizeof(struct o32_obj)

#define O32_RVA(x)	(x).o32_rva
#define O32_VSIZE(x)	(x).o32_vsize
#define O32_PAGES(x)	(x).o32_pages
#define O32_PSIZE(x)	(x).o32_psize
#define O32_FLAGS(x)	(x).o32_flags


/*
 *  Format of O32_FLAGS(x)
 *
 * 31	    25 24	16 15	    8	7	0
 *  #### #### | #### #### | #### #### | #### #### - bit no
 *  |||| ||||	|||| ||||   |||| ||||	|||| ||||
 *  |||| ||||	|||| ||||   |||| ||||	|||| |||+-- Readable object
 *  |||| ||||	|||| ||||   |||| ||||	|||| ||+--- Writable object
 *  |||| ||||	|||| ||||   |||| ||||	|||| |+---- Executable object
 *  |||| ||||	|||| ||||   |||| ||||	|||| +----- Resource object
 *  |||| ||||	|||| ||||   |||| ||||	|||+------- Discardable object
 *  |||| ||||	|||| ||||   |||| ||||	||+-------- Shared object
 *  |||| ||||	|||| ||||   |||| ||||	|+--------- Reserved - must be zero
 *  |||| ||||	|||| ||||   |||| ||||	+---------- Trailing pages are invalid
 *  |||| ||||	|||| ||||   |||| ++++-------------- Object type
 *  |||| ||||	|||| ||||   |||+------------------- 16:16 Alias required
 *  |||| ||||	|||| ||||   ||+-------------------- Big/Default bit setting
 *  |||| ||||	|||| ||||   |+--------------------- Object is conformin for code
 *  |||| ||||	|||| ||||   +---------------------- Object has I/O privilege level
 *  |||| ||||	|||| |||+-------------------------- Object must not be cached
 *  |||| ||||   |||| ||+--------------------------- Debug object
 *  ++++-++++---++++-+++--------------------------- Reserved - must be zero
 *
 */

#define OBJ_READ	0x0001L 	/* Readable Object		     */
#define OBJ_WRITE	0x0002L 	/* Writeable Object		     */
#define OBJ_EXEC	0x0004L		/* Executable Object		     */
#define OBJ_RSRC	0x0008L 	/* Resource Object		     */

#define OBJ_DISCARD	0x0010L		/* Object is Discardable			  */
#define OBJ_SHARED	0x0020L		/* Object is Shared				  */
#define OBJ_INVALID	0x0080L 	/* Object has trailing invalid pages */

/*
 *  Object types:
 *
 *	0x0000 - object is nonpermanent or normal EXE, DLL object
 *	0x0100 - object is permanent  (FDSs, VDDs, PDDs only)
 *	0x0200 - object is resident   (FDSs, VDDs, PDDs only)
 *	0x0300 - object is contiguous (FDSs, VDDs, PDDs only)
 *	0x0400 - object is dynamic    (FDSs, VDDs, PDDs only)
 *	0x0500 - illegal - reserved for future use
 *	0x0600 - illegal - reserved for future use
 *	0x0700 - illegal - reserved for future use
 *	0x0800 - object reserves space for call-gates
 *	0x0900 - illegal - reserved for future use
 *	0x0a00 - illegal - reserved for future use
 *	0x0b00 - illegal - reserved for future use
 *	0x0c00 - illegal - reserved for future use
 *	0x0d00 - illegal - reserved for future use
 *	0x0e00 - illegal - reserved for future use
 *	0x0f00 - illegal - reserved for future use
 *
 */

#define OBJ_NONPERM	0x0000L		/* Object is nonpermanent		*/
#define OBJ_PERM	0x0100L 	/* Object is permanent and swappable	*/
#define OBJ_RESIDENT	0x0200L 	/* Object is permanent and resident	*/
#define OBJ_CONTIG	0x0300L 	/* Object is resident and contiguous	*/
#define OBJ_DYNAMIC	0x0400L 	/* Object is dynamic			*/
#define OBJ_GATE	0x0800L 	/* Object reserves space for call-gates */
#define OBJ_TYPEMASK	0x0f00L		/* Object type mask			*/


#define OBJ_ALIAS16	0x1000L 	/* 16:16 alias required (80x86 specific)       */
#define OBJ_BIGDEF	0x2000L 	/* Big/Default bit setting (80x86 specific)    */
#define OBJ_CONFORM	0x4000L		/* Object is conforming for code (80x86 specific) */
#define OBJ_IOPL	0x8000L 	/* Object I/O privilege level (80x86 specific) */
#define OBJ_CACHE	0x10000L	/* Object must be cached		       */
#define OBJ_DEBUG       0x20000L        /* Object describes debugger information */

#define IsREADABLE(x)	((x)&OBJ_READ)
#define IsWRITEABLE(x)	((x)&OBJ_WRITE)
#define IsEXECUTABLE(x) ((x)&OBJ_EXEC)
#define IsRESOURCE(x)	((x)&OBJ_RSRC)
#define IsDISCARDABLE(x) ((x)&OBJ_DISCARD)
#define IsSHARED(x)	((x)&OBJ_SHARED)
#define IsINVALID(x)	((x)&OBJ_INVALID)
#define IsNONPERM(x)	(((x)&OBJ_TYPEMASK)==OBJ_NONPERM)
#define IsPERMANENT(x)	(((x)&OBJ_TYPEMASK)==OBJ_PERM)
#define IsRESIDENT(x)	(((x)&OBJ_TYPEMASK)==OBJ_RESIDENT)
#define IsCONTIG(x)	(((x)&OBJ_TYPEMASK)==OBJ_CONTIG)
#define IsDYNAMIC(x)	(((x)&OBJ_TYPEMASK)==OBJ_DYNAMIC)
#define IsGATERESERV(x)	(((x)&OBJ_TYPEMASK)==OBJ_GATE)
#define ObjTYPE(x)      ((x)&OBJ_TYPEMASK)
#define IsALIAS16(x)	((x)&OBJ_ALIAS16)
#define IsBIGDEF(x)	((x)&OBJ_BIGDEF)
#define IsCONFORMING(x) ((x)&OBJ_CONFORM)
#define IsIOPL(x)	((x)&OBJ_IOPL)
#define IsCACHED(x)	((x)&OBJ_CACHE)
#define IsDEBUG(x)      ((x)&OBJ_DEBUG)

#define SetREADABLE(x)	 ((x)|=OBJ_READ)
#define SetWRITABLE(x)	 ((x)|=OBJ_WRITE)
#define SetEXECUTABLE(x) ((x)|=OBJ_EXEC)
#define SetRESOURCE(x)	 ((x)|=OBJ_RSRC)
#define SetDISCARABLE(x) ((x)|=OBJ_DISCARD)
#define SetSHARED(x)	 ((x)|=OBJ_SHARED)
#define SetINVALID(x)	 ((x)|=OBJ_INVALID)
#define SetNONPERM(x)	 ((x)=((x)&~OBJ_TYPEMASK)|OBJ_NONPERM)
#define SetPERMANENT(x)	 ((x)=((x)&~OBJ_TYPEMASK)|OBJ_PERM)
#define SetRESIDENT(x)	 ((x)=((x)&~OBJ_TYPEMASK)|OBJ_RESIDENT)
#define SetCONTIG(x)	 ((x)=((x)&~OBJ_TYPEMASK)|OBJ_CONTIG)
#define SetDYNAMIC(x)	 ((x)=((x)&~OBJ_TYPEMASK)|OBJ_DYNAMIC)
#define SetGATERESERV(x) ((x)=((x)&~OBJ_TYPEMASK)|OBJ_GATE)
#define SetALIAS16(x)	 ((x)|=OBJ_ALIAS16)
#define SetBIGDEF(x)	 ((x)|=OBJ_BIGDEF)
#define SetCONFORMING(x) ((x)|=OBJ_CONFORM)
#define SetIOPL(x)	 ((x)|=OBJ_IOPL)
#define SetCACHED(x)	 ((x)|=OBJ_CACHE)
#define SetDEBUG(x)      ((x)|=OBJ_DEBUG)

/*
 *  MODULE FORMAT DIRECTIVES TABLE
 */

struct FmtDir
{
    unsigned short  dir;		/* Directive number		   */
    unsigned short  reserved;
    unsigned long   offset;		/* Directive data offset	   */
    unsigned long   length;		/* Directive data length	   */
};

#define FMTDIR_SIZE	sizeof(struct FmtDir)

#define DIRECTIVE(x)	(x).dir
#define DIR_OFF(x)	(x).offset
#define DIR_LEN(x)	(x).length

/*
 *  Directive numbers
 */

#define OS2LDR16	0x200
#define OS2RSRCNT	0x300
#define OS2FIXMAP       0x400

struct ComDir
{
    unsigned long       stackobj;
    unsigned long       autods;
};

#define COMDIR_SIZE     sizeof(struct ComDir)


/*
 *  EXPORT ADDRESS TABLE - Previously called entry table
 */

struct ExpHdr				/* Export directory table	   */
{
    unsigned long	exp_flags;	/* Export table flags		   */
    unsigned long	exp_ver;	/* Version stamp		   */
    unsigned long	exp_size;	/* Export table size		   */
    unsigned long	exp_dllname;	/* Offset to the DLL name	   */
    unsigned long	exp_ordbase;	/* First valid ordinal		   */
    unsigned long	exp_eatcnt;	/* Number of EAT entries	   */
    unsigned long	exp_namecnt;	/* Number of exported names	   */
    unsigned long	exp_eat;	/* Export Address Table offset	   */
    unsigned long	exp_name;	/* Export name pointers table off  */
    unsigned long	exp_ordinal;	/* Export ordinals table offset    */
};

#define EXPHDR_SIZE	sizeof(struct ExpHdr)

#define EXP_FLAGS(x)	(x).exp_flags
#define EXP_DLLNAME(x)	(x).exp_dllname
#define EXP_VER(x)	(x).exp_ver
#define EXP_SIZE(x)	(x).exp_size
#define EXP_ORDBASE(x)	(x).exp_ordbase
#define EXP_EATCNT(x)	(x).exp_eatcnt
#define EXP_NAMECNT(x)	(x).exp_namecnt
#define EXP_EAT(x)	(x).exp_eat
#define EXP_NAME(x)	(x).exp_name
#define EXP_ORDINAL(x)	(x).exp_ordinal

/*
 *  EXPORT ADDRESS TABLE MASKS
 */

#define ESCAPE_BIT	0x80000000L	/* Escape bit in export address	   */
#define ADDR_MASK	0x7fffffffL	/* Export address mask		   */
#define VALUE_MASK	0x3fffffffL	/* Value mask			   */

/*
 *  ENTRY TYPES - TT field values
 */

#define AUX_DATA	0x40000000L	/* Auxiliary data present	   */

#define IsESCAPED(x)	((x)&ESCAPE_BIT)
#define IsAUXDATA(x)	((x)&AUX_DATA)

#define SetESCAPE(x)	((x)|=ESCAPE_BIT)
#define SetAUXDATA(x)	((x)|=AUX_DATA)
#define SetVALUE(x,v)	((x)|=((v)&VALUE_MASK))

/*
 *  AUXILIARY DATA TYPES
 */

#define ABS_DATA	0x00
#define INT_GATE	0x01
#define EXT_GATE	0x02
#define FORWARDER	0x03

/*
 *  AUXILIARY DATA ENTRIES
 */

#pragma pack(1)

struct AuxData
{
    unsigned char  dataType;
    unsigned char  reserved;
    union
    {
	struct AbsData
	{
	    unsigned short  reserved;
	    unsigned long   val;
	}
		    abs;
	struct GateData
	{
	    unsigned char   obj;
	    unsigned char   parm;
	    unsigned short  off;
	    unsigned short  sel;
	}
		    gate;
	struct FwdData
	{
	    unsigned short  idx;
	    unsigned long   iat;
	}
		    fwd;
    }
	data;
};

#pragma pack()

#define DATA_TYP(x)	(x).dataType
#define ABS_VAL(x)	(x).data.abs.val
#define GATE_OBJ(x)	(x).data.gate.obj
#define GATE_PARM(x)	(x).data.gate.parm
#define GATE_OFF(x)	(x).data.gate.off
#define GATE_SEL(x)	(x).data.gate.sel
#define FWD_IDX(x)	(x).data.fwd.idx
#define FWD_IAT(x)	(x).data.fwd.iat


/*
 *  IMPORT MODULE DESCRIPTOR TABLE
 */

struct ImpHdr				/* Import directory table	   */
{
    unsigned long	imp_flags;	/* Import table flags		   */
    unsigned long	imp_ver;	/* Version stamp		   */
    unsigned long       imp_reserved;
    unsigned long	imp_dllname;	/* Offset to the DLL name	   */
    unsigned long	imp_address;	/* Import address table offset	   */
};

#define IMPHDR_SIZE	sizeof(struct ImpHdr)

#define IMP_FLAGS(x)	(x).imp_flags
#define IMP_VER(x)	(x).imp_ver
#define IMP_DLLNAME(x)	(x).imp_dllname
#define IMP_ADDRESS(x)	(x).imp_address

/*
 *  Format of IMP_FLAGS(x)
 *
 * 31	    25 24	16 15	    8	7	0
 *  #### #### | #### #### | #### #### | #### #### - bit no
 *  |||| ||||	|||| ||||   |||| ||||	|||| ||||
 *  |||| ||||	|||| ||||   |||| ||||	|||| |||+-- Copy of the IAT in header
 *  ++++-++++---++++-++++---++++-++++---++++-+++--- Reserved - must be zero
 *
 */

#define HDRIAT          0x01

#define IsHDRIAT(x)     ((x)&HDRIAT)

#define SetHDRIAT(x)    ((x)|=HDRIAT)


struct ImpMod
{
    unsigned long	im_offset;	/* Imported module name table offset	*/
    unsigned long	im_vaddr;	/* Import Address table virtual address */
};

#define IMPMOD_SIZE	sizeof(struct ImpMod)

#define IM_OFFSET(x)	(x).im_offset
#define IM_VADDR(x)	(x).im_vaddr

/*
 *  IMPORT PROCEDURE NAME TABLE
 */

struct ImpProc
{
    unsigned short  ip_hint;		/* Hint value				   */
    char	    ip_name[1]; 	/* Zero terminated imported procedure name */
};

#define IP_HINT(x)  (x).ip_hint;

/*
 *  IMPORT ADDRESS TABLE
 */

/*
 *  Valid import address types:
 *
 *	0x00000000 - 0:32 Offset - Flat offset
 *	0x20000000 - 16:16 non-FLAT, non-gate pointer
 *	0x40000000 - 16:16 gate pointer - Callgate needed if used
 *	0x60000000 - Illegal - reserved for future use
 *
 */

#define IMPORD_MASK	0x1fffffffL	/* Ordinal number mask		    */
#define IMPOFF_MASK	0x1fffffffL	/* Import data offset mask	    */
#define IMPTYPE_MASK	0x60000000L	/* Import address type mask	    */
#define ORD_BIT 	0x80000000L	/* Import by ordinal bit	    */

#define IMP_FLATOFF	0x00000000L	/* FLAT offset			    */
#define IMP_ALIAS	0x20000000L	/* 16:16 non-FLAT, non-gate pointer */
#define IMP_GATE	0x40000000L	/* 16:16 gate pointer		    */

#define IsIMPBYORD(x)	((x)&ORD_BIT)
#define IsFLATIMP(x)	(!((x)&IMPTYPE_MASK))
#define IsALIASIMP(x)	(((x)&IMPTYPE_MASK)==IMP_ALIAS)
#define IsGATEIMP(x)	(((x)&IMPTYPE_MASK)==IMP_GATE)

/*
 *  RESOURCE TABLE
 */

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

struct ResDir
{
    unsigned long   dir_flags;
    unsigned long   dir_ver;
    unsigned long   dir_size;
    unsigned short  dir_namecnt;
    unsigned short  dir_idcnt;
};


struct ResDirEntry
{
    unsigned long   dir_name;
    unsigned long   dir_data;
};

struct ResDirStrEntry
{
    unsigned short  str_len;
    char	    ast_ascii[1];
};

struct ResData
{
    unsigned long   res_data;
    unsigned long   res_size;
    unsigned long   res_codepage;
    unsigned long   res_reserved;
};

/*end*/


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


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

struct r32_rlc
{
    unsigned short  flags;
    unsigned char   cnt;
    unsigned char   obj;
};


#define R32_FLAGS(x)		(x).flags
#define R32_CNT(x)		(x).cnt
#define R32_OBJ(x)		(x).obj


/*
 *  Format of R32_FLAGS   - relocation flags
 *
 *  15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  - bit no
 *   |	|  |  |	 |  | | | | | | | | | | |
 *   |	|  |  |	 |  | | | | | | | +-+-+-+--- Source type
 *   |	|  |  |	 |  | | | | | | +----------- Fixup to 16:16 alias
 *   |	|  |  |	 |  | | | | | +------------- Reserved - must be zero
 *   |	|  |  |	 |  | | | | +--------------- Fixup data present
 *   |	|  |  |	 |  | | | +----------------- Reserved - must be zero
 *   |	|  |  |  |  | +-+------------------- Reference type
 *   |	|  |  |  |  +----------------------- Target has IOPL - valid only for non-aliased selector fixups
 *   |	|  |  |  +-------------------------- Target is CODE (else DATA) - valid only for non-aliased selector fixups
 *   |	+--+--+----------------------------- Reserved - must be zero
 *   +-------------------------------------- Escaped fixup
 */

/*
 *  Valid source types:
 *
 *	0x00 - Byte fixup (8-bits)
 *	0x01 - Align fixup - nop used to skip 2 bytes
 *	0x02 - 16-bit Selector fixup (16-bits)
 *	0x03 - 16:16 Pointer fixup (32-bits)
 *	0x04 - Illegal - reserved for future use
 *	0x05 - 16-bit Offset fixup (16-bits)
 *	0x06 - 16:32 Pointer fixup (48-bits)
 *	0x07 - 32-bit Offset fixup (32-bits)
 *	0x08 - 32-bit Self-relative offset fixup (32-bits)
 *	0x09 - Illegal - reserved for future use
 *	0x0a - Illegal - reserved for future use
 *	0x0b - Illegal - reserved for future use
 *	0x0c - Illegal - reserved for future use
 *	0x0d - Illegal - reserved for future use
 *	0x0e - Illegal - reserved for future use
 *	0x0f - Illegal - reserved for future use
 */


#define R32_BYTE    0x0000
#define R32_ALIGN   0x0001
#define R32_SEL     0x0002
#define R32_PTR32   0x0003
#define R32_OFF16   0x0005
#define R32_PTR48   0x0006
#define R32_OFF32   0x0007
#define R32_SOFF32  0x0008
#define R32_SRCMASK 0x000f

#define IsBYTE(x)   (((x)&R32_SRCMASK)==R32_BYTE)
#define IsALIGN(x)  (((x)&R32_SRCMASK)==R32_ALIGN)
#define IsSEL(x)    (((x)&R32_SRCMASK)==R32_SEL)
#define IsPTR32(x)  (((x)&R32_SRCMASK)==R32_PTR32)
#define IsOFF16(x)  (((x)&R32_SRCMASK)==R32_OFF16)
#define IsPTR48(x)  (((x)&R32_SRCMASK)==R32_PTR48)
#define IsOFF32(x)  (((x)&R32_SRCMASK)==R32_OFF32)
#define IsSOFF32(x) (((x)&R32_SRCMASK)==R32_SOFF32)

#define R32_ALIAS   0x0010		/* Fixup to alias		     */
#define R32_FIXDATA 0x0040		/* Fixup data present		     */
#define R32_IOPL    0x0080		/* Fixup Source has IOPL and is not conforming */


#define IsALIAS(x)   ((x)&R32_ALIAS)
#define IsFIXDATA(x) ((x)&R32_FIXDATA)
#define IsSRCIOPL(x) ((x)&R32_IOPL)

/*
 *  Reference types:
 *
 *	0x0000 - internal reference
 *	0x0100 - Imported reference by ordinal or name
 *	0x0200 - Illegal - reserved for future use
 *	0x0300 - Internal reference via export address table
 *
 */

#define R32_INTER	0x0000		/* Internal reference	      */
#define R32_IMPORT	0x0100		/* Imported reference	      */
#define R32_ENTRY	0x0300		/* Internal entry table fixup */
#define R32_REFMASK	0x0300		/* Reference type mask	      */

#define IsINTERNAL(x)	(((x)&R32_REFMASK)==R32_INTER)
#define IsIMPORT(x)	(((x)&R32_REFMASK)==R32_IMPORT)
#define IsENTRY(x)	(((x)&R32_REFMASK)==R32_ENTRY)

#define TGT_IOPL	0x0400		/* Target has IOPL	      */
#define TGT_CODE	0x0800		/* Target is CODE	      */

#define IsTGTIOPL(x)	((x)&TGT_IOPL)
#define IsTGTCODE(x)	((x)&TGT_CODE)

#define R32_ESCAPE      0x8000
#define IsESCAPEFIX(x)  ((x)&R32_ESCAPE)

/*end*/


/*
 *  DEBUG INFORMATION
 */

struct	DbgDir
{
    unsigned long   dbg_flags;
    unsigned long   dbg_ver;
    unsigned long   dbg_size;
    unsigned long   dbg_type;
    unsigned long   dbg_lva;
    unsigned long   dbg_seek;
};

#define DBG_FLAGS(x)	(x).dbg_flags
#define DBG_TYPE(x)	(x).dbg_type
#define DBG_VER(x)	(x).dbg_ver
#define DBG_LVA(x)	(x).dbg_lva
#define DBG_SIZE(x)	(x).dbg_size
#define DBG_SEEK(x)     (x).dbg_seek
#define DBGDIR_SIZE     sizeof(struct DbgDir)