/* SCCSID = @(#)ldrvars.h 13.100 90/10/11 */ /* * Microsoft Confidential * * Copyright (c) Microsoft Corporation 1987, 1989 * * All Rights Reserved */ /* INT32 */ /* XLATOFF */ extern CHAR ldrLibPathBuf[]; extern PCHAR ldrpLibPath; extern ULONG SizeOfldrLibPathBuf; typedef unsigned short VMHOB; /* not including vmexport.h */ /***ET+ ldrmte_t - MTE */ struct ldrmte_s { uchar_t mte_magic[2]; /* Magic number E32_MAGIC */ ushort_t mte_usecnt; /* count of moudules using us */ ulong_t mte_mflags; /* Module flags */ ulong_t mte_mflags2; /* extension flags word */ ulong_t mte_modname; /* pointer to resident module name */ ulong_t mte_impmodcnt; /* Num of entries Import Modules */ ulong_t mte_modptrs; /* pointer to module pointers table */ struct ldrdld_s *mte_dldchain; /* pointer to chain of modules loaded by DosLoadModule() */ ushort_t mte_handle; /* the handle for this mte */ HANDLE mte_sfn; /* file system number for open file */ struct ldrmte_s *mte_link; /* link to next mte */ struct ldrsmte_s *mte_swapmte; /* link to swappable mte */ }; typedef struct ldrmte_s ldrmte_t; /* Swappable Module table entry */ struct ldrsmte_s { ulong_t smte_eip; /* Starting address for module */ ulong_t smte_stackbase; /* Stack base */ ulong_t smte_stackinit; /* Init commited stack */ ulong_t smte_objtab; /* Object table offset */ ulong_t smte_objcnt; /* Number of objects in module */ ulong_t smte_fpagetab; /* Offset fixup pg tab for 32-bit */ ulong_t smte_expdir; /* Export directory offset */ ulong_t smte_impdir; /* Import directory offset */ ulong_t smte_fixtab; /* Fixup record table offset */ ulong_t smte_rsrctab; /* Offset of Resource Table */ ulong_t smte_rsrccnt; /* count of resources */ ulong_t smte_filealign; /* Alignment factor */ ulong_t smte_vbase; /* Virtual base address of module */ ulong_t smte_heapsize; /* use for converted 16-bit modules */ ulong_t smte_autods; /* Object # for automatic data obj */ ulong_t smte_iat; /* pointer to import address table */ ulong_t smte_debuginfo; /* Offset of the debugging info */ ulong_t smte_debuglen; /* Len of the debug info in bytes */ ulong_t smte_delta; /* difference in load address */ ulong_t smte_pfilecache; /* Pointer to file cache for */ ulong_t smte_path; /* full pathname */ ushort_t smte_pathlen; /* length of full pathname */ ushort_t smte_dyntrchndl; /* used by dyn trace */ ushort_t smte_semcount; /* Count of threads waiting on MTE semaphore. 0=> semaphore is free */ ushort_t smte_semowner; /* Slot number of the owner of MTE semaphore */ ulong_t smte_nrestab; /* Offset of non-resident tb 16-bit */ ulong_t smte_cbnrestab; /* size of non-resident tb 16-bit */ ulong_t smte_csegpack; /* count of segments to pack */ ulong_t smte_ssegpack; /* size of object for seg packing */ ulong_t smte_spaddr; /* virtual address of packed obj */ ushort_t smte_NEflags; /* Orginal flags from NE header */ ushort_t smte_NEexpver; /* Expver from NE header */ ushort_t smte_NEexetype; /* Exetype from NE header */ ushort_t smte_NEflagsothers;/* Flagsothers from NE header */ }; typedef struct ldrsmte_s ldrsmte_t; /* Swappable Module table entry */ /* * Defines for 16-bit loading * overlay using unused fields of a (NE) 16-bit MTE. */ #define smte_stackobj smte_stackbase /* Object # for stack pointer */ #define smte_esp smte_stackinit /* Extended stack pointer */ #define smte_smtesize smte_fpagetab /* size of swappable heap debug use */ #define smte_enttab smte_expdir /* Offset of entry table */ #define smte_impproc smte_impdir /* Offset of import procedure tb */ #define smte_restab smte_fixtab /* Offset of resident name table */ #define smte_alignshift smte_filealign /* File alignment */ #define smte_impmod smte_iat /* Offset of import module table */ #define smte_stacksize smte_debuglen /* Size of stack */ #define smte_startobj smte_delta /* Object # for instruction pointer */ /* * Defines for 32-bit loading * overlay using unused fields of a (LE) 32-bit MTE */ #define smte_iatsize smte_spaddr /* Size of IAT */ #define smte_mpages smte_ssegpack /* number of pages in module */ #define smte_fixupsize smte_csegpack /* fixup table size */ #define smte_vddfixaddr smte_cbnrestab /* vdd fixup address */ /***LK+ Definitions for mte_mflags * * USED and INGRAPH are used by the graph traversl routines. If * the loader semaphore is clear, these bits must both be clear. * See traversal routines for more. * * MTE_INTNL_MASK is the set of bits which are used by the kernel. * These bits are cleared when a module is finished loading. * * LDRINVALID and MTEVALID are overloaded. Once an mte is linked * into the chain, this bit is used to indicate (if set) that the * mte contains valid information that demand loaders (who are not * excluded by the loader semaphore) may examine. * */ #define NOAUTODS 0x00000000 /* No Auto DS exists */ #define SOLO 0x00000001 /* Auto DS is shared */ #define INSTANCEDS 0x00000002 /* Auto DS is not shared */ #define INSTLIBINIT 0x00000004 /* Per-instance Libinit */ #define GINISETUP 0x00000008 /* Global Init has been setup */ /* 0x00000010 reserved for NO external fixups in .EXE */ /* 0x00000020 reserved for NO internal fixups in .EXE */ #define CLASS_PROGRAM 0x00000040 /* Program class */ #define CLASS_GLOBAL 0x00000080 /* Global class */ #define CLASS_SPECIFIC 0x000000C0 /* Specific class, as against global */ #define CLASS_ALL 0x00000000 /* nonspecific class - all modules */ #define CLASS_MASK 0x000000C0 #define MTEPROCESSED 0x00000100 /* MTE being loaded */ #define USED 0x00000200 /* MTE is referenced - see ldrgc.c */ #define DOSLIB 0x00000400 /* set if DOSCALL1 */ #define DOSMOD 0x00000800 /* set if DOSCALLS */ #define MTE_MEDIAFIXED 0x00001000 /* File Media permits discarding */ #define LDRINVALID 0x00002000 /* module not loadable */ #define PROGRAMMOD 0x00000000 /* program module */ #define DEVDRVMOD 0x00004000 /* device driver module */ #define LIBRARYMOD 0x00008000 /* DLL module */ #define VDDMOD 0x00010000 /* VDD module */ #define MVDMMOD 0x00020000 /* Set if VDD Helper MTE (MVDM.DLL) */ #define INGRAPH 0x00040000 /* In Module Graph - see ldrgc.c */ #define GINIDONE 0x00080000 /* Global Init has finished */ #define MTEADDRALLOCED 0x00100000 /* Allocate specific or not */ #define FSDMOD 0x00200000 /* FSD MTE */ #define FSHMOD 0x00400000 /* FS helper MTE */ #define MTELONGNAMES 0x00800000 /* Module supports long-names */ #define MTE_MEDIACONTIG 0x01000000 /* File Media contiguous memory req */ #define MTE_MEDIA16M 0x02000000 /* File Media requires mem below 16M */ #define MTEIOPLALLOWED 0x04000000 /* Module has IOPL privilege */ #define MTEPORTHOLE 0x08000000 /* porthole module */ #define MTEMODPROT 0x10000000 /* Module has shared memory protected */ #define MTENEWMOD 0x20000000 /* Newly added module */ #define MTEDLLTERM 0x40000000 /* Gets instance termination */ #define MTESYMLOADED 0x80000000 /* Set if debugger symbols loaded */ /* The following bits are overloaded or aliased. */ #define MTEVALID (LDRINVALID) #define AUTODS_MASK (NOAUTODS|SOLO|INSTANCEDS) /* The following bits are cleared after each successful module load. */ #define MTE_INTNL_MASK (DOSLIB|DOSMOD|MTEVALID|MTEPROCESSED| \ GINISETUP|GINIDONE|USED|INGRAPH|MTENEWMOD) /* * The following define which modules are "ring 0" for the purpose of * indirect fixups. */ #define MTE_RING0 (DEVDRVMOD | VDDMOD | MVDMMOD | FSDMOD | FSHMOD) #define SEARCH_BY_PATH 1 /* FindModule class parameter */ /*end*/ /***ET+ ldrote_s - Object Table entry */ struct _oteres_s { ushort_t _ote_selector; /* store selector used by loader only */ ushort_t _ote_handle; /* store handle used by loader only */ }; /* * Since H2INC will not work correctly with unions to get SIZE of ldrote_t * to return the correct size remove the ulong_t from the assembler declare */ union _oteres_u { struct _oteres_s _ote_res; ulong_t _ote_linkbase; /* store link base address */ }; /* ASM _oteres_u STRUC _ote_res DB SIZE _oteres_s DUP (?) _oteres_u ENDS */ struct ldrote_s { /* Flat .EXE object table entry */ ulong_t ote_base; /* Object virtual base address */ ulong_t ote_vsize; /* Virtual memory size */ ulong_t ote_pages; /* Image pages offset */ ulong_t ote_psize; /* Physical file size of init. data */ ulong_t ote_flags; /* Attribute flags for the object */ union _oteres_u _ote_resu; }; typedef struct ldrote_s ldrote_t; /* Object table entry */ #define ote_handle _ote_resu._ote_res._ote_handle #define ote_selector _ote_resu._ote_res._ote_selector #define OBJ_PRELOAD 0x0040L #define ote_linkbase _ote_resu._ote_linkbase /* ASM ote_linkbase equ */ #define OBJALLOC 0x80000000L /* Object is allocated used by loader */ /***ET+ ldrote_t - Object Table entry */ #define LGS_FSDMOD 8L /* for ldrGetSelector */ #define LGS_FSDMODSHF 18L /* for ldrGetSelector */ #define LGS_VDDMOD 4L /* for ldrGetSelector */ #define LGS_VDDMODSHF 14L /* for ldrGetSelector */ #define LGS_DEVDRVMOD 4L /* for ldrGetSelector */ #define LGS_DEVDRVSHF 12L /* for ldrGetSeletor */ #define LGS_OBJEXECSHF 2L /* for ldrGetSelector */ #define LGS_OBJIOPLSHF 14L /* for ldrGetSelector */ #define LGS_OBJEXEC 1L /* for ldrGetSelector */ #define LGS_OBJIOPL 2L /* for ldrGetSelector */ #if ((LGS_VDDMOD << LGS_VDDMODSHF) != VDDMOD) error ldrvars.h include file changed /* create compile error */ #endif #if ((LGS_OBJEXEC << LGS_OBJEXECSHF) != OBJ_EXEC) error exe386.h include file changed /* create compile error */ #endif #if ((LGS_OBJIOPL << LGS_OBJIOPLSHF) != OBJ_IOPL) error exe386.h include file changed /* create compile error */ #endif /***ET+ ldropm_t - Object Page Map */ typedef struct o32_map ldropm_t; /* Object Page Map */ /***ET+ ldrste_t - Segment Table entry */ struct ldrste_s { ushort_t ste_offset; /* file offset to segment data */ ushort_t ste_size; /* file data size */ ushort_t ste_flags; /* type and attribute flags */ ushort_t ste_minsiz; /* minimum allocation size */ ulong_t ste_seghdl; /* segment handle returned by NtCreateSection() */ ulong_t ste_fixups; /* fixup record storage */ ushort_t ste_selector; /* segment selector */ ushort_t ste_pad; /* pad ldrste_s to 4 bytes */ }; /* ste_flags bit definitions */ /* XLATON */ #define STE_TYPE_MASK 0x0001 /* segment type field */ #define STE_CODE 0x0000 /* code segment type */ #define STE_DATA 0x0001 /* data segment type */ #define STE_PACKED 0x0002 /* segment is packed */ #define STE_SEMAPHORE 0x0004 /* segment semaphore */ #define STE_ITERATED 0x0008 /* segment data is iterated */ #define STE_WAITING 0x0010 /* segment is waiting on semephore */ #define STE_SHARED 0x0020 /* segment can be shared */ #define STE_PRELOAD 0x0040 /* segment is preload */ #define STE_ERONLY 0x0080 /* excute only if code segment */ /* read only if data segment */ #define STE_RELOCINFO 0x0100 /* set if segment has reloc records */ #define STE_CONFORM 0x0200 /* segment is conforming */ #define STE_RING_2 0x0800 /* ring 2 selector */ #define STE_RING_3 0x0C00 /* ring 3 selector */ #define STE_SEGDPL 0x0C00 /* I/O privilege level */ #define STE_HUGE 0x1000 /* huge segment */ #define STE_PAGEABLE 0x2000 /* just a page can be faulted in */ #define STE_PRESENT 0x2000 /* packed segment already loaded */ #define STE_SELALLOC 0x4000 /* used to indicate sel allocated */ #define STE_GDTSEG 0x8000 /* used to indicate GTD sel alloc */ #define STE_HUGE_MASK STE_TYPE_MASK|STE_SHARED|STE_SEGDPL #define STE_RSRC_HUGE STE_HUGE_MASK & ((NOT STE_TYPE_MASK)|STE_PRELOAD) #define ISRSRC 1 /* flag to indice we have a rsrc seg */ /* XLATOFF */ typedef struct ldrste_s ldrste_t; /* Segment table entry */ struct ri_s { /* relocation data item */ uchar_t ri_stype; /* sources type */ uchar_t ri_flags; /* target type */ ushort_t ri_source; /* source offset */ ushort_t ri_target_seg; /* target segment index */ ushort_t ri_target_off; /* target entry offset index */ }; typedef struct ri_s ri_t; #define ri_target_modnam ri_target_seg #define ri_target_impnam ri_target_off #define ri_target_ord ri_target_off #define RELOCSPERBUF 8 #define RELOCBUFLEN (sizeof(struct ri_s) * RELOCSPERBUF) #define SOURCE_MASK 0x07 #define BYTE_ADR 0x00 /* Byte source location */ #define SEG_ADR 0x02 /* Base source location */ #define FAR_ADR 0x03 /* Pointer source location */ #define OFF_ADR 0x05 /* Offset source location */ #define TARGET_MASK 0x03 #define INTERNALREF 0x00 #define IMPORTORDINAL 0x01 #define IMPORTNAME 0x02 #define ADDITIVE 0x04 /* * The sfr_s is used to store segment fixup information so we can * page segments. * * If sfr_fchained, then sfr_soff holds the count of chain records * immediately following the fixup data bytes (sfr_bytes). If records * are not chained, then sfr_soff holds the page offset for the fixup * data. * */ #define SFR_DATALEN 4 struct sfr_s { // Segment fixup record unsigned short sfr_fchained:1; // Flag: Is it chained unsigned short sfr_fixsize:3; // Number of bytes in fixup unsigned short sfr_soff:12; // Page offset or count of fixups unsigned char sfr_bytes[SFR_DATALEN]; // Fixup data bytes } ; typedef struct sfr_s sfr_t; #define SFR_HEADSIZE (sizeof(sfr_t)-SFR_DATALEN) #define PAGESPERSEGMENT 16 /* * segfix iterated record */ struct sfir_s { ulong_t sfir_doffset; // Offset into data file ushort_t sfir_soffset; // Offset into segment ushort_t sfir_cbdata; // Number of bytes in record ushort_t sfir_count; // Number of iterations }; typedef struct sfir_s sfir_t; struct ldret_s /* General entry table types */ { unsigned char et_cnt; /* Number of entries in this bundle */ unsigned char et_type; /* Bundle type */ unsigned short et_obj; /* Object number */ }; /* Follows entry types */ typedef struct ldret_s ldret_t; /***EC+ B16 - 16-bit bundle types */ #define EMPTY 0x00 /* empty bundle */ #define B16EMPTY EMPTY /* empty bundle */ #define B16ABSOLUTE 0xFE /* absolute entry bundle */ #define B16MOVABLE 0xFF /* movable entry bundle */ /*end*/ /***ET+ ldrcte_t - Loader call thunk entry for 16-bit entry table */ #pragma pack(1) struct ldrcte_s { uchar_t cte_flags; /* entry flags */ ushort_t cte_sel; /* space for callgate selector */ uchar_t cte_obj; /* object index */ ushort_t cte_off; /* offset of routine entry point */ }; typedef struct ldrcte_s ldrcte_t; /* Loader call thunk entry */ /*end*/ /***ET+ ldrent_t - Loader Exported entry for 16-bit entry table */ struct ldrent_s { uchar_t ent_flags; /* entry flags */ ushort_t ent_off; /* offset of routine entry point */ }; #pragma pack() typedef struct ldrent_s ldrent_t; /* Loader exported entry */ /*end*/ /***+ ldrempty_t unused entry */ struct ldrempty_s { uchar_t empty_count; /* count of empty entries */ uchar_t empty_type; /* type 0 for empty */ }; typedef struct ldrempty_s ldrempty_t; /*end*/ /***ET+ ldrfwd_t forwarder entry table entry */ struct ldrfwd_s { uchar_t fwd_flags; /* entry flags */ ushort_t fwd_modord; /* module ordinal */ ulong_t fwd_value; /* offset in table, or ordinal */ }; typedef struct ldrfwd_s ldrfwd_t; /*end*/ /***ET+ ldrfrt_t 32-bit fixup page table */ #define fr_stype nr_stype #define fr_flags nr_flags typedef struct r32_rlc ldrfrt_t; /*end*/ struct ldrefrt_s { /* expanded fixup record */ ulong_t efr_tgt; /* 32-bit target field */ ulong_t efr_add; /* addtive value */ ushort_t efr_srcoff; /* source offset */ ushort_t efr_tobj; /* target object or ordinal */ uchar_t efr_stype; /* source type */ uchar_t efr_flags; /* flags */ uchar_t efr_cchain; /* count for chained records */ }; typedef struct ldrefrt_s ldrefrt_t; struct objmem_s { ulong_t flobj; /* allocation flags needed */ }; /* * Warning this structure must match the structure defined in the ASM * part at the end of this file */ struct taddr_s { ulong_t toff; ushort_t tsel; uchar_t tflags; /* * For use by ldrGetFwdEnt(): */ uchar_t fflags; /* forwarder flags */ ushort_t cgsel; /* callgate selector */ }; /* The structure of a non-resident name table is as follows: */ struct nonres_s { struct nonres_s *nr_link; /* link to next non-resident table */ ushort_t nr_mte; /* mte handle to which names belong */ uchar_t nr_names; /* nonresident nametable from file */ }; // #define NT_TYPEINFO 0x80 // YosefD Mar-24-1996 Not in use #define E32EXPORT 0x01 #if 0 struct bndl_s { uchar_t bndl_cnt; uchar_t bndl_type; }; #endif struct hit_s { ulong_t offset; /* offset of field in mte */ ulong_t cnt; /* count of bytes to copy */ }; struct his_s { ulong_t offset; /* offset of field in ste */ ulong_t cnt; /* count of bytes to copy */ }; struct etmt_s { ushort_t offset; /* offset of field in linker exe image */ }; struct zmt_s { ushort_t offset; /* offset of field in swappable MTE */ uchar_t size; /* size of field */ uchar_t zero; /* flag to zero or not */ }; struct objflags_s { ulong_t flobj; /* object's flags */ ulong_t flVM; /* required allocation flags */ }; struct selflags_s { ulong_t flobj; /*object's flags */ ushort_t fsSEL; /* required allocation flags */ }; struct pgstatechg_s { ulong_t flpage; /* allocation flags needed */ }; /***ET+ ldrlv_t - Loader local variables */ struct ldrlv_s { ldrmte_t *lv_pmte; /* pointer to mte */ ulong_t lv_lbufaddr; /* linear addr of alloc buf from PG */ ulong_t lv_sbufaddr; /* segment addr of alloc buf from PG */ ulong_t lv_new_exe_off; /* offset relative begin of new exe */ HANDLE lv_sfn; /* current system file number */ ushort_t lv_hobmte; /* handle of current mte */ ulong_t lv_objnum; /* object number */ ushort_t lv_class; /* module class */ uchar_t lv_type; /* module type */ }; typedef struct ldrlv_s ldrlv_t; /* Loader local variables */ /*end*/ /***ET+ ldrrsrc16_t 16-bit Resource structure */ struct ldrrsrc16_s { ushort_t ldrrsrc16_type; ushort_t ldrrsrc16_name; }; typedef struct ldrrsrc16_s ldrrsrc16_t; /*end*/ /***ET+ ldrrsrc32_t 32-bit Resource structure */ struct ldrrsrc32_s { ushort_t rsrctype; /* Resource type */ ushort_t rsrcname; /* Resource name */ ulong_t rsrccb; /* Resource size */ ushort_t rsrccodepage; /* Resource codepage */ ushort_t rsrcobj; /* Obj num rsrc is found in */ ulong_t rsrcoffset; /* Offset within object */ }; typedef struct ldrrsrc32_s ldrrsrc32_t; /*end*/ /***ET+ Resource segment structure, kept in BMP segment */ struct ldrrsrc_s { ulong_t rsrc_typeid; /* resource type id */ ulong_t rsrc_nameid; /* resource name id */ ushort_t rsrc_mte; /* owner */ ushort_t rsrc_refcount; /* local reference count */ ushort_t rsrc_localptr; /* local PTDA chain */ ushort_t rsrc_globalptr; /* global chain */ }; typedef struct ldrrsrc_s ldrrsrc_t; /*end*/ /***ET+ ldrrrsrc_t Return Resource structure */ struct ldrrrsrc_s { ptr_t ldrrrsrc_ptr; int ldrrrsrc_type; }; typedef struct ldrrrsrc_s ldrrrsrc_t; /***ET+ ldrrsrcinfo_t Store resource info */ struct ldrrsrcinfo_s { ulong_t ldrrsrcinfo_flag; ulong_t ldrrsrcinfo_size; ulong_t ldrrsrcinfo_pote; ulong_t ldrrsrcinfo_iatsize; }; typedef struct ldrrsrcinfo_s ldrrsrcinfo_t; /***ET+ ldrwhois_t who is sructure */ struct ldrwhois_s { ushort_t whois_ssegnum; ushort_t whois_hmte; uchar_t whois_achname[256]; }; typedef struct ldrwhois_s ldrwhois_t; /*end*/ #define STRINGNULLTERM 0 #define STRINGNONNULL 1 #define NO_FORCE_PRELOAD 0 #define FORCE_PRELOAD 1 #define MAX_DEMAND_READ 8 /* current we can only read 8 pages */ #ifdef RANGE #define RANGEINVALID (INVALID | RANGE) #define RANGEZEROED (ZEROED | RANGE) #endif #define LOAD_PAGE 0 /* return value for LDRGetPGInfo */ #define LOAD_SEGMENT 1 /* return value for LDRGetPGInfo */ #define ALIGNMENT_SHIFT 512 /* logical sector alignment shift */ #define ENDMTETBL 0xDEAD /* mark end of validatetbl */ #define rsrcvalidatetbl 3 /* rsrc table is 3rd entry in tbl */ #define SKIPCOPY -1 #define MAX_NAME_LEN 8 #define MAX_PROC_LEN 256 /* Max proc name length incl. NUL */ #define MAXPATHLEN 260 #define EXT_PROGRAM 0 /* program */ #define EXT_LIBRARY 1 /* library */ #define EXT_DEVICE 2 /* device driver */ #define EXT_FSD 3 /* installable file system */ #define EXT_VDD 4 /* VDD */ #define CHECK_ALL 1 /* Use full set off invalid chars */ #define CHECK_WILDCARDS 2 /* Use wild card char set */ #define MIN_CHAR_VALUE 0x20 /* space */ #define LDR_16bit 0 /* 16-bit module */ #define LDR_32bit 1 /* 32-bit module */ #define LDR_PORTHOLE 2 /* Porthole Init module */ #define EF_EXPORT 1 /* entry is exported */ #define EF_GDATA 2 /* entry uses global shared data */ /* * Sub-function code for DosQueryHeaderInfo */ #define HEADER_EXEINFO 1 /* return fields values from EXE hdr */ #define HEADER_READRSRCTBL 2 /* return pointer of rsrc table */ #define HEADER_READSECTOR 3 /* read resource table */ #define HEADER_LIBPATHLEN 4 /* return length of LIBPATH */ #define HEADER_LIBPATH 5 /* return LIBPATH string */ #define HEADER_FIXENTRY 6 /* fix a value in entry table */ #define HEADER_STE 7 /* return segment table info */ #define HEADER_MAPSEL 8 /* map selector to segment number */ /***LT+ ldrdld_t - Loader Demand Load Data. * * Each process (PTDA) has a chain of ldrdld records, managed * by the loader, allocated from the kernel heap, to keep track * of the runtime attachments to a process. * * The ldrdld records are created on the initial attachment * to a module via a DOSLOADMODULE call, setting ldrdld_cRef * to 1. Subsequent DOSLOADMODULE calls increment ldrdld_cRef * for the appropriate record. ldrdld_cRef is decremented when * the program calls DOSFREEMODULE, and the record is removed * if ldrdld_cRef goes to Zero. The entire chain of ldrdld * records is freed when the process dies, in LDRFreeTask. */ struct ldrdld_s { struct ldrdld_s *dld_next; // MUST be first element in structure! ldrmte_t *dld_mteptr; ULONG Cookie; // This field holds a unique value for each // process. We chose the address of the process's // OS2_PROCESS data structure. ULONG dld_usecnt; }; typedef struct ldrdld_s ldrdld_t; /***LT ldrpip_t - page count packet * used by ldrMakeIDCache32, getpages and ldrProcessObjects */ struct ldrpip_s { ulong_t pip_pbuf; /* Pointer to load buffer */ int pip_spbf; /* Starting page in load buffer */ int pip_cpbf; /* Count of pages in load buffer */ int pip_maxp; /* Max. page to read */ }; typedef struct ldrpip_s ldrpip_t; /**LT ldrmodhdr - return structure for MTE info * used to return info from the MTE. */ struct ldrmhdr_s { ushort_t mhdr_flags; /* ne_flags */ ushort_t mhdr_flagsothers; /* ne_flagsothers */ ushort_t mhdr_exetyp; /* ne_exetyp */ ushort_t mhdr_expver; /* ne_expver */ ulong_t mhdr_rsrctab; /* mte_rsrctab */ ulong_t mhdr_restab; /* mte_restab */ ushort_t mhdr_sfn; /* sfn */ }; typedef struct ldrmhdr_s ldrmhdr_t; #ifdef KM_REG_DS /***LT dllterm_t - DLL termination data buffer * * This buffer contains the registers of the caller of * DosFreeModule as well as all the handles of all the * modules requiring termination notification. */ struct dllterm_s { struct dllterm_s *dllt_pdlltnext; /* Next record in chain */ struct kmreg_s dllt_regs; /* User registers */ ushort_t dllt_chmod; /* # of module handles left to call */ VMHOB dllt_ahmod[1]; /* Array of handles (var length) */ }; typedef struct dllterm_s dllterm_t; #endif /**LT ldrnewseg - return structure for STE info * used to return info from the STE */ struct newseg { /* Segment Table entry info */ USHORT ns_sector; /* file sector of start of segment */ USHORT ns_cbseg; /* number of bytes in file */ USHORT ns_flags; /* attribute flags */ USHORT ns_minalloc; /* minimum alloc in bytes */ }; typedef struct ldrnewseg_s ldrnewseg_t; #define ldrNumToSte(pmte, objnum) ((ldrste_t *) ldrNumToOte(pmte, objnum)) #define LEMAGIC ((E32MAGIC2 << 8) | (E32MAGIC1)) #define ldrIsLE(pmte) (*(short *) ((pmte)->mte_magic) == LEMAGIC) #define ldrIsNE(pmte) (*(short *) ((pmte)->mte_magic) == NEMAGIC) #define MAX_PRELOAD 10 #define RESIZE64K(cb) (cb? (ulong_t) cb : (ulong_t) 64*1024) #define TCYIELD_CNT 31 #define RSRC32TYPEID 0xffffffff #define LDRMAXHEAPCACHE 2048 /* Max. size of cache to put on heap */ #define _5K 5*1024 #define MINSEGPACKCNT ldrMINSEGPACKCNT #define MINPGPACKSIZE ldrMINPGPACKSIZE #define MAXSEGPACKSIZE ldrMAXSEGPACKSIZE #define HEADERBUFSIZE 512 #define PAGESHIFT 12 #define PAGESIZE (1 << PAGESHIFT) #define PAGEMASK (PAGESIZE - 1) #define WORDMASK 0xffff #define BYTEMASK 0xff #define WORDSHIFT 16 /***LP ldrAssert - cause internal error if assertion fails * * Given a boolean, this procedure causes an internal error if * the boolean is false. Typically, the value of this boolean is * derived from some test expression. * * ldrAssert (e) * * ENTRY e - boolean value (int) * RETURN NONE * * CALLS panicfmt * * WARNING This procedure is implemented as a macro. * * EFFECTS NONE */ #ifdef LDRSTRICT # define ldrAssert(e) _assert(e) #else # define ldrAssert(e) #endif /***LP ldrStop - stop in kernel debugger * * If the global ldrErr is TRUE and the mte pointer is not doscalls * or is null, this routine transfers control to the kernel debugger. * * ldrStop (id, pmte) * * ENTRY id - identifier of caller (ignored) * pmte - mte pointer or NULL * RETURN NONE * * CALLS Debug_BreakDM * * EFFECTS NONE */ #if DBG extern void ldrStop(int id, void *pmte); #else #define ldrStop(id, pmte) #endif /* * Forwarder declarations */ extern int ldrGetFwdEnt(struct AuxData *, ldrmte_t *); extern int ldrSelToFwdFlg (ushort_t); extern int ldrGetImport (ldrmte_t *, ulong_t, ushort_t, int, ldrmte_t **, ushort_t *); /* * Values for forwarder flags after processing: */ #define FWD_ALIAS16 0x01 /* Target object requires 16:16 alias */ #define FWD_SPECIAL 0x02 /* DOSMOD, FSHMOD, MVDMMOD */ #define FWD_PROCESSED 0x04 /* Forwarder has been processed */ #define FWD_SHIFT 3 /* Flat target selector field is 0x38 */ #define FWD_GATE16 0x40 /* 286 call gate */ #define FWD_IOPL 0x80 /* Target object has I/O privilege */ /* * Other forwarder constants. */ #define ERROR_LDR_FWD -1 /* Return code indicating forwarder */ #define LDRFWDMAX 1024 /* Max length of forwarder chain */ #define SMALLFWDMAX 3 /* Max length of chain to fix up in memory */ #define min(a,b) (((a) < (b)) ? (a) : (b)) extern ldrmte_t *mte_h; /* head of linked mte list */ extern ldrmte_t *program_h; /* head of list of program modules */ extern ldrmte_t *program_l; /* tail of list of program modules */ extern ldrmte_t *global_h; /* head of list of global modules */ extern ldrmte_t *global_l; /* tail of list of global modules */ extern ldrmte_t *specific_h; /* head of list of specific modules */ extern ldrmte_t *specific_l; /* tail of list of specific modules */ extern ushort_t validatetbl[]; /* validation table */ extern struct etmt_s ExeToResMTETbl[];/* Reduce EXE image to MTE */ extern struct etmt_s ExeTo32SwapMTETbl[];/* Reduce EXE to LE MTE */ extern struct etmt_s ExeTo16SwapMTETbl[];/* Reduce EXE to NE MTE */ extern struct objflags_s objflags[]; /* object flags table */ extern struct selflags_s selflags[]; /* selector flags table */ extern struct objmem_s objmem[]; /* memory type flags table */ extern struct pgstatechg_s pgstatechg[]; /* set type table */ extern ushort_t ldrInitCallGate; extern ulong_t ldrMINSEGPACKCNT; extern ulong_t ldrMINPGPACKSIZE; extern ulong_t ldrMAXSEGPACKSIZE; extern char LdrBuf[MAXPATHLEN+14]; // 14 is for the '\OS2SS\DRIVES\' extern void load_error(int errcode, ldrmte_t * pmte); extern USHORT LDRDoscallsSel; #define FIELDOFFSET(type,field) ((USHORT)&(((type *)0)->field)) /***LP fMTEValid - Validate if MTE has a valid signature */ #define fMTEValid(pmte) (ldrIsNE(pmte) || ldrIsLE(pmte)) extern PUCHAR ldrSrcModNameBuf; extern ushort_t ldrSrcModNameBufL; extern PUCHAR ldrTgtModNameBuf; extern ushort_t ldrTgtModNameBufL; extern PUCHAR ldrProcNameBuf; extern ushort_t ldrProcNameBufL; #if PMNT extern PUCHAR ldrSaveSrcModNameBuf; extern ushort_t ldrSaveSrcModNameBufL; extern PUCHAR ldrSaveTgtModNameBuf; extern ushort_t ldrSaveTgtModNameBufL; extern PUCHAR ldrSaveProcNameBuf; extern ushort_t ldrSaveProcNameBufL; extern int ldrSaveRc; #endif /***LP ldrSetupSrcErrTxt - Sets up source module name in error text buffer ***LP ldrInvSrcErrTxt - Invalidates source module in error text buffer * * This procedure is implemented as a macro. * * ENTRY pachmodname - ModuleName/FullPathName string * cchmodname - length of string * * EXIT none - ldrSrcModNameBuf[L] is setup * */ #define ldrSetupSrcErrTxt(pachmodname, cchmodname) \ ldrSrcModNameBuf = pachmodname; \ ldrSrcModNameBufL = cchmodname #define ldrInvSrcErrTxt() \ ldrSrcModNameBufL = 0; /***LP ldrSetupTgtErrTxt - Sets up target module name in error text buffer ***LP ldrInvTgtErrTxt - Invalidates target module in error text buffer * * This procedure is implemented as a macro. * * ENTRY pachmodname - ModuleName/FullPathName string * cchmodname - length of string * * EXIT none - ldrTgtModNameBuf[L] is setup * */ #define ldrSetupTgtErrTxt(pachmodname, cchmodname) \ ldrTgtModNameBuf = pachmodname; \ ldrTgtModNameBufL = cchmodname #define ldrInvTgtErrTxt() \ ldrTgtModNameBufL = 0; #pragma pack(1) typedef struct _R2CallInfo { UCHAR R2CallNearInst; // Opcode of the call near inst 0xFF USHORT R2CommonEntry; // This field will contain a 400H UCHAR R2BytesToCopy; // Total size of proc parameters to copy between stacks USHORT R2EntryPointOff; // Offset of entry address of R2 routine USHORT R2EntryPointSel; // Selector of entry address of R2 routine } R2CallInfo, *PR2CallInfo; #pragma pack()