windows-nt/Source/XPSP1/NT/termsrv/drivers/termdd/icadata.c

187 lines
5.1 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*************************************************************************
* icadata.c
*
* This module declares global data for Termdd
*
* Copyright (C) 1997-1999 Microsoft Corp.
*************************************************************************/
/*
* Includes
*/
#include <precomp.h>
#pragma hdrstop
PDEVICE_OBJECT IcaDeviceObject;
PDEVICE_OBJECT MouDeviceObject = NULL;
PDEVICE_OBJECT KbdDeviceObject = NULL;
BOOLEAN PortDriverInitialized;
KSPIN_LOCK IcaSpinLock;
KSPIN_LOCK IcaTraceSpinLock;
KSPIN_LOCK IcaStackListSpinLock;
PERESOURCE IcaReconnectResource;
PERESOURCE IcaTraceResource;
PERESOURCE IcaSdLoadResource;
LIST_ENTRY IcaSdLoadListHead;
LIST_ENTRY IcaTdHandleList;
LIST_ENTRY IcaFreeOutBufHead[NumOutBufPools];
LIST_ENTRY IcaStackListHead;
ULONG IcaTotalNumOfStacks;
PLIST_ENTRY IcaNextStack;
PKEVENT pIcaKeepAliveEvent;
PKTHREAD pKeepAliveThreadObject;
HANDLE g_TermServProcessID=NULL;
unsigned MaxOutBufMdlOverhead;
// Used by OutBuf alloc code to map a bit range from the alloc size
// (requested alloc size + header sizes) into a particular buffer pool.
// We use a 512-byte granularity, but alloc sizes that are various multiples
// of 512 bytes, to correspond with various protocol typical allocation sizes.
const unsigned char OutBufPoolMapping[1 << NumAllocSigBits] =
{
// Index Binary AllocRange Pool PoolAllocSize
0, // 0 0000 0..511 0 1024
0, // 1 0001 512..1023 0 1024
1, // 2 0010 1024..1535 1 1536
2, // 3 0011 1536..2047 2 2048
3, // 4 0100 2048..2559 3 2560
4, // 5 0101 2560..3071 4 8192
4, // 6 0110 3072..3583 4 8192
4, // 7 0111 3584..4095 4 8192
4, // 8 1000 4096..4607 4 8192
4, // 9 1001 4608..5119 4 8192
4, // 10 1010 5120..5631 4 8192
4, // 11 1011 5632..6143 4 8192
4, // 12 1100 6144..6655 4 8192
4, // 13 1101 6656..7167 4 8192
4, // 14 1110 7168..7679 4 8192
4, // 15 1111 7680..8191 4 8192
};
// After mapping we have a pool number and need to know the size to alloc.
const unsigned OutBufPoolAllocSizes[NumOutBufPools] =
{
1024, 1536, 2048, 2560, 8192
};
FAST_IO_DISPATCH IcaFastIoDispatch;
PEPROCESS IcaSystemProcess;
CCHAR IcaIrpStackSize = ICA_DEFAULT_IRP_STACK_SIZE;
CCHAR IcaPriorityBoost = ICA_DEFAULT_PRIORITY_BOOST;
TERMSRV_SYSTEM_PARAMS SysParams =
{
DEFAULT_MOUSE_THROTTLE_SIZE,
DEFAULT_KEYBOARD_THROTTLE_SIZE,
};
#ifdef notdef
FAST_IO_DISPATCH IcaFastIoDispatch =
{
11, // SizeOfFastIoDispatch
NULL, // FastIoCheckIfPossible
IcaFastIoRead, // FastIoRead
IcaFastIoWrite, // FastIoWrite
NULL, // FastIoQueryBasicInfo
NULL, // FastIoQueryStandardInfo
NULL, // FastIoLock
NULL, // FastIoUnlockSingle
NULL, // FastIoUnlockAll
NULL, // FastIoUnlockAllByKey
IcaFastIoDeviceControl // FastIoDeviceControl
};
#endif
#if DBG
ULONG IcaLocksAcquired = 0;
#endif
BOOLEAN
IcaInitializeData (
VOID
)
{
int i, j;
PAGED_CODE( );
#if DBG
IcaInitializeDebugData( );
#endif
//
// Initialize global lists.
//
InitializeListHead( &IcaSdLoadListHead );
InitializeListHead( &IcaStackListHead );
IcaTotalNumOfStacks = 0;
IcaNextStack = &IcaStackListHead;
pKeepAliveThreadObject = NULL;
for ( i = 0; i < NumOutBufPools; i++ )
InitializeListHead( &IcaFreeOutBufHead[i] );
//
// Initialize global spin locks and resources used by ICA.
//
KeInitializeSpinLock( &IcaSpinLock );
KeInitializeSpinLock( &IcaTraceSpinLock );
KeInitializeSpinLock( &IcaStackListSpinLock );
IcaInitializeHandleTable();
IcaReconnectResource = ICA_ALLOCATE_POOL( NonPagedPool, sizeof(*IcaReconnectResource) );
if ( IcaReconnectResource == NULL ) {
return FALSE;
}
ExInitializeResourceLite( IcaReconnectResource );
IcaSdLoadResource = ICA_ALLOCATE_POOL( NonPagedPool, sizeof(*IcaSdLoadResource) );
if ( IcaSdLoadResource == NULL ) {
return FALSE;
}
ExInitializeResourceLite( IcaSdLoadResource );
IcaTraceResource = ICA_ALLOCATE_POOL( NonPagedPool, sizeof(*IcaTraceResource) );
if ( IcaTraceResource == NULL ) {
return FALSE;
}
ExInitializeResourceLite( IcaTraceResource );
pIcaKeepAliveEvent = ICA_ALLOCATE_POOL(NonPagedPool, sizeof(KEVENT));
if ( pIcaKeepAliveEvent != NULL ) {
KeInitializeEvent(pIcaKeepAliveEvent, NotificationEvent, FALSE);
}
else {
return FALSE;
}
// Used by OutBuf alloc code for determining max overhead of OutBuf info
// for the default max size allocation.
MaxOutBufMdlOverhead = (unsigned)MmSizeOfMdl((PVOID)(PAGE_SIZE - 1),
MaxOutBufAlloc);
return TRUE;
}