/* * 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)