summaryrefslogtreecommitdiffstats
path: root/private/os2/ldr/exe386.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/os2/ldr/exe386.h870
1 files changed, 870 insertions, 0 deletions
diff --git a/private/os2/ldr/exe386.h b/private/os2/ldr/exe386.h
new file mode 100644
index 000000000..631341423
--- /dev/null
+++ b/private/os2/ldr/exe386.h
@@ -0,0 +1,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)