Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: drivers/net/afd/include/afd.h * PURPOSE: Ancillary functions driver -- constants and structures * PROGRAMMER: Art Yerkes (ayerkes@speakeasy.net) * UPDATE HISTORY: * 20040630 Created */
#ifndef _AFD_H#define _AFD_H
#include <ntifs.h>#include <ndk/obtypes.h>#include <tdi.h>#include <tcpioctl.h>#define _WINBASE_#define _WINDOWS_H#define _INC_WINDOWS#include <windef.h>#include <winsock2.h>#include <afd/shared.h>#include <pseh/pseh2.h>
#include "tdi_proto.h"#include "tdiconn.h"#include "debug.h"
#ifndef MIN#define MIN(x,y) (((x)<(y))?(x):(y))#endif
#define TL_INSTANCE 0#define IP_MIB_STATS_ID 1#define IP_MIB_ADDRTABLE_ENTRY_ID 0x102
#define TAG_AFD_DATA_BUFFER 'BdfA'#define TAG_AFD_TRANSPORT_ADDRESS 'tdfA'#define TAG_AFD_SOCKET_CONTEXT 'XdfA'#define TAG_AFD_CONNECT_DATA 'cdfA'#define TAG_AFD_DISCONNECT_DATA 'ddfA'
#define TAG_AFD_CONNECT_OPTIONS 'ocfA'#define TAG_AFD_DISCONNECT_OPTIONS 'odfA'#define TAG_AFD_SUPER_CONNECT_BUFFER 'sdfA'#define TAG_AFD_ACCEPT_QUEUE 'qafA'#define TAG_AFD_POLL_HANDLE 'hpfA'#define TAG_AFD_FCB 'cffA'#define TAG_AFD_ACTIVE_POLL 'pafA'#define TAG_AFD_EA_INFO 'aefA'#define TAG_AFD_STORED_DATAGRAM 'gsfA'#define TAG_AFD_SNMP_ADDRESS_INFO 'asfA'#define TAG_AFD_TDI_CONNECTION_INFORMATION 'cTfA'#define TAG_AFD_WSA_BUFFER 'bWfA'
typedef struct IPADDR_ENTRY { ULONG Addr; ULONG Index; ULONG Mask; ULONG BcastAddr; ULONG ReasmSize; USHORT Context; USHORT Pad;} IPADDR_ENTRY, *PIPADDR_ENTRY;
#define DN2H(dw) \ ((((dw) & 0xFF000000L) >> 24) | \ (((dw) & 0x00FF0000L) >> 8) | \ (((dw) & 0x0000FF00L) << 8) | \ (((dw) & 0x000000FFL) << 24))
#define SOCKET_STATE_INVALID_TRANSITION ((DWORD)-1)#define SOCKET_STATE_CREATED 0#define SOCKET_STATE_BOUND 1#define SOCKET_STATE_CONNECTING 2#define SOCKET_STATE_CONNECTED 3#define SOCKET_STATE_LISTENING 4#define SOCKET_STATE_MASK 0x0000ffff#define SOCKET_STATE_EOF_READ 0x20000000#define SOCKET_STATE_LOCKED 0x40000000#define SOCKET_STATE_NEW 0x80000000#define SOCKET_STATE_CLOSED 0x00000100
#define FUNCTION_CONNECT 0#define FUNCTION_RECV 1#define FUNCTION_SEND 2#define FUNCTION_PREACCEPT 3#define FUNCTION_ACCEPT 4#define FUNCTION_DISCONNECT 5#define FUNCTION_CLOSE 6#define FUNCTION_CONNECTEX 7#define MAX_FUNCTIONS 8
#define IN_FLIGHT_REQUESTS 5
#define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed * for ancillary data on packet * requests. */
/* XXX This is a hack we should clean up later * We do this in order to get some storage for the locked handle table * Maybe I'll use some tail item in the irp instead */#define AFD_HANDLES(x) ((PAFD_HANDLE)(x)->Exclusive)#define SET_AFD_HANDLES(x,y) (((x)->Exclusive) = (ULONG_PTR)(y))
typedef struct _AFD_MAPBUF { PVOID BufferAddress; PMDL Mdl;} AFD_MAPBUF, *PAFD_MAPBUF;
typedef struct _AFD_DEVICE_EXTENSION { PDEVICE_OBJECT DeviceObject; LIST_ENTRY Polls; KSPIN_LOCK Lock;} AFD_DEVICE_EXTENSION, *PAFD_DEVICE_EXTENSION;
typedef struct _AFD_ACTIVE_POLL { LIST_ENTRY ListEntry; PIRP Irp; PAFD_DEVICE_EXTENSION DeviceExt; KDPC TimeoutDpc; KTIMER Timer; PKEVENT EventObject; BOOLEAN Exclusive;} AFD_ACTIVE_POLL, *PAFD_ACTIVE_POLL;
typedef struct _IRP_LIST { LIST_ENTRY ListEntry; PIRP Irp;} IRP_LIST, *PIRP_LIST;
typedef struct _AFD_TDI_OBJECT { PFILE_OBJECT Object; HANDLE Handle;} AFD_TDI_OBJECT, *PAFD_TDI_OBJECT;
typedef struct _AFD_TDI_OBJECT_QELT { LIST_ENTRY ListEntry; UINT Seq; PTDI_CONNECTION_INFORMATION ConnInfo; AFD_TDI_OBJECT Object;} AFD_TDI_OBJECT_QELT, *PAFD_TDI_OBJECT_QELT;
typedef struct _AFD_IN_FLIGHT_REQUEST { PIRP InFlightRequest; PTDI_CONNECTION_INFORMATION ConnectionCallInfo; PTDI_CONNECTION_INFORMATION ConnectionReturnInfo;} AFD_IN_FLIGHT_REQUEST, *PAFD_IN_FLIGHT_REQUEST;
typedef struct _AFD_DATA_WINDOW { PCHAR Window; UINT BytesUsed, Size, Content;} AFD_DATA_WINDOW, *PAFD_DATA_WINDOW;
typedef struct _AFD_STORED_DATAGRAM { LIST_ENTRY ListEntry; UINT Len; PTRANSPORT_ADDRESS Address; CHAR Buffer[1];} AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
typedef struct _AFD_FCB { SOCK_SHARED_INFO SharedData; BOOLEAN Locked, Critical, NonBlocking, OobInline, TdiReceiveClosed, SendClosed; UINT Flags, GroupID, GroupType; KIRQL OldIrql; PVOID CurrentThread; PFILE_OBJECT FileObject; PAFD_DEVICE_EXTENSION DeviceExt; BOOLEAN DelayedAccept; UINT ConnSeq; USHORT DisconnectFlags; BOOLEAN DisconnectPending; LARGE_INTEGER DisconnectTimeout; PTRANSPORT_ADDRESS LocalAddress, RemoteAddress; PTDI_CONNECTION_INFORMATION AddressFrom, ConnectCallInfo, ConnectReturnInfo; AFD_TDI_OBJECT AddressFile, Connection; AFD_IN_FLIGHT_REQUEST ConnectIrp, ListenIrp, ReceiveIrp, SendIrp, DisconnectIrp; AFD_DATA_WINDOW Send, Recv; KMUTEX Mutex; PKEVENT EventSelect; DWORD EventSelectTriggers; DWORD EventSelectDisabled; UNICODE_STRING TdiDeviceName; PVOID Context; DWORD PollState; NTSTATUS PollStatus[FD_MAX_EVENTS]; NTSTATUS LastReceiveStatus; UINT ContextSize; PVOID ConnectData; UINT FilledConnectData; UINT ConnectDataSize; PVOID DisconnectData; UINT FilledDisconnectData; UINT DisconnectDataSize; PVOID ConnectOptions; UINT FilledConnectOptions; UINT ConnectOptionsSize; PVOID DisconnectOptions; UINT FilledDisconnectOptions; UINT DisconnectOptionsSize; PVOID OnConnectSendBuffer; UINT OnConnectSendBufferSize; LIST_ENTRY PendingIrpList[MAX_FUNCTIONS]; LIST_ENTRY DatagramList; LIST_ENTRY PendingConnections;} AFD_FCB, *PAFD_FCB;
/* bind.c */
NTSTATUS WarmSocketForBind( PAFD_FCB FCB, ULONG ShareType );NTSTATUS NTAPIAfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
/* connect.c */
NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB );NTSTATUS WarmSocketForConnection( PAFD_FCB FCB );NTSTATUS NTAPIAfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);NTSTATUS NTAPIAfdStreamSocketSuperConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);NTSTATUS NTAPIAfdGetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);NTSTATUS NTAPIAfdSetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);NTSTATUS NTAPIAfdSetConnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);NTSTATUS NTAPIAfdGetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);NTSTATUS NTAPIAfdSetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);NTSTATUS NTAPIAfdSetConnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
/* context.c */
NTSTATUS NTAPIAfdGetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );NTSTATUS NTAPIAfdGetContextSize( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );NTSTATUS NTAPIAfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );
/* info.c */
NTSTATUS NTAPIAfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );
NTSTATUS NTAPIAfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );
NTSTATUS NTAPIAfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );
NTSTATUS NTAPIAfdGetPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );
/* listen.c */NTSTATUS AfdWaitForListen( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );
/* lock.c */
PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count, PVOID AddressBuf, PINT AddressLen, BOOLEAN Write, BOOLEAN LockAddress, KPROCESSOR_MODE LockMode );VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address );BOOLEAN SocketAcquireStateLock( PAFD_FCB FCB );NTSTATUS NTAPI UnlockAndMaybeComplete( PAFD_FCB FCB, NTSTATUS Status, PIRP Irp, UINT Information );VOID SocketStateUnlock( PAFD_FCB FCB );NTSTATUS LostSocket( PIRP Irp );PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );VOID UnlockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output, KPROCESSOR_MODE *LockMode );VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );PVOID GetLockedData( PIRP Irp, PIO_STACK_LOCATION IrpSp );NTSTATUS LeaveIrpUntilLater( PAFD_FCB FCB, PIRP Irp, UINT Function );NTSTATUS QueueUserModeIrp(PAFD_FCB FCB, PIRP Irp, UINT Function);
/* main.c */
VOID OskitDumpBuffer( PCHAR Buffer, UINT Len );VOID DestroySocket( PAFD_FCB FCB );DRIVER_CANCEL AfdCancelHandler;VOID RetryDisconnectCompletion(PAFD_FCB FCB);BOOLEAN CheckUnlockExtraBuffers(PAFD_FCB FCB, PIO_STACK_LOCATION IrpSp);
/* read.c */
IO_COMPLETION_ROUTINE ReceiveComplete;
IO_COMPLETION_ROUTINE PacketSocketRecvComplete;
NTSTATUS NTAPIAfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Short);NTSTATUS NTAPIAfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );
/* select.c */
NTSTATUS NTAPIAfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );NTSTATUS NTAPIAfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );NTSTATUS NTAPIAfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceObject, PFILE_OBJECT FileObject );VOID KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, BOOLEAN ExclusiveOnly );VOID ZeroEvents( PAFD_HANDLE HandleArray, UINT HandleCount );VOID SignalSocket( PAFD_ACTIVE_POLL Poll OPTIONAL, PIRP _Irp OPTIONAL, PAFD_POLL_INFO PollReq, NTSTATUS Status);
/* write.c */
NTSTATUS NTAPIAfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Short);NTSTATUS NTAPIAfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
#endif /* _AFD_H */