windows-nt/Source/XPSP1/NT/net/sockets/winsock2/ws2help/ws2ifsl/ws2ifslp.h
2020-09-26 16:20:57 +08:00

108 lines
4.3 KiB
C

/*++
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