blob: 63134142332d04cede48e69ce94eb2b5702ae747 (
plain) (
tree)
|
|
/*
* 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)
|