//////////////////////////////////////////////////////////////// // // Copyright (c) 2001 Microsoft Corporation // // Module Name: // sysvars.h // // Abstract: // Definitions for driver portion of tdi sample driver // ///////////////////////////////////////////////////////////////// #include "glbconst.h" extern "C" { #pragma warning(disable: NAMELESS_STRUCT_UNION) #include "wdm.h" #include "tdikrnl.h" #pragma warning(default: NAMELESS_STRUCT_UNION) } #include "glbtypes.h" #include ///////////////////////////////////////////////////////////////// // debugging macros ///////////////////////////////////////////////////////////////// #define DebugPrint0(fmt) DbgPrint(fmt) #define DebugPrint1(fmt,v1) DbgPrint(fmt,v1) #define DebugPrint2(fmt,v1,v2) DbgPrint(fmt,v1,v2) #define DebugPrint3(fmt,v1,v2,v3) DbgPrint(fmt,v1,v2,v3) #define DebugPrint4(fmt,v1,v2,v3,v4) DbgPrint(fmt,v1,v2,v3,v4) #define DebugPrint5(fmt,v1,v2,v3,v4,v5) DbgPrint(fmt,v1,v2,v3,v4,v5) #define DebugPrint6(fmt,v1,v2,v3,v4,v5,v6) DbgPrint(fmt,v1,v2,v3,v4,v5,v6) #define DebugPrint7(fmt,v1,v2,v3,v4,v5,v6,v7) \ DbgPrint(fmt,v1,v2,v3,v4,v5,v6,v7) #define DebugPrint8(fmt,v1,v2,v3,v4,v5,v6,v7,v8) \ DbgPrint(fmt,v1,v2,v3,v4,v5,v6,v7,v8) /////////////////////////////////////////////////////////////////////// // constant definitions /////////////////////////////////////////////////////////////////////// // // constants for GenericHeader->ulSignature // const ULONG ulINVALID_OBJECT = 0x00000000; const ULONG ulControlChannelObject = 0x00001000; const ULONG ulAddressObject = 0x00002000; const ULONG ulEndpointObject = 0x00004000; // // number of irps in irp pool // const ULONG ulIrpPoolSize = 32; // // max number of open object handles // const ULONG ulMAX_OBJ_HANDLES = 256; const USHORT usOBJ_HANDLE_MASK = 0x00FF; // = 255 const USHORT usOBJ_TYPE_MASK = 0xF000; /////////////////////////////////////////////////////////////////////// // type definitions /////////////////////////////////////////////////////////////////////// // // forward definitions // struct DEVICE_CONTEXT; struct ENDPOINT_OBJECT; struct RECEIVE_DATA; struct USERBUF_INFO; // // structure used for spinlocks // struct TDI_SPIN_LOCK { KSPIN_LOCK SpinLock; KIRQL OldIrql; }; typedef TDI_SPIN_LOCK *PTDI_SPIN_LOCK; // // event structure // typedef KEVENT TDI_EVENT, *PTDI_EVENT; // // structure used for list of address/device objects that can be opened // (maintained via the TSPnpAdd/DelAddressCallback functions // struct TDI_DEVICE_NODE { PTA_ADDRESS pTaAddress; // address of object UNICODE_STRING ustrDeviceName; // name of object ULONG ulState; }; typedef TDI_DEVICE_NODE *PTDI_DEVICE_NODE; // // states for device nodes // const ULONG ulDEVSTATE_UNUSED = 0; const ULONG ulDEVSTATE_DELETED = 1; const ULONG ulDEVSTATE_INUSE = 2; const ULONG ulMAX_DEVICE_NODES = 64; // // actual array structure // struct TDI_DEVNODE_LIST { TDI_SPIN_LOCK TdiSpinLock; // protects DeviceNode list TDI_DEVICE_NODE TdiDeviceNode[ulMAX_DEVICE_NODES]; }; typedef TDI_DEVNODE_LIST *PTDI_DEVNODE_LIST; // structure used for IRP array, used with AddressObjects and Endpoints // so that we don't have to allocates IRPs in a callback. // struct IRP_POOL { TDI_SPIN_LOCK TdiSpinLock; // protects rest of structure BOOLEAN fMustFree; // true if stangler must free pool ULONG ulPoolSize; // number of entries in pool PIRP pAvailIrpList; // irps available to be used PIRP pUsedIrpList; // irps that have been used PIRP pAllocatedIrp[1]; // all irps in pool }; typedef IRP_POOL *PIRP_POOL; // // this structure is at the beginning of all the nodes, allows generic functions // to be used for inserting/deleting nodes // struct GENERIC_HEADER { ULONG ulSignature; // type of block BOOLEAN fInCommand; // true if dealing with command GENERIC_HEADER *pPrevNode; // ptr to previous node -- same type GENERIC_HEADER *pNextNode; // ptr to next node -- same type TDI_EVENT TdiEvent; // event for CloseAddress/CloseEndpoint NTSTATUS lStatus; HANDLE FileHandle; // handle of device PFILE_OBJECT pFileObject; // ptr to file object for handle PDEVICE_OBJECT pDeviceObject; // ptr to device object for handle }; typedef GENERIC_HEADER *PGENERIC_HEADER; // // structure for control channel object // struct CONTROL_CHANNEL { GENERIC_HEADER GenHead; }; typedef CONTROL_CHANNEL *PCONTROL_CHANNEL; // // structure for address object // struct ADDRESS_OBJECT { GENERIC_HEADER GenHead; ENDPOINT_OBJECT *pEndpoint; // associate connection endpoint, if any TDI_SPIN_LOCK TdiSpinLock; // protects receive queue RECEIVE_DATA *pHeadReceiveData; // head of normal rcv queue RECEIVE_DATA *pTailReceiveData; // tail of normal rcv queue RECEIVE_DATA *pHeadRcvExpData; // head of expedited rcv queue RECEIVE_DATA *pTailRcvExpData; // tail of expedited rcv queue PIRP_POOL pIrpPool; // preallocated irps USERBUF_INFO *pHeadUserBufInfo; // linked list of posted buffers USERBUF_INFO *pTailUserBufInfo; }; typedef ADDRESS_OBJECT *PADDRESS_OBJECT; // // structure for endpoint connection object // struct ENDPOINT_OBJECT { GENERIC_HEADER GenHead; PADDRESS_OBJECT pAddressObject; // associate address object (if any) BOOLEAN fIsConnected; // true if connection established BOOLEAN fAcceptInProgress; // true if in process of accepting connection BOOLEAN fIsAssociated; // true if associated with address object BOOLEAN fStartedDisconnect; }; typedef ENDPOINT_OBJECT *PENDPOINT_OBJECT; // // structure used to store data received (used for both receive // and receive datagram) // struct RECEIVE_DATA { RECEIVE_DATA *pNextReceiveData; // next in list RECEIVE_DATA *pPrevReceiveData; // prev in list PUCHAR pucDataBuffer; // buffer of received data ULONG ulBufferLength; // total length of buffer ULONG ulBufferUsed; // bytes used in buffer TRANSADDR TransAddr; // address received from (rd only) }; typedef RECEIVE_DATA *PRECEIVE_DATA; // // all objects opened by this driver // struct OBJECT_LIST { TDI_SPIN_LOCK TdiSpinLock; // protects openinfo array PGENERIC_HEADER GenHead[ulMAX_OBJ_HANDLES]; // open handles controlled by driver }; typedef OBJECT_LIST *POBJECT_LIST; // // Device Driver data struct definition // // Device Context - hanging off the end of the DeviceObject for the // driver the device context contains the control structures used // to administer the tdi sample // struct DEVICE_CONTEXT { DEVICE_OBJECT DeviceObject; // the I/O system's device object. ULONG ulOpenCount; // Number of outstanding opens of driver PIRP pLastCommandIrp; // irp of last submitted command BOOLEAN fInitialized; // TRUE if TdiTestInit succeeded }; typedef DEVICE_CONTEXT *PDEVICE_CONTEXT; ////////////////////////////////////////////////////////////////////// // externs for global variables ////////////////////////////////////////////////////////////////////// #ifdef _IN_MAIN_ ULONG ulDebugLevel; // show command info? PVOID pvMemoryList; // head of alloced memory list TDI_SPIN_LOCK MemTdiSpinLock; // protects pvMemoryList PTDI_DEVNODE_LIST pTdiDevnodeList; // list of devices POBJECT_LIST pObjectList; // list of opened objects #else extern ULONG ulDebugLevel; extern PVOID pvMemoryList; extern TDI_SPIN_LOCK MemTdiSpinLock; extern PTDI_DEVNODE_LIST pTdiDevnodeList; extern POBJECT_LIST pObjectList; #endif #include "sysprocs.h" ///////////////////////////////////////////////////////////////////// // end of file sysvars.h /////////////////////////////////////////////////////////////////////