Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenafd.h
Go to the documentation of this file.
00001 /* $Id: afd.h 53016 2011-08-01 03:54:19Z cgutman $ 00002 * 00003 * COPYRIGHT: See COPYING in the top level directory 00004 * PROJECT: ReactOS kernel 00005 * FILE: drivers/net/afd/include/afd.h 00006 * PURPOSE: Ancillary functions driver -- constants and structures 00007 * PROGRAMMER: Art Yerkes (ayerkes@speakeasy.net) 00008 * UPDATE HISTORY: 00009 * 20040630 Created 00010 */ 00011 00012 #ifndef _AFD_H 00013 #define _AFD_H 00014 00015 #include <ntddk.h> 00016 #include <ntifs.h> 00017 #include <ndk/obtypes.h> 00018 #include <ndk/obfuncs.h> 00019 #include <ndk/mmtypes.h> 00020 #include <ndk/mmfuncs.h> 00021 #include <tdi.h> 00022 #include <tdikrnl.h> 00023 #include <tdiinfo.h> 00024 #include <string.h> 00025 #define _WINBASE_ 00026 #define _WINDOWS_H 00027 #define _INC_WINDOWS 00028 #include <windef.h> 00029 #include <winsock2.h> 00030 #include <afd/shared.h> 00031 #include <pseh/pseh2.h> 00032 00033 #include "tdi_proto.h" 00034 #include "tdiconn.h" 00035 #include "debug.h" 00036 00037 #ifndef MIN 00038 #define MIN(x,y) (((x)<(y))?(x):(y)) 00039 #endif 00040 00041 #define IOCTL_TCP_QUERY_INFORMATION_EX \ 00042 CTL_CODE(FILE_DEVICE_NETWORK, 0, METHOD_NEITHER, FILE_ANY_ACCESS) 00043 00044 #define TL_INSTANCE 0 00045 #define IP_MIB_STATS_ID 1 00046 #define IP_MIB_ADDRTABLE_ENTRY_ID 0x102 00047 00048 typedef struct IPSNMP_INFO { 00049 ULONG Forwarding; 00050 ULONG DefaultTTL; 00051 ULONG InReceives; 00052 ULONG InHdrErrors; 00053 ULONG InAddrErrors; 00054 ULONG ForwDatagrams; 00055 ULONG InUnknownProtos; 00056 ULONG InDiscards; 00057 ULONG InDelivers; 00058 ULONG OutRequests; 00059 ULONG RoutingDiscards; 00060 ULONG OutDiscards; 00061 ULONG OutNoRoutes; 00062 ULONG ReasmTimeout; 00063 ULONG ReasmReqds; 00064 ULONG ReasmOks; 00065 ULONG ReasmFails; 00066 ULONG FragOks; 00067 ULONG FragFails; 00068 ULONG FragCreates; 00069 ULONG NumIf; 00070 ULONG NumAddr; 00071 ULONG NumRoutes; 00072 } IPSNMP_INFO, *PIPSNMP_INFO; 00073 00074 typedef struct IPADDR_ENTRY { 00075 ULONG Addr; 00076 ULONG Index; 00077 ULONG Mask; 00078 ULONG BcastAddr; 00079 ULONG ReasmSize; 00080 USHORT Context; 00081 USHORT Pad; 00082 } IPADDR_ENTRY, *PIPADDR_ENTRY; 00083 00084 #define DN2H(dw) \ 00085 ((((dw) & 0xFF000000L) >> 24) | \ 00086 (((dw) & 0x00FF0000L) >> 8) | \ 00087 (((dw) & 0x0000FF00L) << 8) | \ 00088 (((dw) & 0x000000FFL) << 24)) 00089 00090 #define SOCKET_STATE_INVALID_TRANSITION ((DWORD)-1) 00091 #define SOCKET_STATE_CREATED 0 00092 #define SOCKET_STATE_BOUND 1 00093 #define SOCKET_STATE_CONNECTING 2 00094 #define SOCKET_STATE_CONNECTED 3 00095 #define SOCKET_STATE_LISTENING 4 00096 #define SOCKET_STATE_MASK 0x0000ffff 00097 #define SOCKET_STATE_EOF_READ 0x20000000 00098 #define SOCKET_STATE_LOCKED 0x40000000 00099 #define SOCKET_STATE_NEW 0x80000000 00100 #define SOCKET_STATE_CLOSED 0x00000100 00101 00102 #define FUNCTION_CONNECT 0 00103 #define FUNCTION_RECV 1 00104 #define FUNCTION_SEND 2 00105 #define FUNCTION_PREACCEPT 3 00106 #define FUNCTION_ACCEPT 4 00107 #define FUNCTION_DISCONNECT 5 00108 #define FUNCTION_CLOSE 6 00109 #define MAX_FUNCTIONS 7 00110 00111 #define IN_FLIGHT_REQUESTS 5 00112 00113 #define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed 00114 * for ancillary data on packet 00115 * requests. */ 00116 00117 /* XXX This is a hack we should clean up later 00118 * We do this in order to get some storage for the locked handle table 00119 * Maybe I'll use some tail item in the irp instead */ 00120 #define AFD_HANDLES(x) ((PAFD_HANDLE)(x)->Exclusive) 00121 #define SET_AFD_HANDLES(x,y) (((x)->Exclusive) = (ULONG_PTR)(y)) 00122 00123 typedef struct _AFD_MAPBUF { 00124 PVOID BufferAddress; 00125 PMDL Mdl; 00126 } AFD_MAPBUF, *PAFD_MAPBUF; 00127 00128 typedef struct _AFD_DEVICE_EXTENSION { 00129 PDEVICE_OBJECT DeviceObject; 00130 LIST_ENTRY Polls; 00131 KSPIN_LOCK Lock; 00132 } AFD_DEVICE_EXTENSION, *PAFD_DEVICE_EXTENSION; 00133 00134 typedef struct _AFD_ACTIVE_POLL { 00135 LIST_ENTRY ListEntry; 00136 PIRP Irp; 00137 PAFD_DEVICE_EXTENSION DeviceExt; 00138 KDPC TimeoutDpc; 00139 KTIMER Timer; 00140 PKEVENT EventObject; 00141 BOOLEAN Exclusive; 00142 } AFD_ACTIVE_POLL, *PAFD_ACTIVE_POLL; 00143 00144 typedef struct _IRP_LIST { 00145 LIST_ENTRY ListEntry; 00146 PIRP Irp; 00147 } IRP_LIST, *PIRP_LIST; 00148 00149 typedef struct _AFD_TDI_OBJECT { 00150 PFILE_OBJECT Object; 00151 HANDLE Handle; 00152 } AFD_TDI_OBJECT, *PAFD_TDI_OBJECT; 00153 00154 typedef struct _AFD_TDI_OBJECT_QELT { 00155 LIST_ENTRY ListEntry; 00156 UINT Seq; 00157 PTDI_CONNECTION_INFORMATION ConnInfo; 00158 AFD_TDI_OBJECT Object; 00159 } AFD_TDI_OBJECT_QELT, *PAFD_TDI_OBJECT_QELT; 00160 00161 typedef struct _AFD_IN_FLIGHT_REQUEST { 00162 PIRP InFlightRequest; 00163 IO_STATUS_BLOCK Iosb; 00164 PTDI_CONNECTION_INFORMATION ConnectionCallInfo; 00165 PTDI_CONNECTION_INFORMATION ConnectionReturnInfo; 00166 } AFD_IN_FLIGHT_REQUEST, *PAFD_IN_FLIGHT_REQUEST; 00167 00168 typedef struct _AFD_DATA_WINDOW { 00169 PCHAR Window; 00170 UINT BytesUsed, Size, Content; 00171 } AFD_DATA_WINDOW, *PAFD_DATA_WINDOW; 00172 00173 typedef struct _AFD_STORED_DATAGRAM { 00174 LIST_ENTRY ListEntry; 00175 UINT Len; 00176 PTRANSPORT_ADDRESS Address; 00177 CHAR Buffer[1]; 00178 } AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM; 00179 00180 typedef struct _AFD_FCB { 00181 BOOLEAN Locked, Critical, Overread, NonBlocking, OobInline, TdiReceiveClosed, SendClosed; 00182 UINT State, Flags, GroupID, GroupType; 00183 KIRQL OldIrql; 00184 UINT LockCount; 00185 PVOID CurrentThread; 00186 PFILE_OBJECT FileObject; 00187 PAFD_DEVICE_EXTENSION DeviceExt; 00188 BOOLEAN DelayedAccept; 00189 UINT ConnSeq; 00190 USHORT DisconnectFlags; 00191 BOOLEAN DisconnectPending; 00192 LARGE_INTEGER DisconnectTimeout; 00193 PTRANSPORT_ADDRESS LocalAddress, RemoteAddress; 00194 PTDI_CONNECTION_INFORMATION AddressFrom, ConnectCallInfo, ConnectReturnInfo; 00195 AFD_TDI_OBJECT AddressFile, Connection; 00196 AFD_IN_FLIGHT_REQUEST ConnectIrp, ListenIrp, ReceiveIrp, SendIrp, DisconnectIrp; 00197 AFD_DATA_WINDOW Send, Recv; 00198 KMUTEX Mutex; 00199 PKEVENT EventSelect; 00200 DWORD EventSelectTriggers; 00201 DWORD EventSelectDisabled; 00202 UNICODE_STRING TdiDeviceName; 00203 PVOID Context; 00204 DWORD PollState; 00205 NTSTATUS PollStatus[FD_MAX_EVENTS]; 00206 UINT ContextSize; 00207 PVOID ConnectData; 00208 UINT FilledConnectData; 00209 UINT ConnectDataSize; 00210 PVOID DisconnectData; 00211 UINT FilledDisconnectData; 00212 UINT DisconnectDataSize; 00213 PVOID ConnectOptions; 00214 UINT FilledConnectOptions; 00215 UINT ConnectOptionsSize; 00216 PVOID DisconnectOptions; 00217 UINT FilledDisconnectOptions; 00218 UINT DisconnectOptionsSize; 00219 LIST_ENTRY PendingIrpList[MAX_FUNCTIONS]; 00220 LIST_ENTRY DatagramList; 00221 LIST_ENTRY PendingConnections; 00222 } AFD_FCB, *PAFD_FCB; 00223 00224 /* bind.c */ 00225 00226 NTSTATUS WarmSocketForBind( PAFD_FCB FCB ); 00227 NTSTATUS NTAPI 00228 AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, 00229 PIO_STACK_LOCATION IrpSp); 00230 00231 /* connect.c */ 00232 00233 NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB ); 00234 NTSTATUS WarmSocketForConnection( PAFD_FCB FCB ); 00235 NTSTATUS NTAPI 00236 AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp, 00237 PIO_STACK_LOCATION IrpSp); 00238 NTSTATUS NTAPI 00239 AfdGetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp, 00240 PIO_STACK_LOCATION IrpSp); 00241 NTSTATUS NTAPI 00242 AfdSetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp, 00243 PIO_STACK_LOCATION IrpSp); 00244 NTSTATUS NTAPI 00245 AfdSetConnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp, 00246 PIO_STACK_LOCATION IrpSp); 00247 NTSTATUS NTAPI 00248 AfdGetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp, 00249 PIO_STACK_LOCATION IrpSp); 00250 NTSTATUS NTAPI 00251 AfdSetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp, 00252 PIO_STACK_LOCATION IrpSp); 00253 NTSTATUS NTAPI 00254 AfdSetConnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp, 00255 PIO_STACK_LOCATION IrpSp); 00256 00257 /* context.c */ 00258 00259 NTSTATUS NTAPI 00260 AfdGetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp, 00261 PIO_STACK_LOCATION IrpSp ); 00262 NTSTATUS NTAPI 00263 AfdGetContextSize( PDEVICE_OBJECT DeviceObject, PIRP Irp, 00264 PIO_STACK_LOCATION IrpSp ); 00265 NTSTATUS NTAPI 00266 AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp, 00267 PIO_STACK_LOCATION IrpSp ); 00268 00269 /* info.c */ 00270 00271 NTSTATUS NTAPI 00272 AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, 00273 PIO_STACK_LOCATION IrpSp ); 00274 00275 NTSTATUS NTAPI 00276 AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, 00277 PIO_STACK_LOCATION IrpSp ); 00278 00279 NTSTATUS NTAPI 00280 AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp, 00281 PIO_STACK_LOCATION IrpSp ); 00282 00283 NTSTATUS NTAPI 00284 AfdGetPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp, 00285 PIO_STACK_LOCATION IrpSp ); 00286 00287 /* listen.c */ 00288 NTSTATUS AfdWaitForListen( PDEVICE_OBJECT DeviceObject, PIRP Irp, 00289 PIO_STACK_LOCATION IrpSp ); 00290 00291 NTSTATUS AfdListenSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, 00292 PIO_STACK_LOCATION IrpSp); 00293 00294 NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp, 00295 PIO_STACK_LOCATION IrpSp ); 00296 00297 /* lock.c */ 00298 00299 PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count, 00300 PVOID AddressBuf, PINT AddressLen, 00301 BOOLEAN Write, BOOLEAN LockAddress ); 00302 VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address ); 00303 BOOLEAN SocketAcquireStateLock( PAFD_FCB FCB ); 00304 NTSTATUS NTAPI UnlockAndMaybeComplete 00305 ( PAFD_FCB FCB, NTSTATUS Status, PIRP Irp, 00306 UINT Information ); 00307 VOID SocketStateUnlock( PAFD_FCB FCB ); 00308 NTSTATUS LostSocket( PIRP Irp ); 00309 PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount ); 00310 VOID UnlockHandles( PAFD_HANDLE HandleArray, UINT HandleCount ); 00311 PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ); 00312 VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ); 00313 PVOID GetLockedData( PIRP Irp, PIO_STACK_LOCATION IrpSp ); 00314 NTSTATUS LeaveIrpUntilLater( PAFD_FCB FCB, PIRP Irp, UINT Function ); 00315 NTSTATUS QueueUserModeIrp(PAFD_FCB FCB, PIRP Irp, UINT Function); 00316 00317 /* main.c */ 00318 00319 VOID OskitDumpBuffer( PCHAR Buffer, UINT Len ); 00320 VOID DestroySocket( PAFD_FCB FCB ); 00321 VOID NTAPI AfdCancelHandler(PDEVICE_OBJECT DeviceObject, 00322 PIRP Irp); 00323 VOID RetryDisconnectCompletion(PAFD_FCB FCB); 00324 BOOLEAN CheckUnlockExtraBuffers(PAFD_FCB FCB, PIO_STACK_LOCATION IrpSp); 00325 00326 /* read.c */ 00327 00328 NTSTATUS NTAPI ReceiveComplete 00329 ( PDEVICE_OBJECT DeviceObject, 00330 PIRP Irp, 00331 PVOID Context ); 00332 00333 NTSTATUS NTAPI PacketSocketRecvComplete 00334 ( PDEVICE_OBJECT DeviceObject, 00335 PIRP Irp, 00336 PVOID Context ); 00337 00338 NTSTATUS NTAPI 00339 AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, 00340 PIO_STACK_LOCATION IrpSp, BOOLEAN Short); 00341 NTSTATUS NTAPI 00342 AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, 00343 PIO_STACK_LOCATION IrpSp ); 00344 00345 /* select.c */ 00346 00347 NTSTATUS NTAPI 00348 AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp, 00349 PIO_STACK_LOCATION IrpSp ); 00350 NTSTATUS NTAPI 00351 AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp, 00352 PIO_STACK_LOCATION IrpSp ); 00353 NTSTATUS NTAPI 00354 AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp, 00355 PIO_STACK_LOCATION IrpSp ); 00356 VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceObject, PFILE_OBJECT FileObject ); 00357 VOID KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt, 00358 PFILE_OBJECT FileObject, BOOLEAN ExclusiveOnly ); 00359 VOID ZeroEvents( PAFD_HANDLE HandleArray, 00360 UINT HandleCount ); 00361 VOID SignalSocket( 00362 PAFD_ACTIVE_POLL Poll OPTIONAL, PIRP _Irp OPTIONAL, 00363 PAFD_POLL_INFO PollReq, NTSTATUS Status); 00364 00365 /* tdi.c */ 00366 00367 NTSTATUS TdiOpenAddressFile( 00368 PUNICODE_STRING DeviceName, 00369 PTRANSPORT_ADDRESS Name, 00370 PHANDLE AddressHandle, 00371 PFILE_OBJECT *AddressObject); 00372 00373 NTSTATUS TdiAssociateAddressFile( 00374 HANDLE AddressHandle, 00375 PFILE_OBJECT ConnectionObject); 00376 00377 NTSTATUS TdiDisassociateAddressFile( 00378 PFILE_OBJECT ConnectionObject); 00379 00380 NTSTATUS TdiListen 00381 ( PIRP *Irp, 00382 PFILE_OBJECT ConnectionObject, 00383 PTDI_CONNECTION_INFORMATION *RequestConnectionInfo, 00384 PTDI_CONNECTION_INFORMATION *ReturnConnectionInfo, 00385 PIO_STATUS_BLOCK Iosb, 00386 PIO_COMPLETION_ROUTINE CompletionRoutine, 00387 PVOID CompletionContext); 00388 00389 NTSTATUS TdiReceive 00390 ( PIRP *Irp, 00391 PFILE_OBJECT ConnectionObject, 00392 USHORT Flags, 00393 PCHAR Buffer, 00394 UINT BufferLength, 00395 PIO_STATUS_BLOCK Iosb, 00396 PIO_COMPLETION_ROUTINE CompletionRoutine, 00397 PVOID CompletionContext); 00398 00399 NTSTATUS TdiSend 00400 ( PIRP *Irp, 00401 PFILE_OBJECT ConnectionObject, 00402 USHORT Flags, 00403 PCHAR Buffer, 00404 UINT BufferLength, 00405 PIO_STATUS_BLOCK Iosb, 00406 PIO_COMPLETION_ROUTINE CompletionRoutine, 00407 PVOID CompletionContext); 00408 00409 NTSTATUS TdiReceiveDatagram( 00410 PIRP *Irp, 00411 PFILE_OBJECT TransportObject, 00412 USHORT Flags, 00413 PCHAR Buffer, 00414 UINT BufferLength, 00415 PTDI_CONNECTION_INFORMATION From, 00416 PIO_STATUS_BLOCK Iosb, 00417 PIO_COMPLETION_ROUTINE CompletionRoutine, 00418 PVOID CompletionContext); 00419 00420 NTSTATUS TdiSendDatagram( 00421 PIRP *Irp, 00422 PFILE_OBJECT TransportObject, 00423 PCHAR Buffer, 00424 UINT BufferLength, 00425 PTDI_CONNECTION_INFORMATION To, 00426 PIO_STATUS_BLOCK Iosb, 00427 PIO_COMPLETION_ROUTINE CompletionRoutine, 00428 PVOID CompletionContext); 00429 00430 NTSTATUS TdiQueryMaxDatagramLength( 00431 PFILE_OBJECT FileObject, 00432 PUINT MaxDatagramLength); 00433 00434 /* write.c */ 00435 00436 NTSTATUS NTAPI 00437 AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, 00438 PIO_STACK_LOCATION IrpSp, BOOLEAN Short); 00439 NTSTATUS NTAPI 00440 AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, 00441 PIO_STACK_LOCATION IrpSp); 00442 00443 #endif/*_AFD_H*/ Generated on Sat May 26 2012 04:26:36 for ReactOS by
1.7.6.1
|