/*++ Copyright (c) 1989 Microsoft Corporation Module Name: WS2IFSLP.H Abstract: This module defines private constants and data structures for Winsock2 IFS transport layer driver. Author: Vadim Eydelman (VadimE) Dec-1996 Revision History: Vadim Eydelman (VadimE) Oct-1997, rewrite to properly handle IRP cancellation --*/ // Pool tags #define PROCESS_FILE_CONTEXT_TAG 'P2sW' #define SOCKET_FILE_CONTEXT_TAG 'S2sW' #define CANCEL_CTX_TAG 'C2sW' // File EAName tags #define SOCKET_FILE_EANAME_TAG 'kcoS' #define PROCESS_FILE_EANAME_TAG 'corP' // Macro to get the code back from IOCTL #define WS2IFSL_IOCTL_FUNCTION(File,Ioctl) \ (IoGetFunctionCodeFromCtlCode(Ioctl) \ - WS2IFSL_IOCTL_##File##_BASE) typedef struct _IFSL_CANCEL_CTX { LIST_ENTRY ListEntry; PFILE_OBJECT SocketFile; ULONG UniqueId; } IFSL_CANCEL_CTX, *PIFSL_CANCEL_CTX; typedef struct _IFSL_QUEUE { LIST_ENTRY ListHead; BOOLEAN Busy; KSPIN_LOCK Lock; KAPC Apc; } IFSL_QUEUE, *PIFSL_QUEUE; // Context (FsContext field of the NT file object) associated with the // file opened by WS2IFSL DLL on per process basis. typedef struct _IFSL_PROCESS_CTX { ULONG EANameTag; // 'Proc' - first four bytes of // extended attribute name for this // type of file HANDLE UniqueId; // unique identifier of the process // (read from UniqueProcessID field of // the EPROCESS structure) IFSL_QUEUE RequestQueue;// queue of requests IFSL_QUEUE CancelQueue;// queue of cancel requests ULONG CancelId; // Used to generate IDs for // each cancel request in the process. // Combined with cancel request pointer // itself allows to match requests completed by // user mode DLL with pending ones #if DBG ULONG DbgLevel; #endif } IFSL_PROCESS_CTX, *PIFSL_PROCESS_CTX; // Context (FsContext field of the NT file object) associated with // file opened by WS2IFSL DLL for each socket. typedef struct _IFSL_SOCKET_CTX { ULONG EANameTag; // 'Sock' - first four bytes of // extended attribute name for this // type of file PVOID DllContext; // Context maintained for WS2IFSL DLL PFILE_OBJECT ProcessRef; // Pointer to process file object LONG IrpId; // Used to generate IDs for // each IRP on the socket. Combined // with IRP pointer itself allows // to match requests completed by // user mode DLL with pending IRPs LIST_ENTRY ProcessedIrps; // List of request being processed by // WS2IFSL DLL in APC thread KSPIN_LOCK SpinLock; // Protects requests in the list // above as well as process reference PIFSL_CANCEL_CTX CancelCtx; // Context to pass cancel request // to user mode DLL } IFSL_SOCKET_CTX, *PIFSL_SOCKET_CTX; #define GET_SOCKET_PROCESSID(ctx) \ (((PIFSL_PROCESS_CTX)((ctx)->ProcessRef->FsContext))->UniqueId) // // Driver context field usage macros // #define IfslRequestId DriverContext[0] // Request's unique id #define IfslRequestQueue DriverContext[1] // Queue if inserted, NULL othw #define IfslRequestFlags DriverContext[2] // Request specific flags #define IfslAddressLenPtr DriverContext[3] // Address length pointer // Irp stack location fields usage macros #define IfslAddressBuffer Type3InputBuffer // Source address #define IfslAddressLength InputBufferLength // Source address length