590 lines
23 KiB
C
590 lines
23 KiB
C
/*
|
|
* 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 <DDK_VERSION> RESERVED FIELD */
|
|
USHORT DDB_Req_Device_Number; /* INIT <UNDEFINED_DEVICE_ID> */
|
|
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 <UNDEFINED_INIT_ORDER> */
|
|
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 */
|
|
}; |