/*++ Copyright (c) 1989 Microsoft Corporation Module Name: WS2IFSL.H Abstract: This module defines interface 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 --*/ #ifndef _WS2IFSL_ #define _WS2IFSL_ // Macro to align address data in the output buffer #define ADDR_ALIGN(sz) (((sz)+1)&(~3)) // Parameters for IOCTL_WS2IFSL_RETRIEVE_DRV_REQ typedef struct _WS2IFSL_RTRV_PARAMS { IN ULONG UniqueId; // Unique ID OUT PVOID DllContext; // Context associated by dll // with the socket file. OUT ULONG RequestType; // Request type #define WS2IFSL_REQUEST_READ 0 #define WS2IFSL_REQUEST_WRITE 1 #define WS2IFSL_REQUEST_SENDTO 2 #define WS2IFSL_REQUEST_RECV 3 #define WS2IFSL_REQUEST_RECVFROM 4 #define WS2IFSL_REQUEST_QUERYHANDLE 5 OUT ULONG DataLen; // Length of data/buffer OUT ULONG AddrLen; // Length of addr/buffer OUT ULONG Flags; // Flags } WS2IFSL_RTRV_PARAMS, *PWS2IFSL_RTRV_PARAMS; // Parameters for IOCTL_WS2IFSL_COMPLETE_DRV_REQ typedef struct _WS2IFSL_CMPL_PARAMS { IN HANDLE SocketHdl; // Handle of socket object IN ULONG UniqueId; // Unique ID IN ULONG DataLen; // Length of data to copy/report IN ULONG AddrLen; // Length of addr to copy and report IN NTSTATUS Status; // Completion status } WS2IFSL_CMPL_PARAMS, *PWS2IFSL_CMPL_PARAMS; // Parameters for IOCTL_WS2IFSL_COMPLETE_DRV_CAN typedef struct _WS2IFSL_CNCL_PARAMS { IN ULONG UniqueId; // Unique ID } WS2IFSL_CNCL_PARAMS, *PWS2IFSL_CNCL_PARAMS; // Socket context parameters typedef struct _WS2IFSL_SOCKET_CTX { PVOID DllContext; // Context value to be associated // with the socket HANDLE ProcessFile; // Process file handle for the // current process } WS2IFSL_SOCKET_CTX, *PWS2IFSL_SOCKET_CTX; // Process context parameters typedef struct _WS2IFSL_PROCESS_CTX { HANDLE ApcThread; // Thread to queue APC's to PPS_APC_ROUTINE RequestRoutine; // APC routine to pass requests PPS_APC_ROUTINE CancelRoutine; // APC routine to pass cancel PVOID ApcContext; // Apc routine context ULONG DbgLevel; // Used only in debug builds, // (0 on free DLL builds and ignored // by the free driver) } WS2IFSL_PROCESS_CTX, *PWS2IFSL_PROCESS_CTX; // WS2IFSL device name #define WS2IFSL_DEVICE_NAME L"\\Device\\WS2IFSL" #define WS2IFSL_SOCKET_FILE_NAME WS2IFSL_DEVICE_NAME L"\\NifsSct" #define WS2IFSL_PROCESS_FILE_NAME WS2IFSL_DEVICE_NAME L"\\NifsPvd" // Extended attribute names for the WS2IFSL files (note that size of the // string (including terminating NULL) is carefully chosen to ensure // quad word alignment of the attribute value): // Socket file #define WS2IFSL_SOCKET_EA_NAME "NifsSct" #define WS2IFSL_SOCKET_EA_NAME_LENGTH (sizeof(WS2IFSL_SOCKET_EA_NAME)-1) #define WS2IFSL_SOCKET_EA_VALUE_LENGTH (sizeof(WS2IFSL_SOCKET_CTX)) #define WS2IFSL_SOCKET_EA_VALUE_OFFSET \ (FIELD_OFFSET(FILE_FULL_EA_INFORMATION, \ EaName[WS2IFSL_SOCKET_EA_NAME_LENGTH+1])) #define GET_WS2IFSL_SOCKET_EA_VALUE(eaInfo) \ ((PWS2IFSL_SOCKET_CTX)( \ (PUCHAR)eaInfo +WS2IFSL_SOCKET_EA_VALUE_OFFSET)) #define WS2IFSL_SOCKET_EA_INFO_LENGTH \ (WS2IFSL_SOCKET_EA_VALUE_OFFSET+WS2IFSL_SOCKET_EA_VALUE_LENGTH) // Process file #define WS2IFSL_PROCESS_EA_NAME "NifsPvd" #define WS2IFSL_PROCESS_EA_NAME_LENGTH (sizeof(WS2IFSL_PROCESS_EA_NAME)-1) #define WS2IFSL_PROCESS_EA_VALUE_LENGTH (sizeof(WS2IFSL_PROCESS_CTX)) #define WS2IFSL_PROCESS_EA_VALUE_OFFSET \ (FIELD_OFFSET(FILE_FULL_EA_INFORMATION, \ EaName[WS2IFSL_PROCESS_EA_NAME_LENGTH+1])) #define GET_WS2IFSL_PROCESS_EA_VALUE(eaInfo) \ ((PWS2IFSL_PROCESS_CTX)( \ (PUCHAR)eaInfo +WS2IFSL_PROCESS_EA_VALUE_OFFSET)) #define WS2IFSL_PROCESS_EA_INFO_LENGTH \ (WS2IFSL_PROCESS_EA_VALUE_OFFSET+WS2IFSL_PROCESS_EA_VALUE_LENGTH) // All WS2IFSL IOCTL are private and should be out of range // reserved by Microsoft for public codes #define WS2IFSL_IOCTL_PROCESS_BASE 0x00000800 #define WS2IFSL_IOCTL_SOCKET_BASE 0x00000810 // Choice of device type implies access priviliges #define FILE_DEVICE_WS2IFSL FILE_DEVICE_NAMED_PIPE // Macro that simplifies definition of WS2IFSL control codes #define IOCTL_WS2IFSL(File,Function,Method) \ CTL_CODE ( \ FILE_DEVICE_WS2IFSL, \ WS2IFSL_IOCTL_##File##_BASE+Function, \ Method, \ FILE_ANY_ACCESS) /* * IOCTL: RETRIEVE_DRV_REQ * File: Process * Purpose: Retreive request to be executed by the DLL * Paremeters: InputBuffer - WS2IFSL_RTRV_PARAMS * InputBufferLength - sizeof (WS2IFSL_RTRV_PARAMS) * OutputBuffer - buffer for request * OutputBufferLength - size of the buffer * Returns: * STATUS_SUCCESS - driver request copied ok, no more * requests pending * STATUS_MORE_ENTRIES - driver request copied ok, another * one is pending. * STATUS_CANCELLED - request was cancelled * STATUS_NOT_IMPLEMENTED - opretion was performed on file * that is not WS2IFSL process file * STATUS_INVALID_PARAMETER - one of the parameters is invalid * STATUS_NOT_IMPLEMENTED - opretion was performed on file * that is not WS2IFSL process file */ #define IOCTL_WS2IFSL_RETRIEVE_DRV_REQ IOCTL_WS2IFSL (PROCESS,0,METHOD_NEITHER) /* * IOCTL: COMPLETE_DRV_CAN * File: Process * Purpose: Completes cancel request executed by the DLL * Paremeters: InputBuffer - WS2IFSL_CNCL_PARAMS * InputBufferLength - sizeof (WS2IFSL_CNCL_PARAMS) * OutputBuffer - NULL * OutputBufferLength - 0 * Returns: * STATUS_SUCCESS - driver completed copied ok, no more * requests pending. * STATUS_MORE_ENTRIES - driver request completed ok, another * one is pending. * STATUS_INVALID_PARAMETER - one of the parameters is invalid * STATUS_NOT_IMPLEMENTED - opretion was performed on file * that is not WS2IFSL process file */ #define IOCTL_WS2IFSL_COMPLETE_DRV_CAN IOCTL_WS2IFSL (PROCESS,1,METHOD_NEITHER) /* * IOCTL: COMPLETE_DRV_REQ * File: Socket * Purpose: Completes request retrived from driver. * Paremeters: InputBuffer - WS2IFSL_CMPL_PARAMS * InputBufferLength - sizeof (WS2IFSL_CMPL_PARAMS) * OutputBuffer - buffer for request * OutputBufferLength - size of the buffer * * Returns: STATUS_SUCCESS - operation completed OK. * STATUS_CANCELLED - operation was cancelled already. * STATUS_NOT_IMPLEMENTED - opretion was performed on file * that is not WS2IFSL process file * STATUS_INVALID_PARAMETER - size of input buffer is invalid */ #define IOCTL_WS2IFSL_COMPLETE_DRV_REQ IOCTL_WS2IFSL (PROCESS,2,METHOD_NEITHER) /* * IOCTL: SET_SOCKET_CONTEXT * File: Socket * Purpose: Sets socket process context and associates context value * with the socket (passed as a parameter to the APC routine). * Paremeters: InputBuffer - PWS2IFSL_SOCKET_CTX, socket context * parameters * InputBufferLength - sizeof(WS2IFSL_SOCKET_CTX) * OutputBuffer - not used (NULL) * OutputBufferLength - not used (0) * Returns: STATUS_SUCCESS - socket context established OK * STATUS_INSUFFICIENT_RESOURCES - not enough resouces to * perform the operation * STATUS_INVALID_PARAMETER - size if input buffer ProcessFile * parameter are invalid * STATUS_NOT_IMPLEMENTED - opretion was performed on file * that is not WS2IFSL socket file */ #define IOCTL_WS2IFSL_SET_SOCKET_CONTEXT IOCTL_WS2IFSL (SOCKET,0,METHOD_NEITHER) /* * IOCTL: COMPLETE_PVD_REQ * File: Socket * Purpose: Completes asynchronous requests for providers. * Paremeters: InputBuffer - PIO_STATUS_INFORMATION, status information * for the request being completed * InputBufferLength - sizeof(IO_STATUS_INFORMATION) * OutputBuffer - NULL * OutputBufferLength - 0 * Returns: Status field of IO_STATUS_INFORMATION structure. * STATUS_NOT_IMPLEMENTED - opretion was performed on file * that is not WS2IFSL socket file * STATUS_INVALID_PARAMETER - size of input buffer is invalid */ #define IOCTL_WS2IFSL_COMPLETE_PVD_REQ IOCTL_WS2IFSL (SOCKET,1,METHOD_NEITHER) #endif