mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
870 lines
29 KiB
870 lines
29 KiB
/*
|
|
* 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)
|