windows-nt/Source/XPSP1/NT/base/mvdm/meinc/k32share.h
2020-09-26 16:20:57 +08:00

270 lines
9.2 KiB
C

/*****************************************************************************
* K32SHARE.H
*
* Shared interfaces/information between Kernel16 and Kernel32.
*
* This file must be kept in sync with K32SHARE.INC!
*
* Created: 8-Sep-92 [JonT]
*
****************************************************************************/
/* XLATOFF */
typedef struct tagK16SYSVAR {
DWORD dwSize;
/* LCRST Win16Lock; */
DWORD VerboseSysLevel;
DWORD dwDebugErrorLevel;
WORD winVer;
WORD Win_PDB;
} K16SYSVAR;
typedef struct _tempstackinfo { /**/
DWORD si_base; // base of stack
DWORD si_top; // top of stack
union {
struct {
WORD so_offset;
WORD so_segment;
} si_so;
DWORD si_segoff; // use with 'lss sp, si_segoff'
};
} TEMPSTACKINFO;
/* XLATON */
/*ASM
_TEMPSTACKINFO STRUCT
si_base dd ? ; base of stack
si_top dd ? ; top of stack
si_segoff dd ? ; use with 'lss sp, si_segoff'
_TEMPSTACKINFO ENDS
TEMPSTACKINFO TYPEDEF _TEMPSTACKINFO
*/
#define STACK_GUARD_QUANTUM 8 // 8 guard pages on growable stacks
#define STACK_THUNK_SIZE (STACK_GUARD_QUANTUM * 0x1000)
// IFSMgr table of conversion pointers for Unicode/Ansi/OEM conversion
typedef struct _IFSMGR_CTP_STRUCT { /**/
DWORD cbCTPCount; // count of pointers in table
DWORD pUniToWinAnsiTable;
DWORD pUniToOEMTable;
DWORD pWinAnsiToUniTable;
DWORD pOEMToUniTable;
DWORD pUniToUpperDelta;
DWORD pUniToUpperTable;
} IFSMGR_CTP_STRUCT;
// Kernel16->Kernel32 structure passed at init time
typedef struct tagK32STARTDATA { /* sd */
DWORD dwSize; // DWORD, structure size
DWORD hCurTDB; // DWORD, 16 bit hTask of current task
DWORD selPSP; // DWORD, selector of current kernel's PSP
DWORD lpfnVxDCall; // 16:16 pointer to DOS386 BP
DWORD selLDT; // R/W Selector to LDT
DWORD pLDT; // Lin address of LDT (assumes not moveable)
DWORD dwWinVer; // Windows version
DWORD pK16CurTask; // Points to Kernel16's current task var
DWORD pWinDir; // Points to the Windows directory
DWORD pSysDir; // Points to the Windows system directory
WORD wcbWinDir; // Length of windir (not zero terminated)
WORD wcbSysDir; // Length of sysdir (not zero terminated)
#ifndef WOW
struct _tdb **pptdbCur; // pointer to current thread pointer
#endif // ndef WOW
DWORD Win16Lock; // ptr to Win16 hierarchical critical section
DWORD pVerboseSysLevel; // ptr to Enter/LeaveSysLevel verbosity control
#ifdef WOW
DWORD Krn32BaseLoadAddr; // Base address KERNEL32 loaded at
#else
DWORD ppCurTDBX; // ptr to current 32 bit TDBX
#endif // ifdef WOW
DWORD pThkData; // ptr to shared thunk data
K16SYSVAR *pK16SysVar; // ptr to K16 system variables
DWORD pHGGlobs; // ptr to K16 HGGlobs structure
DWORD pK16CurDosDrive; // ptr to kernel16's curdosdrive variable
DWORD pK16CurDriveOwner; // ptr to kernel16's cur_drive_owner variable
WORD wSelBurgerMaster; // BurgerMaster segment
WORD wHeadK16FreeList; // Head of the k16 global free list
DWORD lpSelTableStart; // Ptr to K16 SelTableStart variable
DWORD lpSelTableLen; // Ptr to K16 SelTableStart variable
DWORD pK16HeadTDB; // ptr to head of the 16-bit TDB list
DWORD fIsSymDebThere; // Same as KF_SYMDEB flag in K16.
struct _tempstackinfo *pTermStack; // ptr to win16 termination stack info
DWORD pIFSMgrCTPStruct; // pointer to unicode/ansi conversion table
DWORD pK16ResHandler; // 16:16 PELoadResourceHandler
DWORD pK32LangID; // flat addr of k32's ulLanguageID
PULONG pulRITEventPending; // pointer to RITEventPending variable
WORD K32HeapSize; // max size of kernel32's heap
#ifdef WOW
WORD Unused;
#else // WOW
WORD SystemTickCountDS; // selector of tick count variable
#endif // else WOW
DWORD pcrstGHeap16; // ptr to k16 global heap critical section
PVOID pcscr16; // pointer to 16 bit crst code ranges
DWORD pwHeadSelman16; // pointer to head of 16-bit selman list
DWORD dwIdObsfucator; // XOR mask for obfuscating pids & tids
DWORD pDiagFlag; // ptr to diagnostic logging enabled boolean
DWORD fNovell; // ver info of Real Netx (ea00 call)
DWORD pcrstDriveState; // drive state for DOS calls
#ifndef WOW
PVOID lpSysVMHighLinear; // high linear mapping for low mem
#endif // ndef WOW
#ifdef WOW
PVOID AdrK16WantSetSelector;
DWORD pK16CurDOSPsp; // ptr to k16 cur_dos_pdb variable
DWORD pDOSCurPsp; // ptr to curr pdb variable in DOS
#endif
} K32STARTDATA;
// Thread Info Block
// Note that this structure is always contained in the TDB
// This is the only part of the TDB that is known to apps and to Kernel16
//
// This is the NT form. We must match the marked fields:
// typedef struct _NT_TIB {
// struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; **** match!!!
// PVOID StackBase; **** match!!!
// PVOID StackLimit; **** match!!!
// PVOID SubSystemTib;
// union {
// PVOID FiberData; **** match!!!
// ULONG Version;
// };
// PVOID ArbitraryUserPointer; ?????
// struct _NT_TIB *Self; **** match!!!
// } NT_TIB;
//
// typedef struct _TEB {
// NT_TIB NtTib;
// PVOID EnvironmentPointer;
// CLIENT_ID ClientId;
// PVOID ActiveRpcHandle;
// PVOID ThreadLocalStoragePointer; **** match!!!
// PPEB ProcessEnvironmentBlock; **** match!!!
// ULONG LastErrorValue;
// UCHAR LastErrorString[NT_LAST_ERROR_STRING_LENGTH];
// ULONG CountOfOwnedCriticalSections;
// PVOID Sparea;
// PVOID Spareb;
// LCID CurrentLocale;
// ULONG FpSoftwareStatusRegister;
// PVOID SystemReserved1[55];
// PVOID Win32ThreadInfo;
// PVOID SystemReserved2[337];
// PVOID CsrQlpcStack;
// ULONG GdiClientPID;
// ULONG GdiClientTID;
// PVOID GdiThreadLocalInfo;
// PVOID User32Reserved0;
// PVOID User32Reserved1;
// PVOID UserReserved[315];
// ULONG LastStatusValue;
// UNICODE_STRING StaticUnicodeString;
// WCHAR StaticUnicodeBuffer[STATIC_UNICODE_BUFFER_LENGTH];
// PVOID DeallocationStack;
// PVOID TlsSlots[TLS_MINIMUM_AVAILABLE];
// LIST_ENTRY TlsLinks;
// PVOID Vdm;
// PVOID ReservedForNtRpc;
// } TEB;
typedef struct _TIBSTRUCT { /* tib */
DWORD pvExcept; // Head of exception record list
VOID* pvStackUserLimit; // Top of user stack
VOID* pvStackUser; // Base of user stack
#ifdef WOW
VOID* pvSubSystemTib;
#else // WOW
// Replace SubSystemTib with the following 2 WORDs
WORD hTaskK16; // Kernel16 hTask associated with this thread
WORD ss16; // 16-bit stack selector, for 32=>16 thunks
#endif // else WOW
PVOID pvFiberData; // Fiber support macros reference this field
PVOID pvArbitraryUserPointer;
struct _TIBSTRUCT *ptibSelf; // Linear address of TIB structure
#ifdef WOW
BYTE bFiller[4096-7*4-2*2-4-7*4];
WORD hTaskK16; // Kernel16 hTask associated with this thread
WORD ss16; // 16-bit stack selector, for 32=>16 thunks
PVOID pTDB;
#endif // def WOW
WORD flags; // TIB flags
WORD Win16LockVCount; // Count of thunk virtual locks
struct _DEBDLLCONTEXT *pcontextDeb; // pointer to debug DLL context record
DWORD *pCurPri; // ptr to current priority of this thread
DWORD dwMsgQueue; // User's per thread queue dword value
PVOID *ThreadLocalStoragePointer; // pointer to thread local storage array
struct _pdb* ppdbProc; // Used as PID for M3 NT compatibility
VOID *pvFirstDscr; // Per-thread selman list.
} TIBSTRUCT;
/* XLATOFF */
typedef TIBSTRUCT TIB;
/* XLATON */
// TIB.flags values
#define TIBF_WIN32_BIT 0 // this is a Win32 thread
#define TIBF_TRAP_BIT 1 // single step trap in DIT has occured
#define TIBF_WIN32 (1 << TIBF_WIN32_BIT)
#define TIBF_TRAP (1 << TIBF_TRAP_BIT)
//
// Critical section code range structure. Contains the start and end
// linear addresses of the EnterCrst/LeaveCrst code that can't be
// interrupted by ring 0 code.
//
typedef struct _CSCR { /**/
PVOID cscr_pStart; // starting linear address of crst code
PVOID cscr_pEnd; // ending linear address of crst code
PVOID cscr_pOK; // this addr in the above range is ok to be at
PVOID cscr_pNOP; // linear address of nop to replace with int 3
} CSCR;
typedef CSCR *PCSCR;
#define NUM_CSCR_16 6
#define NUM_CSCR_32 4
#define NUM_CSCR (NUM_CSCR_16 + NUM_CSCR_32)
/* ASM
;
; Macro to convert bit flag to bit number
;
BITNUM MACRO bitflag:REQ
LOCAL bit, bitn, val
bitn = 0
bit = 1
%val = bitflag
.errnz val AND (val - 1) ; multiple bits invalid
REPEAT 32
IF (val AND bit) NE 0
EXITM
ENDIF
bitn = bitn + 1
bit = bit SHL 1
ENDM
ifndef WOW
.erre bitn - 32 ; no bit defined
endif
EXITM %bitn
ENDM
*/