/*++ Copyright (c) 1992 Microsoft Corporation Module Name: Afd.h Abstract: Contains structures and declarations for AFD. AFD stands for the Ancillary Function Driver. This driver enhances the functionality of TDI so that it is a sufficiently rich interface to support user-mode sockets and XTI DLLs. Author: David Treadwell (davidtr) 20-Feb-1992 Revision History: --*/ #ifndef _AFD_ #define _AFD_ // // If WINSOCK2.H has not been included, then just embed the definition // of the WSABUF and QOS structures here. This makes building AFD.SYS // much easier. // #ifndef _WINSOCK2API_ typedef struct _WSABUF { ULONG len; PCHAR buf; } WSABUF, *LPWSABUF; typedef enum { BestEffortService, ControlledLoadService, PredictiveService, GuaranteedDelayService, GuaranteedService } GUARANTEE; typedef long int32; typedef struct _flowspec { int32 TokenRate; /* In Bytes/sec */ int32 TokenBucketSize; /* In Bytes */ int32 PeakBandwidth; /* In Bytes/sec */ int32 Latency; /* In microseconds */ int32 DelayVariation; /* In microseconds */ GUARANTEE LevelOfGuarantee; /* Guaranteed, Predictive */ /* or Best Effort */ int32 CostOfCall; /* Reserved for future use, */ /* must be set to 0 now */ int32 NetworkAvailability; /* read-only: */ /* 1 if accessible, */ /* 0 if not */ } FLOWSPEC, *LPFLOWSPEC; typedef struct _QualityOfService { FLOWSPEC SendingFlowspec; /* the flow spec for data sending */ FLOWSPEC ReceivingFlowspec; /* the flow spec for data receiving */ WSABUF ProviderSpecific; /* additional provider specific stuff */ } QOS, *LPQOS; #endif #define AFD_DEVICE_NAME L"\\Device\\Afd" // // Structures used on NtCreateFile() for AFD. // typedef enum _AFD_ENDPOINT_TYPE { AfdEndpointTypeStream, AfdEndpointTypeDatagram, AfdEndpointTypeRaw, AfdEndpointTypeSequencedPacket, AfdEndpointTypeReliableMessage, AfdEndpointTypeUnknown } AFD_ENDPOINT_TYPE, *PAFD_ENDPOINT_TYPE; #define MIN_AFD_ENDPOINT_TYPE AfdEndpointTypeStream #define MAX_AFD_ENDPOINT_TYPE AfdEndpointTypeUnknown typedef struct _AFD_OPEN_PACKET { AFD_ENDPOINT_TYPE EndpointType; LONG GroupID; ULONG TransportDeviceNameLength; WCHAR TransportDeviceName[1]; } AFD_OPEN_PACKET, *PAFD_OPEN_PACKET; // *** the XX is to ensure natural alignment of the open packet part // of the EA buffer #define AfdOpenPacket "AfdOpenPacketXX" #define AFD_OPEN_PACKET_NAME_LENGTH (sizeof(AfdOpenPacket) - 1) // // The input structure for IOCTL_AFD_START_LISTEN. // typedef struct _AFD_LISTEN_INFO { ULONG MaximumConnectionQueue; } AFD_LISTEN_INFO, *PAFD_LISTEN_INFO; // // The output structure for IOCTL_AFD_WAIT_FOR_LISTEN. // typedef struct _AFD_LISTEN_RESPONSE_INFO { ULONG Sequence; TRANSPORT_ADDRESS RemoteAddress; } AFD_LISTEN_RESPONSE_INFO, *PAFD_LISTEN_RESPONSE_INFO; // // The input structure for IOCTL_AFD_ACCEPT. // typedef struct _AFD_ACCEPT_INFO { ULONG Sequence; HANDLE AcceptHandle; } AFD_ACCEPT_INFO, *PAFD_ACCEPT_INFO; typedef struct _AFD_SUPER_ACCEPT_INFO { HANDLE AcceptHandle; PVOID AcceptEndpoint; PVOID AcceptFileObject; ULONG ReceiveDataLength; ULONG LocalAddressLength; ULONG RemoteAddressLength; AFD_LISTEN_RESPONSE_INFO ListenResponseInfo; } AFD_SUPER_ACCEPT_INFO, *PAFD_SUPER_ACCEPT_INFO; // // The input structure for IOCTL_AFD_DEFER_ACCEPT. // typedef struct _AFD_DEFER_ACCEPT_INFO { ULONG Sequence; BOOLEAN Reject; } AFD_DEFER_ACCEPT_INFO, *PAFD_DEFER_ACCEPT_INFO; // // Flags and input structure for IOCTL_AFD_PARTIAL_DISCONNECT. // #define AFD_PARTIAL_DISCONNECT_SEND 0x01 #define AFD_PARTIAL_DISCONNECT_RECEIVE 0x02 #define AFD_ABORTIVE_DISCONNECT 0x4 #define AFD_UNCONNECT_DATAGRAM 0x08 typedef struct _AFD_PARTIAL_DISCONNECT_INFO { ULONG DisconnectMode; LARGE_INTEGER Timeout; } AFD_PARTIAL_DISCONNECT_INFO, *PAFD_PARTIAL_DISCONNECT_INFO; // // Structures for IOCTL_AFD_POLL. // typedef struct _AFD_POLL_HANDLE_INFO { HANDLE Handle; ULONG PollEvents; NTSTATUS Status; } AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO; typedef struct _AFD_POLL_INFO { LARGE_INTEGER Timeout; ULONG NumberOfHandles; BOOLEAN Unique; AFD_POLL_HANDLE_INFO Handles[1]; } AFD_POLL_INFO, *PAFD_POLL_INFO; #define AFD_POLL_RECEIVE_BIT 0 #define AFD_POLL_RECEIVE (1 << AFD_POLL_RECEIVE_BIT) #define AFD_POLL_RECEIVE_EXPEDITED_BIT 1 #define AFD_POLL_RECEIVE_EXPEDITED (1 << AFD_POLL_RECEIVE_EXPEDITED_BIT) #define AFD_POLL_SEND_BIT 2 #define AFD_POLL_SEND (1 << AFD_POLL_SEND_BIT) #define AFD_POLL_DISCONNECT_BIT 3 #define AFD_POLL_DISCONNECT (1 << AFD_POLL_DISCONNECT_BIT) #define AFD_POLL_ABORT_BIT 4 #define AFD_POLL_ABORT (1 << AFD_POLL_ABORT_BIT) #define AFD_POLL_LOCAL_CLOSE_BIT 5 #define AFD_POLL_LOCAL_CLOSE (1 << AFD_POLL_LOCAL_CLOSE_BIT) #define AFD_POLL_CONNECT_BIT 6 #define AFD_POLL_CONNECT (1 << AFD_POLL_CONNECT_BIT) #define AFD_POLL_ACCEPT_BIT 7 #define AFD_POLL_ACCEPT (1 << AFD_POLL_ACCEPT_BIT) #define AFD_POLL_CONNECT_FAIL_BIT 8 #define AFD_POLL_CONNECT_FAIL (1 << AFD_POLL_CONNECT_FAIL_BIT) #define AFD_POLL_QOS_BIT 9 #define AFD_POLL_QOS (1 << AFD_POLL_QOS_BIT) #define AFD_POLL_GROUP_QOS_BIT 10 #define AFD_POLL_GROUP_QOS (1 << AFD_POLL_GROUP_QOS_BIT) #define AFD_NUM_POLL_EVENTS 11 #define AFD_POLL_ALL ((1 << AFD_NUM_POLL_EVENTS) - 1) // // Structure for querying receive information. // typedef struct _AFD_RECEIVE_INFORMATION { ULONG BytesAvailable; ULONG ExpeditedBytesAvailable; } AFD_RECEIVE_INFORMATION, *PAFD_RECEIVE_INFORMATION; // // Structure for quering the TDI handles for an AFD endpoint. // #define AFD_QUERY_ADDRESS_HANDLE 1 #define AFD_QUERY_CONNECTION_HANDLE 2 typedef struct _AFD_HANDLE_INFO { HANDLE TdiAddressHandle; HANDLE TdiConnectionHandle; } AFD_HANDLE_INFO, *PAFD_HANDLE_INFO; // // Structure and manifests for setting information in AFD. // typedef struct _AFD_INFORMATION { ULONG InformationType; union { BOOLEAN Boolean; ULONG Ulong; LARGE_INTEGER LargeInteger; } Information; } AFD_INFORMATION, *PAFD_INFORMATION; #define AFD_INLINE_MODE 0x01 #define AFD_NONBLOCKING_MODE 0x02 #define AFD_MAX_SEND_SIZE 0x03 #define AFD_SENDS_PENDING 0x04 #define AFD_MAX_PATH_SEND_SIZE 0x05 #define AFD_RECEIVE_WINDOW_SIZE 0x06 #define AFD_SEND_WINDOW_SIZE 0x07 #define AFD_CONNECT_TIME 0x08 #define AFD_CIRCULAR_QUEUEING 0x09 #define AFD_GROUP_ID_AND_TYPE 0x0A // // Structure for the transmit file IOCTL. // typedef struct _AFD_TRANSMIT_FILE_INFO { LARGE_INTEGER Offset; LARGE_INTEGER WriteLength; ULONG SendPacketLength; HANDLE FileHandle; PVOID Head; ULONG HeadLength; PVOID Tail; ULONG TailLength; ULONG Flags; } AFD_TRANSMIT_FILE_INFO, *PAFD_TRANSMIT_FILE_INFO; // // Flags for the TransmitFile API. // #define AFD_TF_DISCONNECT 0x01 #define AFD_TF_REUSE_SOCKET 0x02 #define AFD_TF_WRITE_BEHIND 0x04 #ifdef NT351 // // Structure for queuing user-mode APCs. // typedef struct _AFD_QUEUE_APC_INFO { HANDLE Thread; PVOID ApcRoutine; PVOID ApcContext; PVOID SystemArgument1; PVOID SystemArgument2; } AFD_QUEUE_APC_INFO, *PAFD_QUEUE_APC_INFO; #endif // NT351 // // Flag definitions for the AfdFlags field in the AFD_SEND_INFO, // AFD_SEND_DATAGRAM_INFO, AFD_RECV_INFO, and AFD_RECV_DATAGRAM_INFO // structures. // #define AFD_NO_FAST_IO 0x0001 // Always fail Fast IO on this request. #define AFD_OVERLAPPED 0x0002 // Overlapped operation. // // Structure for connected sends. // typedef struct _AFD_SEND_INFO { LPWSABUF BufferArray; ULONG BufferCount; ULONG AfdFlags; ULONG TdiFlags; } AFD_SEND_INFO, *PAFD_SEND_INFO; // // Structure for unconnected datagram sends. // typedef struct _AFD_SEND_DATAGRAM_INFO { LPWSABUF BufferArray; ULONG BufferCount; ULONG AfdFlags; TDI_REQUEST_SEND_DATAGRAM TdiRequest; TDI_CONNECTION_INFORMATION TdiConnInfo; } AFD_SEND_DATAGRAM_INFO, *PAFD_SEND_DATAGRAM_INFO; // // Structure for connected recvs. // typedef struct _AFD_RECV_INFO { LPWSABUF BufferArray; ULONG BufferCount; ULONG AfdFlags; ULONG TdiFlags; } AFD_RECV_INFO, *PAFD_RECV_INFO; // // Structure for receiving datagrams on unconnected sockets. // typedef struct _AFD_RECV_DATAGRAM_INFO { LPWSABUF BufferArray; ULONG BufferCount; ULONG AfdFlags; ULONG TdiFlags; PVOID Address; PULONG AddressLength; } AFD_RECV_DATAGRAM_INFO, *PAFD_RECV_DATAGRAM_INFO; #define AFD_MAX_TDI_FAST_ADDRESS 32 // // Structure for event select. // typedef struct _AFD_EVENT_SELECT_INFO { HANDLE Event; ULONG PollEvents; } AFD_EVENT_SELECT_INFO, *PAFD_EVENT_SELECT_INFO; // // Structure for enum network events. // typedef struct _AFD_ENUM_NETWORK_EVENTS_INFO { HANDLE Event; ULONG PollEvents; NTSTATUS EventStatus[AFD_NUM_POLL_EVENTS]; } AFD_ENUM_NETWORK_EVENTS_INFO, *PAFD_ENUM_NETWORK_EVENTS_INFO; // // Structures for QOS and grouping. // typedef struct _AFD_QOS_INFO { QOS Qos; BOOLEAN GroupQos; } AFD_QOS_INFO, *PAFD_QOS_INFO; // // Group membership type. // typedef enum _AFD_GROUP_TYPE { GroupTypeNeither = 0, GroupTypeConstrained = SG_CONSTRAINED_GROUP, GroupTypeUnconstrained = SG_UNCONSTRAINED_GROUP } AFD_GROUP_TYPE, *PAFD_GROUP_TYPE; // // Note that, for totally slimy reasons, the following // structure must be exactly eight bytes long (the size // of a LARGE_INTEGER). See msafd\socket.c and afd\misc.c // for the gory details. // typedef struct _AFD_GROUP_INFO { LONG GroupID; AFD_GROUP_TYPE GroupType; } AFD_GROUP_INFO, *PAFD_GROUP_INFO; // // Structure for validating group membership. // typedef struct _AFD_VALIDATE_GROUP_INFO { LONG GroupID; TRANSPORT_ADDRESS RemoteAddress; } AFD_VALIDATE_GROUP_INFO, *PAFD_VALIDATE_GROUP_INFO; // // Structure for querying connect data on an unaccepted connection. // typedef struct _AFD_UNACCEPTED_CONNECT_DATA_INFO { ULONG Sequence; ULONG ConnectDataLength; BOOLEAN LengthOnly; } AFD_UNACCEPTED_CONNECT_DATA_INFO, *PAFD_UNACCEPTED_CONNECT_DATA_INFO; // // AFD IOCTL code definitions. // // N.B. To ensure the efficient of the code generated by AFD's // IOCTL dispatcher, these IOCTL codes should be contiguous // (no gaps). // // N.B. If new IOCTLs are added here, update the lookup table in // ntos\afd\dispatch.c! // #define FSCTL_AFD_BASE FILE_DEVICE_NETWORK #define _AFD_CONTROL_CODE(request,method) \ ((FSCTL_AFD_BASE)<<12 | (request<<2) | method) #define _AFD_REQUEST(ioctl) \ ((((ULONG)(ioctl)) >> 2) & 0x03FF) #define _AFD_BASE(ioctl) \ ((((ULONG)(ioctl)) >> 12) & 0xFFFFF) #define AFD_BIND 0 #define AFD_CONNECT 1 #define AFD_START_LISTEN 2 #define AFD_WAIT_FOR_LISTEN 3 #define AFD_ACCEPT 4 #define AFD_RECEIVE 5 #define AFD_RECEIVE_DATAGRAM 6 #define AFD_SEND 7 #define AFD_SEND_DATAGRAM 8 #define AFD_POLL 9 #define AFD_PARTIAL_DISCONNECT 10 #define AFD_GET_ADDRESS 11 #define AFD_QUERY_RECEIVE_INFO 12 #define AFD_QUERY_HANDLES 13 #define AFD_SET_INFORMATION 14 #define AFD_GET_CONTEXT_LENGTH 15 #define AFD_GET_CONTEXT 16 #define AFD_SET_CONTEXT 17 #define AFD_SET_CONNECT_DATA 18 #define AFD_SET_CONNECT_OPTIONS 19 #define AFD_SET_DISCONNECT_DATA 20 #define AFD_SET_DISCONNECT_OPTIONS 21 #define AFD_GET_CONNECT_DATA 22 #define AFD_GET_CONNECT_OPTIONS 23 #define AFD_GET_DISCONNECT_DATA 24 #define AFD_GET_DISCONNECT_OPTIONS 25 #define AFD_SIZE_CONNECT_DATA 26 #define AFD_SIZE_CONNECT_OPTIONS 27 #define AFD_SIZE_DISCONNECT_DATA 28 #define AFD_SIZE_DISCONNECT_OPTIONS 29 #define AFD_GET_INFORMATION 30 #define AFD_TRANSMIT_FILE 31 #define AFD_SUPER_ACCEPT 32 #define AFD_EVENT_SELECT 33 #define AFD_ENUM_NETWORK_EVENTS 34 #define AFD_DEFER_ACCEPT 35 #define AFD_WAIT_FOR_LISTEN_LIFO 36 #define AFD_SET_QOS 37 #define AFD_GET_QOS 38 #define AFD_NO_OPERATION 39 #define AFD_VALIDATE_GROUP 40 #define AFD_GET_UNACCEPTED_CONNECT_DATA 41 #ifdef NT351 #define AFD_QUEUE_APC 42 #endif // NT351 #define IOCTL_AFD_BIND _AFD_CONTROL_CODE( AFD_BIND, METHOD_BUFFERED ) #define IOCTL_AFD_CONNECT _AFD_CONTROL_CODE( AFD_CONNECT, METHOD_BUFFERED ) #define IOCTL_AFD_START_LISTEN _AFD_CONTROL_CODE( AFD_START_LISTEN, METHOD_BUFFERED ) #define IOCTL_AFD_WAIT_FOR_LISTEN _AFD_CONTROL_CODE( AFD_WAIT_FOR_LISTEN, METHOD_BUFFERED ) #define IOCTL_AFD_ACCEPT _AFD_CONTROL_CODE( AFD_ACCEPT, METHOD_BUFFERED ) #define IOCTL_AFD_RECEIVE _AFD_CONTROL_CODE( AFD_RECEIVE, METHOD_NEITHER ) #define IOCTL_AFD_RECEIVE_DATAGRAM _AFD_CONTROL_CODE( AFD_RECEIVE_DATAGRAM, METHOD_NEITHER ) #define IOCTL_AFD_SEND _AFD_CONTROL_CODE( AFD_SEND, METHOD_NEITHER ) #define IOCTL_AFD_SEND_DATAGRAM _AFD_CONTROL_CODE( AFD_SEND_DATAGRAM, METHOD_NEITHER ) #define IOCTL_AFD_POLL _AFD_CONTROL_CODE( AFD_POLL, METHOD_BUFFERED ) #define IOCTL_AFD_PARTIAL_DISCONNECT _AFD_CONTROL_CODE( AFD_PARTIAL_DISCONNECT, METHOD_BUFFERED ) #define IOCTL_AFD_GET_ADDRESS _AFD_CONTROL_CODE( AFD_GET_ADDRESS, METHOD_OUT_DIRECT ) #define IOCTL_AFD_QUERY_RECEIVE_INFO _AFD_CONTROL_CODE( AFD_QUERY_RECEIVE_INFO, METHOD_BUFFERED ) #define IOCTL_AFD_QUERY_HANDLES _AFD_CONTROL_CODE( AFD_QUERY_HANDLES, METHOD_BUFFERED ) #define IOCTL_AFD_SET_INFORMATION _AFD_CONTROL_CODE( AFD_SET_INFORMATION, METHOD_BUFFERED ) #define IOCTL_AFD_GET_CONTEXT_LENGTH _AFD_CONTROL_CODE( AFD_GET_CONTEXT_LENGTH, METHOD_BUFFERED ) #define IOCTL_AFD_GET_CONTEXT _AFD_CONTROL_CODE( AFD_GET_CONTEXT, METHOD_BUFFERED ) #define IOCTL_AFD_SET_CONTEXT _AFD_CONTROL_CODE( AFD_SET_CONTEXT, METHOD_BUFFERED ) #define IOCTL_AFD_SET_CONNECT_DATA _AFD_CONTROL_CODE( AFD_SET_CONNECT_DATA, METHOD_BUFFERED ) #define IOCTL_AFD_SET_CONNECT_OPTIONS _AFD_CONTROL_CODE( AFD_SET_CONNECT_OPTIONS, METHOD_BUFFERED ) #define IOCTL_AFD_SET_DISCONNECT_DATA _AFD_CONTROL_CODE( AFD_SET_DISCONNECT_DATA, METHOD_BUFFERED ) #define IOCTL_AFD_SET_DISCONNECT_OPTIONS _AFD_CONTROL_CODE( AFD_SET_DISCONNECT_OPTIONS, METHOD_BUFFERED ) #define IOCTL_AFD_GET_CONNECT_DATA _AFD_CONTROL_CODE( AFD_GET_CONNECT_DATA, METHOD_BUFFERED ) #define IOCTL_AFD_GET_CONNECT_OPTIONS _AFD_CONTROL_CODE( AFD_GET_CONNECT_OPTIONS, METHOD_BUFFERED ) #define IOCTL_AFD_GET_DISCONNECT_DATA _AFD_CONTROL_CODE( AFD_GET_DISCONNECT_DATA, METHOD_BUFFERED ) #define IOCTL_AFD_GET_DISCONNECT_OPTIONS _AFD_CONTROL_CODE( AFD_GET_DISCONNECT_OPTIONS, METHOD_BUFFERED ) #define IOCTL_AFD_SIZE_CONNECT_DATA _AFD_CONTROL_CODE( AFD_SIZE_CONNECT_DATA, METHOD_BUFFERED ) #define IOCTL_AFD_SIZE_CONNECT_OPTIONS _AFD_CONTROL_CODE( AFD_SIZE_CONNECT_OPTIONS, METHOD_BUFFERED ) #define IOCTL_AFD_SIZE_DISCONNECT_DATA _AFD_CONTROL_CODE( AFD_SIZE_DISCONNECT_DATA, METHOD_BUFFERED ) #define IOCTL_AFD_SIZE_DISCONNECT_OPTIONS _AFD_CONTROL_CODE( AFD_SIZE_DISCONNECT_OPTIONS, METHOD_BUFFERED ) #define IOCTL_AFD_GET_INFORMATION _AFD_CONTROL_CODE( AFD_GET_INFORMATION, METHOD_BUFFERED ) #define IOCTL_AFD_TRANSMIT_FILE _AFD_CONTROL_CODE( AFD_TRANSMIT_FILE, METHOD_NEITHER ) #define IOCTL_AFD_SUPER_ACCEPT _AFD_CONTROL_CODE( AFD_SUPER_ACCEPT, METHOD_OUT_DIRECT ) #define IOCTL_AFD_EVENT_SELECT _AFD_CONTROL_CODE( AFD_EVENT_SELECT, METHOD_BUFFERED ) #define IOCTL_AFD_ENUM_NETWORK_EVENTS _AFD_CONTROL_CODE( AFD_ENUM_NETWORK_EVENTS, METHOD_BUFFERED ) #define IOCTL_AFD_DEFER_ACCEPT _AFD_CONTROL_CODE( AFD_DEFER_ACCEPT, METHOD_BUFFERED ) #define IOCTL_AFD_WAIT_FOR_LISTEN_LIFO _AFD_CONTROL_CODE( AFD_WAIT_FOR_LISTEN_LIFO, METHOD_BUFFERED ) #define IOCTL_AFD_SET_QOS _AFD_CONTROL_CODE( AFD_SET_QOS, METHOD_BUFFERED ) #define IOCTL_AFD_GET_QOS _AFD_CONTROL_CODE( AFD_GET_QOS, METHOD_BUFFERED ) #define IOCTL_AFD_NO_OPERATION _AFD_CONTROL_CODE( AFD_NO_OPERATION, METHOD_NEITHER ) #define IOCTL_AFD_VALIDATE_GROUP _AFD_CONTROL_CODE( AFD_VALIDATE_GROUP, METHOD_BUFFERED ) #define IOCTL_AFD_GET_UNACCEPTED_CONNECT_DATA _AFD_CONTROL_CODE( AFD_GET_UNACCEPTED_CONNECT_DATA, METHOD_BUFFERED ) #ifdef NT351 #define IOCTL_AFD_QUEUE_APC _AFD_CONTROL_CODE( AFD_QUEUE_APC, METHOD_BUFFERED ) #endif // NT351 #endif // ndef _AFD_