163 lines
7.4 KiB
C
163 lines
7.4 KiB
C
|
//-----------------------------------------------------------------------
|
||
|
//
|
||
|
// TDBX.H - TDBX data structure definition
|
||
|
//
|
||
|
//-----------------------------------------------------------------------
|
||
|
// File Description:
|
||
|
// Provides a definition of the TDBX data structure which is a
|
||
|
// non-pageable data structure used for storage of thread specific
|
||
|
// data which must be accessed from ring 0 at event or thread switch
|
||
|
// time.
|
||
|
//
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Revision History:
|
||
|
// 5/21/93 - created (miketout)
|
||
|
//
|
||
|
//-----------------------------------------------------------------------
|
||
|
|
||
|
/* XLATOFF */
|
||
|
#pragma pack(1)
|
||
|
/* XLATON */
|
||
|
|
||
|
#define MEOW_BOP_STACK_SIZE (48*1024)
|
||
|
#define MEOW_BOP_STACK_FILL 0x5A
|
||
|
|
||
|
typedef struct WNLST {
|
||
|
struct _wnod *wnlst_pwnCirc; // 1 node in circular wait node list
|
||
|
DWORD wnlst_flFlags; // wait flags for any or all, etc.
|
||
|
} WNLST;
|
||
|
|
||
|
typedef struct TDBX {
|
||
|
#ifdef WOW
|
||
|
BYTE tdbxType;
|
||
|
BYTE tdbxUnused;
|
||
|
WORD tdbxCntUses; // Ref count
|
||
|
#else // WOW
|
||
|
DWORD tdbxCntUses; // Ref count
|
||
|
#endif // else WOW
|
||
|
WNLST tdbxWaitNodeList; // wait node list
|
||
|
DWORD tdbxR0ThreadHandle; // ring 0 thread handle
|
||
|
DWORD tdbxContextHandle; // ring 0 memory context handle
|
||
|
DWORD tdbxProcessHandle; // ring 3 process handle
|
||
|
#ifdef WOW
|
||
|
struct _tdb *tdbxThreadHandle; // ring 3 thread handle
|
||
|
#else // WOW
|
||
|
DWORD tdbxThreadHandle; // ring 3 thread handle
|
||
|
#endif // else WOW
|
||
|
|
||
|
DWORD tdbxMustCpltCount; // nested must-complete count
|
||
|
DWORD tdbxSuspendHandle; // suspend apc handle
|
||
|
DWORD tdbxSuspendCount; // nested suspend count
|
||
|
#ifdef WOW
|
||
|
LONG tdbxBlockState; // -1 = blkd, 0 = norm, 1 = wake pending
|
||
|
HANDLE tdbxBlockHandle; // handle to thread's private semaphore
|
||
|
#else // WOW
|
||
|
DWORD tdbxBlockState; // -1 = blkd, 0 = norm, 1 = wake pending
|
||
|
DWORD tdbxBlockHandle; // handle to thread's private semaphore
|
||
|
#endif // else WOW
|
||
|
DWORD tdbxWakeParam; // caller defined wakeup parameter
|
||
|
DWORD tdbxTimeOutHandle; // handle from Set_Global_Time_Out
|
||
|
DWORD tdbxCreateDestroyData; // create/destroy parameter
|
||
|
|
||
|
KERNELAPCREC tdbxkernelapcrec; // apc record for terminate and freeze
|
||
|
volatile DWORD tdbxBlockedOnID; // if the thread is blocked on id
|
||
|
DWORD tdbxpPMPSPSelector; // ptr to TCB_PMPSPSelector field in TCB
|
||
|
DWORD tdbxKernAPCList; // pointer to first kernel APC
|
||
|
#ifdef WOW
|
||
|
struct _userapcrec *tdbxUserAPCList; // pointer to first user APC in list
|
||
|
#else // WOW
|
||
|
DWORD tdbxUserAPCList; // pointer to first user APC in list
|
||
|
#endif // else WOW
|
||
|
DWORD tdbxQueuedSyncAPCs; // waiting till out of nested Wait()
|
||
|
DWORD tdbxSyncWaitCount; // nested Wait() count
|
||
|
volatile DWORD tdbxWaitExFlags; // bit mask used for alertable waits
|
||
|
|
||
|
DWORD tdbxTraceEventHandle; // trace out event handle
|
||
|
DWORD tdbxTraceCallBack; // trace out call back function
|
||
|
DWORD tdbxTraceRefData; // trace out reference data
|
||
|
WORD tdbxDosPDBSeg; // DOS PDB segment value for this thread
|
||
|
WORD tdbxK16Task; // actual sel for K16 TDB of this TDB
|
||
|
|
||
|
DWORD tdbxDR7; // debug registers
|
||
|
DWORD tdbxDR6;
|
||
|
DWORD tdbxDR3;
|
||
|
DWORD tdbxDR2;
|
||
|
DWORD tdbxDR1;
|
||
|
DWORD tdbxDR0;
|
||
|
#ifdef SYSLEVELCHECK
|
||
|
LONG tdbxLvlCounts[SL_TOTAL]; // to keep track of CRST level
|
||
|
LPLCRST tdbxOwnedCrsts[SL_TOTAL]; // ptrs to crit sections owned
|
||
|
#endif
|
||
|
WORD tdbxTraceOutLastCS; // trace out last CS
|
||
|
WORD tdbxK16PDB; // selector for PDB
|
||
|
BYTE tdbxExceptionCount; // number of nested exceptions
|
||
|
BYTE tdbxSavedIrql; // irql saved by VWIN32_SaveIrql
|
||
|
BYTE tdbxSavedIrqlCount; // INIT <-1>
|
||
|
#ifdef WOW
|
||
|
BYTE tdbxAlign;
|
||
|
struct TDBX *tdbxNext;
|
||
|
HANDLE tdbxNTThreadHandle;
|
||
|
HANDLE tdbxVxDBlockOnIDEvent;
|
||
|
DWORD tdbxVxDBlockOnIDID;
|
||
|
WORD tdbxCurrentPSP;
|
||
|
WORD tdbxAlign2;
|
||
|
DWORD tdbxVxDMutexTry;
|
||
|
DWORD tdbxVxDMutexGrant;
|
||
|
#endif // def WOW
|
||
|
} TDBX;
|
||
|
|
||
|
typedef struct TDBX *PTDBX;
|
||
|
|
||
|
// bit numbers of flags in tdbxWaitExFlags
|
||
|
#define TDBX_WAITEXBIT 0 // wait includes APCs
|
||
|
#define TDBX_WAITEXBIT_MASK (1 << TDBX_WAITEXBIT)
|
||
|
#define TDBX_WAITACKBIT 1 // set once during wake
|
||
|
#define TDBX_WAITACKBIT_MASK (1 << TDBX_WAITACKBIT)
|
||
|
#define TDBX_SUSPEND_APC_PENDING 2 // kernel mode APC pending
|
||
|
#define TDBX_SUSPEND_APC_PENDING_MASK (1 << TDBX_SUSPEND_APC_PENDING)
|
||
|
#define TDBX_SUSPEND_TERMINATED 3 // thread has resumed
|
||
|
#define TDBX_SUSPEND_TERMINATED_MASK (1 << TDBX_SUSPEND_TERMINATED)
|
||
|
#define TDBX_BLOCKED_FOR_TERMINATION 4 // thread is blocked for term
|
||
|
#define TDBX_BLOCKED_FOR_TERMINATION_MASK (1 << TDBX_BLOCKED_FOR_TERMINATION)
|
||
|
#define TDBX_EMULATE_NPX 5 // thread is using FP emulator
|
||
|
#define TDBX_EMULATE_NPX_MASK (1 << TDBX_EMULATE_NPX)
|
||
|
#define TDBX_WIN32_NPX 6 // thread uses Win32 FP model
|
||
|
#define TDBX_WIN32_NPX_MASK (1 << TDBX_WIN32_NPX)
|
||
|
#define TDBX_EXTENDED_HANDLES 7 // uses extended file handles
|
||
|
#define TDBX_EXTENDED_HANDLES_MASK (1 << TDBX_EXTENDED_HANDLES)
|
||
|
#define TDBX_FROZEN 8 // thread is frozen
|
||
|
#define TDBX_FROZEN_MASK (1 << TDBX_FROZEN)
|
||
|
#define TDBX_DONT_FREEZE 9 // don't frozen the thread
|
||
|
#define TDBX_DONT_FREEZE_MASK (1 << TDBX_DONT_FREEZE)
|
||
|
#define TDBX_DONT_UNFREEZE 10 // keep the thread frozen
|
||
|
#define TDBX_DONT_UNFREEZE_MASK (1 << TDBX_DONT_UNFREEZE)
|
||
|
#define TDBX_DONT_TRACE 11 // don't trace the thread
|
||
|
#define TDBX_DONT_TRACE_MASK (1 << TDBX_DONT_TRACE)
|
||
|
#define TDBX_STOP_TRACING 12 // stop tracing the thread
|
||
|
#define TDBX_STOP_TRACING_MASK (1 << TDBX_STOP_TRACING)
|
||
|
#define TDBX_WAITING_FOR_CRST_SAFE 13 // waiting thread to get safe
|
||
|
#define TDBX_WAITING_FOR_CRST_SAFE_MASK (1 << TDBX_WAITING_FOR_CRST_SAFE)
|
||
|
#define TDBX_CRST_SAFE 14 // we know this thread is safe
|
||
|
#define TDBX_CRST_SAFE_MASK (1 << TDBX_CRST_SAFE)
|
||
|
#define TDBX_WTUSROWNMTX 15 // thread waited in user with VxD Mutex Owned
|
||
|
#define TDBX_WTUSROWNMTX_MASK (1 << TDBX_WTUSROWNMTX)
|
||
|
#define TDBX_THREAD_NOT_INIT 17 // thread init not complete
|
||
|
#define TDBX_THREAD_NOT_INIT_MASK (1 << TDBX_THREAD_NOT_INIT)
|
||
|
#define TDBX_BLOCK_TERMINATE_APC 18
|
||
|
#define TDBX_BLOCK_TERMINATE_APC_MASK (1 << TDBX_BLOCK_TERMINATE_APC)
|
||
|
#define TDBX_TERMINATING 19
|
||
|
#define TDBX_TERMINATING_MASK (1 << TDBX_TERMINATING)
|
||
|
|
||
|
// Special block ids (added to tdbx address)
|
||
|
#define TDBX_BLOCK_TERMINATE_APC_ID 0x00569595
|
||
|
#define TDBX_BLOCKED_FOR_TERMINATION_ID 0x00289816
|
||
|
|
||
|
// Equates for thread priority boosting by ring 3 code
|
||
|
#define HIGH_PRI_DEVICE_BOOST 0x00001000
|
||
|
#define LOW_PRI_DEVICE_BOOST 0x00000010
|
||
|
#define KERNEL_EXIT_PRI_BOOST 8
|
||
|
|
||
|
/* XLATOFF */
|
||
|
#pragma pack()
|
||
|
/* XLATON */
|