/* * Title * * exe386.h * Wieslaw Kalkus * (C) Copyright Microsoft Corp 1988-1992 * 5 August 1988 * * Description * * Data structure definitions for the OS/2 * executable file format (flat model). * * Modification History * * 88/08/05 Wieslaw Kalkus Initial version */ #ifndef _VC_VER_INC #include "..\include\vcver.h" #endif /*_________________________________________________________________* | | | | | OS/2 .EXE FILE HEADER DEFINITION - 386 version 0:32 | | | |_________________________________________________________________| * */ #define BITPERWORD 16 #define BITPERBYTE 8 #define OBJPAGELEN 4096 #define E32MAGIC1 'L' /* New magic number "LE" */ #define E32MAGIC2 'E' /* New magic number "LE" */ #define E32MAGIC 0x454c /* New magic number "LE" */ #define E32RESBYTES1 0 /* First bytes reserved */ #define E32RESBYTES2 0 /* Second bytes reserved */ #define E32RESBYTES3 24 /* Third bytes reserved */ #define E32LEBO 0x00 /* Little Endian Byte Order */ #define E32BEBO 0x01 /* Big Endian Byte Order */ #define E32LEWO 0x00 /* Little Endian Word Order */ #define E32BEWO 0x01 /* Big Endian Word Order */ #define E32LEVEL 0L /* 32-bit EXE format level */ #define E32CPU286 0x001 /* Intel 80286 or upwardly compatibile */ #define E32CPU386 0x002 /* Intel 80386 or upwardly compatibile */ #define E32CPU486 0x003 /* Intel 80486 or upwardly compatibile */ struct e32_exe { /* New 32-bit .EXE header */ unsigned char e32_magic[2]; /* Magic number E32_MAGIC */ unsigned char e32_border; /* The byte ordering for the .EXE */ unsigned char e32_worder; /* The word ordering for the .EXE */ unsigned long e32_level; /* The EXE format level for now = 0 */ unsigned short e32_cpu; /* The CPU type */ unsigned short e32_os; /* The OS type */ unsigned long e32_ver; /* Module version */ unsigned long e32_mflags; /* Module flags */ unsigned long e32_mpages; /* Module # pages */ unsigned long e32_startobj; /* Object # for instruction pointer */ unsigned long e32_eip; /* Extended instruction pointer */ unsigned long e32_stackobj; /* Object # for stack pointer */ unsigned long e32_esp; /* Extended stack pointer */ unsigned long e32_pagesize; /* .EXE page size */ unsigned long e32_lastpagesize;/* Last page size in .EXE */ unsigned long e32_fixupsize; /* Fixup section size */ unsigned long e32_fixupsum; /* Fixup section checksum */ unsigned long e32_ldrsize; /* Loader section size */ unsigned long e32_ldrsum; /* Loader section checksum */ unsigned long e32_objtab; /* Object table offset */ unsigned long e32_objcnt; /* Number of objects in module */ unsigned long e32_objmap; /* Object page map offset */ unsigned long e32_itermap; /* Object iterated data map offset */ unsigned long e32_rsrctab; /* Offset of Resource Table */ unsigned long e32_rsrccnt; /* Number of resource entries */ unsigned long e32_restab; /* Offset of resident name table */ unsigned long e32_enttab; /* Offset of Entry Table */ unsigned long e32_dirtab; /* Offset of Module Directive Table */ unsigned long e32_dircnt; /* Number of module directives */ unsigned long e32_fpagetab; /* Offset of Fixup Page Table */ unsigned long e32_frectab; /* Offset of Fixup Record Table */ unsigned long e32_impmod; /* Offset of Import Module Name Table */ unsigned long e32_impmodcnt; /* Number of entries in Import Module Name Table */ unsigned long e32_impproc; /* Offset of Import Procedure Name Table */ unsigned long e32_pagesum; /* Offset of Per-Page Checksum Table */ unsigned long e32_datapage; /* Offset of Enumerated Data Pages */ unsigned long e32_preload; /* Number of preload pages */ unsigned long e32_nrestab; /* Offset of Non-resident Names Table */ unsigned long e32_cbnrestab; /* Size of Non-resident Name Table */ unsigned long e32_nressum; /* Non-resident Name Table Checksum */ unsigned long e32_autodata; /* Object # for automatic data object */ unsigned long e32_debuginfo; /* Offset of the debugging information */ unsigned long e32_debuglen; /* The length of the debugging info. in bytes */ unsigned long e32_instpreload;/* Number of instance pages in preload section of .EXE file */ unsigned long e32_instdemand; /* Number of instance pages in demand load section of .EXE file */ unsigned long e32_heapsize; /* Size of heap - for 16-bit apps */ unsigned char e32_res3[E32RESBYTES3 - 4 - 8]; /* Pad structure to 192 bytes */ unsigned long e32_winresoff ; unsigned long e32_winreslen ; unsigned short Dev386_Device_ID; /* Device ID for VxD */ unsigned short Dev386_DDK_Version; /* DDK version for VxD */ }; #define E32_MAGIC1(x) (x).e32_magic[0] #define E32_MAGIC2(x) (x).e32_magic[1] #define E32_BORDER(x) (x).e32_border #define E32_WORDER(x) (x).e32_worder #define E32_LEVEL(x) (x).e32_level #define E32_CPU(x) (x).e32_cpu #define E32_OS(x) (x).e32_os #define E32_VER(x) (x).e32_ver #define E32_MFLAGS(x) (x).e32_mflags #define E32_MPAGES(x) (x).e32_mpages #define E32_STARTOBJ(x) (x).e32_startobj #define E32_EIP(x) (x).e32_eip #define E32_STACKOBJ(x) (x).e32_stackobj #define E32_ESP(x) (x).e32_esp #define E32_PAGESIZE(x) (x).e32_pagesize #define E32_LASTPAGESIZE(x) (x).e32_lastpagesize #define E32_FIXUPSIZE(x) (x).e32_fixupsize #define E32_FIXUPSUM(x) (x).e32_fixupsum #define E32_LDRSIZE(x) (x).e32_ldrsize #define E32_LDRSUM(x) (x).e32_ldrsum #define E32_OBJTAB(x) (x).e32_objtab #define E32_OBJCNT(x) (x).e32_objcnt #define E32_OBJMAP(x) (x).e32_objmap #define E32_ITERMAP(x) (x).e32_itermap #define E32_RSRCTAB(x) (x).e32_rsrctab #define E32_RSRCCNT(x) (x).e32_rsrccnt #define E32_RESTAB(x) (x).e32_restab #define E32_ENTTAB(x) (x).e32_enttab #define E32_DIRTAB(x) (x).e32_dirtab #define E32_DIRCNT(x) (x).e32_dircnt #define E32_FPAGETAB(x) (x).e32_fpagetab #define E32_FRECTAB(x) (x).e32_frectab #define E32_IMPMOD(x) (x).e32_impmod #define E32_IMPMODCNT(x) (x).e32_impmodcnt #define E32_IMPPROC(x) (x).e32_impproc #define E32_PAGESUM(x) (x).e32_pagesum #define E32_DATAPAGE(x) (x).e32_datapage #define E32_PRELOAD(x) (x).e32_preload #define E32_NRESTAB(x) (x).e32_nrestab #define E32_CBNRESTAB(x) (x).e32_cbnrestab #define E32_NRESSUM(x) (x).e32_nressum #define E32_AUTODATA(x) (x).e32_autodata #define E32_DEBUGINFO(x) (x).e32_debuginfo #define E32_DEBUGLEN(x) (x).e32_debuglen #define E32_INSTPRELOAD(x) (x).e32_instpreload #define E32_INSTDEMAND(x) (x).e32_instdemand #define E32_HEAPSIZE(x) (x).e32_heapsize /* * Format of E32_MFLAGS(x): * * Low word has the following format: * * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no * | | | | | | | | * | | | | | | | +------- Per-Process Library Initialization * | | | | | | +----------- No Internal Fixups for Module in .EXE * | | | | | +------------- No External Fixups for Module in .EXE * | | | | +------------------- Incompatible with PM Windowing * | | | +--------------------- Compatible with PM Windowing * | | +----------------------- Uses PM Windowing API * | +-------------------------------- Module not Loadable * +-------------------------------------- Library Module */ #define E32NOTP 0x8000L /* Library Module - used as NENOTP */ #define E32NOLOAD 0x2000L /* Module not Loadable */ #define E32PMAPI 0x0300L /* Uses PM Windowing API */ #define E32PMW 0x0200L /* Compatible with PM Windowing */ #define E32NOPMW 0x0100L /* Incompatible with PM Windowing */ #define E32NOEXTFIX 0x0020L /* NO External Fixups in .EXE */ #define E32NOINTFIX 0x0010L /* NO Internal Fixups in .EXE */ #define E32LIBINIT 0x0004L /* Per-Process Library Initialization */ #define E32APPMASK 0x0700L /* Aplication Type Mask */ /* * Format of E32_MFLAGS(x): * * High word has the following format: * * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no * | | * | +--- Protected memory library module * +----- Device driver */ #define E32PROTDLL 0x10000L // Protected memory library module #define E32DEVICE 0x20000L // Device driver #define E32MODEXE 0x00000L // .EXE module #define E32MODDLL 0x08000L // .DLL module #define E32MODPROTDLL 0x18000L // Protected memory library module #define E32MODPDEV 0x20000L // Physical device driver #define E32MODVDEV 0x28000L // Virtual device driver #define E32MODVDEVDYN 0x38000L // Virtual device driver (dynamic) #define E32MODMASK 0x38000L // Module type mask /* * RELOCATION DEFINITIONS - RUN-TIME FIXUPS */ #pragma pack(1) /* This data must be packed */ typedef union _offset { unsigned short offset16; unsigned long offset32; } offset; /* 16-bit or 32-bit offset */ /***ET+ r32_rlc - Relocation item */ struct r32_rlc { /* Relocation item */ unsigned char nr_stype; /* Source type - shared with new_rlc */ unsigned char nr_flags; /* Flag byte - shared with new_rlc */ short r32_soff; /* Source page offset */ unsigned short r32_objmod; /* Target obj. no. or Module ordinal */ union targetid { /* BEGIN UNION */ unsigned long intref; /* Internal fixup offset */ unsigned long proc; /* Procedure name offset */ unsigned long ord; /* Procedure ordinal */ } r32_target; /* END UNION */ unsigned long addval; /* Value added to the address */ unsigned short r32_srccount; /* Number of chained fixup records */ unsigned short r32_chain; /* Chain head */ }; #pragma pack() /* Stop packing */ /* * In 32-bit .EXE file run-time relocations are written as varying size * records, so we need many size definitions. */ #define RINTSIZE16 8 #define RINTSIZE32 10 #define RORDSIZE 8 #define RNAMSIZE16 8 #define RNAMSIZE32 10 #define RADDSIZE16 10 #define RADDSIZE32 12 #if FALSE /* * Access macros defined in NEWEXE.H !!! */ #define NR_STYPE(x) (x).nr_stype #define NR_FLAGS(x) (x).nr_flags #endif #define R32_SOFF(x) (x).r32_soff #define R32_OBJNO(x) (x).r32_objmod #define R32_MODORD(x) (x).r32_objmod #define R32_OFFSET(x) (x).r32_target.intref #define R32_PROCOFF(x) (x).r32_target.proc #define R32_PROCORD(x) (x).r32_target.ord #define R32_ADDVAL(x) (x).addval #define R32_SRCCNT(x) (x).r32_srccount #define R32_CHAIN(x) (x).r32_chain /* * Format of NR_STYPE(x) * * 7 6 5 4 3 2 1 0 - bit no * | | | | | | * | | +-+-+-+--- Source type * | +----------- Fixup to 16:16 alias * +------------- List of source offset follows fixup record */ #if FALSE /* DEFINED in newexe.h !!! */ #define NRSTYP 0x0f /* Source type mask */ #define NRSBYT 0x00 /* lo byte (8-bits)*/ #define NRSSEG 0x02 /* 16-bit segment (16-bits) */ #define NRSPTR 0x03 /* 16:16 pointer (32-bits) */ #define NRSOFF 0x05 /* 16-bit offset (16-bits) */ #define NRPTR48 0x06 /* 16:32 pointer (48-bits) */ #define NROFF32 0x07 /* 32-bit offset (32-bits) */ #define NRSOFF32 0x08 /* 32-bit self-relative offset (32-bits) */ #endif #define NRSRCMASK 0x0f /* Source type mask */ #define NRALIAS 0x10 /* Fixup to alias */ #define NRCHAIN 0x20 /* List of source offset follows */ /* fixup record, source offset field */ /* in fixup record contains number */ /* of elements in list */ /* * Format of NR_FLAGS(x) and R32_FLAGS(x): * * 7 6 5 4 3 2 1 0 - bit no * | | | | | | | * | | | | | +-+--- Reference type * | | | | +------- Additive fixup * | | | +----------- 32-bit Target Offset Flag (1 - 32-bit; 0 - 16-bit) * | | +------------- 32-bit Additive Flag (1 - 32-bit; 0 - 16-bit) * | +--------------- 16-bit Object/Module ordinal (1 - 16-bit; 0 - 8-bit) * +----------------- 8-bit import ordinal (1 - 8-bit; * 0 - NR32BITOFF toggles * between 16 and 32 bit * ordinal) */ #if FALSE /* DEFINED in newexe.h !!! */ #define NRADD 0x04 /* Additive fixup */ #define NRRTYP 0x03 /* Reference type mask */ #define NRRINT 0x00 /* Internal reference */ #define NRRORD 0x01 /* Import by ordinal */ #define NRRNAM 0x02 /* Import by name */ #endif #define NRRENT 0x03 /* Internal entry table fixup */ #define NR32BITOFF 0x10 /* 32-bit Target Offset */ #define NR32BITADD 0x20 /* 32-bit Additive fixup */ #define NR16OBJMOD 0x40 /* 16-bit Object/Module ordinal */ #define NR8BITORD 0x80 /* 8-bit import ordinal */ /*end*/ /* * Data structures for storing run-time fixups in linker virtual memory. * * Each object has a list of Object Page Directories which specify * fixups for given page. Each page has its own hash table which is * used to detect fixups to the same target. */ #define PAGEPERDIR 62 #define LG2DIR 7 typedef struct _OBJPAGEDIR { DWORD next; /* Virtual pointer to next dir on list */ WORD ht[PAGEPERDIR]; /* Pointers to individual hash tables */ } OBJPAGEDIR; /* * OBJECT TABLE */ /***ET+ o32_obj Object Table Entry */ struct o32_obj /* Flat .EXE object table entry */ { unsigned long o32_size; /* Object virtual size */ unsigned long o32_base; /* Object base virtual address */ unsigned long o32_flags; /* Attribute flags */ unsigned long o32_pagemap; /* Object page map index */ unsigned long o32_mapsize; /* Number of entries in object page map */ unsigned long o32_reserved; /* Reserved */ }; #define O32_SIZE(x) (x).o32_size #define O32_BASE(x) (x).o32_base #define O32_FLAGS(x) (x).o32_flags #define O32_PAGEMAP(x) (x).o32_pagemap #define O32_MAPSIZE(x) (x).o32_mapsize #define O32_RESERVED(x) (x).o32_reserved /* * Format of O32_FLAGS(x) * * High word of dword flag field is not used for now. * Low word has the following format: * * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no * | | | | | | | | | | | | | | | * | | | | | | | | | | | | | | +--- Readable Object * | | | | | | | | | | | | | +----- Writeable Object * | | | | | | | | | | | | +------- Executable Object * | | | | | | | | | | | +--------- Resource Object * | | | | | | | | | | +----------- Object is Discardable * | | | | | | | | | +------------- Object is Shared * | | | | | | | | +--------------- Object has preload pages * | | | | | | | +----------------- Object has invalid pages * | | | | | | +------------------- Object is permanent and swappable * | | | | | +--------------------- Object is permanent and resident * | | | | +----------------------- Object is permanent and long lockable * | | | +----------------------------- 16:16 alias required (80x86 specific) * | | +-------------------------------- Big/Default bit setting (80x86 specific) * | +----------------------------------- Object is conforming for code (80x86 specific) * +-------------------------------------- Object I/O privilege level (80x86 specific) * */ #define OBJREAD 0x0001L /* Readable Object */ #define OBJWRITE 0x0002L /* Writeable Object */ #define OBJRSRC 0x0008L /* Resource Object */ #define OBJINVALID 0x0080L /* Object has invalid pages */ #define OBJNONPERM 0x0600L /* Object is nonpermanent - should be */ /* zero in the .EXE but internally we use 6 */ #define OBJPERM 0x0100L /* Object is permanent and swappable */ #define OBJRESIDENT 0x0200L /* Object is permanent and resident */ #define OBJCONTIG 0x0300L /* Object is resident and contiguous */ #define OBJDYNAMIC 0x0400L /* Object is permanent and long locable */ #define OBJTYPEMASK 0x0700L /* Object type mask */ #define OBJALIAS16 0x1000L /* 16:16 alias required (80x86 specific) */ #define OBJBIGDEF 0x2000L /* Big/Default bit setting (80x86 specific) */ #define OBJIOPL 0x8000L /* Object I/O privilege level (80x86 specific) */ #define OBJDISCARD 0x0010L /* Object is Discardable */ #define OBJSHARED 0x0020L /* Object is Shared */ #define OBJPRELOAD 0x0040L /* Object has preload pages */ #define OBJEXEC 0x0004L /* Executable Object */ #define OBJCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */ /* * Life will be easier, if we keep the same names for the following flags: */ #define NSDISCARD OBJDISCARD /* Object is Discardable */ #define NSMOVE NSDISCARD /* Moveable object is for sure Discardable */ #define NSSHARED OBJSHARED /* Object is Shared */ #define NSPRELOAD OBJPRELOAD /* Object has preload pages */ #define NSEXRD OBJEXEC /* Executable Object */ #define NSCONFORM OBJCONFORM /* Object is conforming for code (80x86 specific) */ /*end*/ /***ET+ o32_map - Object Page Map entry */ struct o32_map /* Object Page Map entry */ { unsigned char o32_pageidx[3]; /* 24-bit page # in .EXE file */ unsigned char o32_pageflags; /* Per-Page attributes */ }; #define GETPAGEIDX(x) ((((unsigned long)((x).o32_pageidx[0])) << BITPERWORD) + \ (((x).o32_pageidx[1]) << BITPERBYTE) + \ (x).o32_pageidx[2]) #define PUTPAGEIDX(x,i) ((x).o32_pageidx[0] = (unsigned char) ((unsigned long)(i) >> BITPERWORD), \ (x).o32_pageidx[1] = (unsigned char) ((i) >> BITPERBYTE), \ (x).o32_pageidx[2] = (unsigned char) ((i) & 0xff)) #define PAGEFLAGS(x) (x).o32_pageflags #define VALID 0x00 /* Valid Physical Page in .EXE */ #define ITERDATA 0x01 /* Iterated Data Page */ #define INVALID 0x02 /* Invalid Page */ #define ZEROED 0x03 /* Zero Filled Page */ #define RANGE 0x04 /* Range of pages */ /*end*/ /* * RESOURCE TABLE */ /***ET+ rsrc32 - Resource Table Entry */ struct rsrc32 /* Resource Table Entry */ { unsigned short type; /* Resource type */ unsigned short name; /* Resource name */ unsigned long cb; /* Resource size */ unsigned short obj; /* Object number */ unsigned long offset; /* Offset within object */ }; /*end*/ #pragma pack(1) /* This data must be packed */ /* * ENTRY TABLE DEFINITIONS */ /***ET+ b32_bundle - Entry Table */ struct b32_bundle { unsigned char b32_cnt; /* Number of entries in this bundle */ unsigned char b32_type; /* Bundle type */ unsigned short b32_obj; /* Object number */ }; /* Follows entry types */ struct e32_entry { unsigned char e32_flags; /* Entry point flags */ union entrykind { offset e32_offset; /* 16-bit/32-bit offset entry */ struct { unsigned short offset; /* Offset in segment */ unsigned short callgate; /* Callgate selector */ } e32_callgate; /* 286 (16-bit) call gate */ struct { unsigned short modord; /* Module ordinal number */ unsigned long value; /* Proc name offset or ordinal */ } e32_fwd; /* Forwarder */ } e32_variant; /* Entry variant */ }; #pragma pack() /* Stop packing */ #define B32_CNT(x) (x).b32_cnt #define B32_TYPE(x) (x).b32_type #define B32_OBJ(x) (x).b32_obj #define E32_EFLAGS(x) (x).e32_flags #define E32_OFFSET16(x) (x).e32_variant.e32_offset.offset16 #define E32_OFFSET32(x) (x).e32_variant.e32_offset.offset32 #define E32_GATEOFF(x) (x).e32_variant.e32_callgate.offset #define E32_GATE(x) (x).e32_variant.e32_callgate.callgate #define E32_MODORD(x) (x).e32_variant.e32_fwd.modord #define E32_VALUE(x) (x).e32_variant.e32_fwd.value #define FIXENT16 3 #define FIXENT32 5 #define GATEENT16 5 #define FWDENT 7 /* * BUNDLE TYPES */ #define EMPTY 0x00 /* Empty bundle */ #define ENTRY16 0x01 /* 16-bit offset entry point */ #define GATE16 0x02 /* 286 call gate (16-bit IOPL) */ #define ENTRY32 0x03 /* 32-bit offset entry point */ #define ENTRYFWD 0x04 /* Forwarder entry point */ #define TYPEINFO 0x80 /* Typing information present flag */ /* * Format for E32_EFLAGS(x) * * 7 6 5 4 3 2 1 0 - bit no * | | | | | | | | * | | | | | | | +--- exported entry * | | | | | | +----- uses shared data * +-+-+-+-+-+------- parameter word count */ #define E32EXPORT 0x01 /* Exported entry */ #define E32SHARED 0x02 /* Uses shared data */ #define E32PARAMS 0xf8 /* Parameter word count mask */ /* * Flags for forwarders only: */ #define FWD_ORDINAL 0x01 /* Imported by ordinal */ /*end*/ struct VxD_Desc_Block { ULONG DDB_Next; /* VMM RESERVED FIELD */ USHORT DDB_SDK_Version; /* INIT RESERVED FIELD */ USHORT DDB_Req_Device_Number; /* INIT */ UCHAR DDB_Dev_Major_Version; /* INIT <0> Major device number */ UCHAR DDB_Dev_Minor_Version; /* INIT <0> Minor device number */ USHORT DDB_Flags; /* INIT <0> for init calls complete */ UCHAR DDB_Name[8]; /* AINIT <" "> Device name */ ULONG DDB_Init_Order; /* INIT */ ULONG DDB_Control_Proc; /* Offset of control procedure */ ULONG DDB_V86_API_Proc; /* INIT <0> Offset of API procedure */ ULONG DDB_PM_API_Proc; /* INIT <0> Offset of API procedure */ ULONG DDB_V86_API_CSIP; /* INIT <0> CS:IP of API entry point */ ULONG DDB_PM_API_CSIP; /* INIT <0> CS:IP of API entry point */ ULONG DDB_Reference_Data; /* Reference data from real mode */ ULONG DDB_Service_Table_Ptr; /* INIT <0> Pointer to service table */ ULONG DDB_Service_Table_Size; /* INIT <0> Number of services */ ULONG DDB_Win32_Service_Table; /* INIT <0> Pointer to Win32 services */ ULONG DDB_Prev; /* INIT <'Prev'> Ptr to prev 4.0 DDB */ ULONG DDB_Reserved0; /* INIT <0> Reserved */ ULONG DDB_Reserved1; /* INIT <'Rsv1'> Reserved */ ULONG DDB_Reserved2; /* INIT <'Rsv2'> Reserved */ ULONG DDB_Reserved3; /* INIT <'Rsv3'> Reserved */ };