/*++ Copyright (c) 1989 Microsoft Corporation Module Name: afdprocs.h Abstract: This module contains routine prototypes for AFD. Author: David Treadwell (davidtr) 21-Feb-1992 Revision History: --*/ #ifndef _AFDPROCS_ #define _AFDPROCS_ NTSTATUS DriverEntry ( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); NTSTATUS FASTCALL AfdAccept ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS FASTCALL AfdSuperAccept ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS FASTCALL AfdDeferAccept ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS AfdRestartSuperAccept ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); VOID AfdCancelSuperAccept ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID AfdCleanupSuperAccept ( IN PIRP Irp, IN NTSTATUS Status ); BOOLEAN AfdServiceSuperAccept ( IN PAFD_ENDPOINT Endpoint, IN PAFD_CONNECTION Connection, IN PAFD_LOCK_QUEUE_HANDLE LockHandle, OUT PLIST_ENTRY AcceptIrpList ); NTSTATUS AfdAcceptCore ( IN PIRP AcceptIrp, IN PAFD_ENDPOINT AcceptEndpoint, IN PAFD_CONNECTION Connection ); NTSTATUS AfdSetupAcceptEndpoint ( PAFD_ENDPOINT ListenEndpoint, PAFD_ENDPOINT AcceptEndpoint, PAFD_CONNECTION Connection ); VOID AfdRestartSuperAcceptListen ( IN PIRP Irp, IN PAFD_CONNECTION Connection ); NTSTATUS AfdRestartDelayedSuperAccept ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); PMDL AfdAdvanceMdlChain( IN PMDL Mdl, IN ULONG Offset ); #ifdef _WIN64 NTSTATUS AfdAllocateMdlChain32( IN PIRP Irp, IN LPWSABUF32 BufferArray, IN ULONG BufferCount, IN LOCK_OPERATION Operation, OUT PULONG TotalByteCount ); #endif NTSTATUS AfdAllocateMdlChain( IN PIRP Irp, IN LPWSABUF BufferArray, IN ULONG BufferCount, IN LOCK_OPERATION Operation, OUT PULONG TotalByteCount ); BOOLEAN AfdAreTransportAddressesEqual ( IN PTRANSPORT_ADDRESS EndpointAddress, IN ULONG EndpointAddressLength, IN PTRANSPORT_ADDRESS RequestAddress, IN ULONG RequestAddressLength, IN BOOLEAN HonorWildcardIpPortInEndpointAddress ); NTSTATUS AfdBeginAbort ( IN PAFD_CONNECTION Connection ); NTSTATUS AfdBeginDisconnect ( IN PAFD_ENDPOINT Endpoint, IN PLARGE_INTEGER Timeout OPTIONAL, OUT PIRP *DisconnectIrp OPTIONAL ); NTSTATUS FASTCALL AfdBind ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); ULONG AfdCalcBufferArrayByteLength( IN LPWSABUF BufferArray, IN ULONG BufferCount ); VOID AfdCancelReceiveDatagram ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FASTCALL AfdCleanup ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS FASTCALL AfdClose ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); VOID AfdCompleteIrpList ( IN PLIST_ENTRY IrpListHead, IN PAFD_ENDPOINT Endpoint, IN NTSTATUS Status, IN PAFD_IRP_CLEANUP_ROUTINE CleanupRoutine OPTIONAL ); VOID AfdCompleteClosePendedTransmit ( IN PVOID Context ); NTSTATUS FASTCALL AfdConnect ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS FASTCALL AfdJoinLeaf ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS FASTCALL AfdSuperConnect ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS AfdConnectEventHandler ( IN PVOID TdiEventContext, IN int RemoteAddressLength, IN PVOID RemoteAddress, IN int UserDataLength, IN PVOID UserData, IN int OptionsLength, IN PVOID Options, OUT CONNECTION_CONTEXT *ConnectionContext, OUT PIRP *AcceptIrp ); #ifdef _WIN64 ULONG AfdComputeCMSGLength32 ( PVOID ControlBuffer, ULONG ControlLength ); VOID AfdCopyCMSGBuffer32 ( PVOID Dst, PVOID ControlBuffer, ULONG CopyLength ); #endif //_WIN64 ULONG AfdCopyBufferArrayToBuffer( IN PVOID Destination, IN ULONG DestinationLength, IN LPWSABUF BufferArray, IN ULONG BufferCount ); ULONG AfdCopyBufferToBufferArray( IN LPWSABUF BufferArray, IN ULONG Offset, IN ULONG BufferCount, IN PVOID Source, IN ULONG SourceLength ); ULONG AfdCopyMdlChainToBufferArray( IN LPWSABUF BufferArray, IN ULONG BufferOffset, IN ULONG BufferCount, IN PMDL Source, IN ULONG SourceOffset, IN ULONG SourceLength ); NTSTATUS AfdCopyMdlChainToMdlChain ( PMDL Destination, ULONG DestinationOffset, PMDL Source, ULONG SourceOffset, ULONG SourceLength, PULONG BytesCopied ); NTSTATUS AfdCopyMdlChainToBufferAvoidMapping( IN PMDL SourceMdl, IN ULONG SourceOffset, IN ULONG SourceLength, IN PUCHAR Buffer, IN ULONG BufferSize ); NTSTATUS AfdMapMdlChain ( PMDL MdlChain ); NTSTATUS FASTCALL AfdCreate ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS AfdDelayedAcceptListen ( PAFD_ENDPOINT Endpoint, PAFD_CONNECTION Connection ); VOID AfdDestroyMdlChain ( IN PIRP Irp ); NTSTATUS AfdDisconnectEventHandler ( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN int DisconnectDataLength, IN PVOID DisconnectData, IN int DisconnectInformationLength, IN PVOID DisconnectInformation, IN ULONG DisconnectFlags ); NTSTATUS AfdDispatch ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS AfdDispatchDeviceControl ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS FASTCALL AfdDispatchImmediateIrp( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS AfdEnumNetworkEvents ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdErrorEventHandler ( IN PVOID TdiEventContext, IN NTSTATUS Status ); NTSTATUS AfdErrorExEventHandler ( IN PVOID TdiEventContext, IN NTSTATUS Status, IN PVOID Context ); NTSTATUS AfdEventSelect ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); LONG AfdExceptionFilter( #if DBG PCHAR SourceFile, LONG LineNumber, #endif PEXCEPTION_POINTERS ExceptionPointers, PNTSTATUS ExceptionCode ); BOOLEAN AfdFastTransmitFile ( IN PAFD_ENDPOINT endpoint, IN PAFD_TRANSMIT_FILE_INFO transmitInfo, OUT PIO_STATUS_BLOCK IoStatus ); VOID AfdFreeConnectDataBuffers ( IN PAFD_CONNECT_DATA_BUFFERS ConnectDataBuffers ); VOID AfdFreeQueuedConnections ( IN PAFD_ENDPOINT Endpoint ); NTSTATUS FASTCALL AfdGetAddress ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS AfdGetRemoteAddress ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdGetContext ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdGetInformation ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdGetTransportInfo ( IN PUNICODE_STRING TransportDeviceName, IN OUT PAFD_TRANSPORT_INFO *TransportInfo ); NTSTATUS AfdQueryProviderInfo ( IN PUNICODE_STRING TransportDeviceName, OUT PTDI_PROVIDER_INFO ProviderInfo ); VOID AfdIndicateEventSelectEvent ( IN PAFD_ENDPOINT Endpoint, IN ULONG PollEventMask, IN NTSTATUS Status ); VOID AfdIndicatePollEventReal ( IN PAFD_ENDPOINT Endpoint, IN ULONG PollEventMask, IN NTSTATUS Status ); #define AfdIndicatePollEvent(_e,_m,_s) \ ((_e)->PollCalled ? (AfdIndicatePollEventReal((_e),(_m),(_s)), TRUE) : FALSE) VOID AfdInitiateListenBacklogReplenish ( IN PAFD_ENDPOINT Endpoint ); VOID AfdInitializeData ( VOID ); NTSTATUS AfdIssueDeviceControl ( IN PFILE_OBJECT FileObject, IN PVOID IrpParameters, IN ULONG IrpParametersLength, IN PVOID MdlBuffer, IN ULONG MdlBufferLength, IN UCHAR MinorFunction ); VOID AfdIncrementLockCount ( VOID ); VOID AfdDecrementLockCount ( VOID ); VOID AfdInsertNewEndpointInList ( IN PAFD_ENDPOINT Endpoint ); VOID AfdRemoveEndpointFromList ( IN PAFD_ENDPOINT Endpoint ); PVOID AfdLockEndpointContext ( PAFD_ENDPOINT Endpoint ); VOID AfdUnlockEndpointContext ( PAFD_ENDPOINT Endpoint, PVOID Context ); NTSTATUS AfdPartialDisconnect ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS FASTCALL AfdPoll ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); VOID AfdQueueWorkItem ( IN PWORKER_THREAD_ROUTINE AfdWorkerRoutine, IN PAFD_WORK_ITEM AfdWorkItem ); PAFD_WORK_ITEM AfdGetWorkerByRoutine ( PWORKER_THREAD_ROUTINE Routine ); NTSTATUS AfdQueryHandles ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdQueryReceiveInformation ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdSetContext ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdSetEventHandler ( IN PFILE_OBJECT FileObject, IN ULONG EventType, IN PVOID EventHandler, IN PVOID EventContext ); NTSTATUS AfdSetInLineMode ( IN PAFD_CONNECTION Connection, IN BOOLEAN InLine ); NTSTATUS FASTCALL AfdReceive ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS AfdBReceive ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp, IN ULONG RecvFlags, IN ULONG AfdFlags, IN ULONG RecvLength ); NTSTATUS FASTCALL AfdReceiveDatagram ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS AfdSetupReceiveDatagramIrp ( IN PIRP Irp, IN PVOID DatagramBuffer OPTIONAL, IN ULONG DatagramLength, IN PVOID OptionsBuffer OPTIONAL, IN ULONG OptionsLength, IN PVOID SourceAddress OPTIONAL, IN ULONG SourceAddressLength, IN ULONG TdiFlags ); BOOLEAN AfdCleanupReceiveDatagramIrp( IN PIRP Irp ); BOOLEAN AfdCleanupSendIrp ( PIRP Irp ); NTSTATUS AfdReceiveEventHandler ( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG BytesIndicated, IN ULONG BytesAvailable, OUT ULONG *BytesTaken, IN PVOID Tsdu, OUT PIRP *IoRequestPacket ); NTSTATUS AfdBChainedReceiveEventHandler( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG ReceiveLength, IN ULONG StartingOffset, IN PMDL Tsdu, IN PVOID TsduDescriptor ); NTSTATUS AfdBReceiveEventHandler ( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG BytesIndicated, IN ULONG BytesAvailable, OUT ULONG *BytesTaken, IN PVOID Tsdu, OUT PIRP *IoRequestPacket ); NTSTATUS AfdReceiveDatagramEventHandler ( IN PVOID TdiEventContext, IN int SourceAddressLength, IN PVOID SourceAddress, IN int OptionsLength, IN PVOID Options, IN ULONG ReceiveDatagramFlags, IN ULONG BytesIndicated, IN ULONG BytesAvailable, OUT ULONG *BytesTaken, IN PVOID Tsdu, OUT PIRP *IoRequestPacket ); NTSTATUS AfdReceiveExpeditedEventHandler ( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG BytesIndicated, IN ULONG BytesAvailable, OUT ULONG *BytesTaken, IN PVOID Tsdu, OUT PIRP *IoRequestPacket ); NTSTATUS AfdBReceiveExpeditedEventHandler ( IN PVOID TdiEventContext, IN CONNECTION_CONTEXT ConnectionContext, IN ULONG ReceiveFlags, IN ULONG BytesIndicated, IN ULONG BytesAvailable, OUT ULONG *BytesTaken, IN PVOID Tsdu, OUT PIRP *IoRequestPacket ); NTSTATUS AfdRestartBufferReceive ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); NTSTATUS AfdRestartAbort ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); NTSTATUS FASTCALL AfdSend ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS FASTCALL AfdSendDatagram ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS AfdSendPossibleEventHandler ( IN PVOID TdiEventContext, IN PVOID ConnectionContext, IN ULONG BytesAvailable ); NTSTATUS AfdRestartBufferSend ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); VOID AfdProcessBufferSend ( IN PAFD_CONNECTION Connection, IN PIRP Irp ); NTSTATUS AfdSetInformation ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); BOOLEAN AfdShouldSendBlock ( IN PAFD_ENDPOINT Endpoint, IN PAFD_CONNECTION Connection, IN ULONG SendLength ); NTSTATUS AfdStartListen ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS FASTCALL AfdTransmitFile ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS FASTCALL AfdWaitForListen ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS FASTCALL AfdSetQos ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS FASTCALL AfdGetQos ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS FASTCALL AfdNoOperation ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS FASTCALL AfdValidateGroup ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS AfdGetUnacceptedConnectData ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); #define AfdReferenceEventObjectByHandle(Handle, AccessMode, Object) \ ObReferenceObjectByHandle( \ (Handle), \ EVENT_MODIFY_STATE, \ *(POBJECT_TYPE *)ExEventObjectType, \ (AccessMode), \ (Object), \ NULL \ ) // // Endpoint handling routines. // NTSTATUS AfdAllocateEndpoint ( OUT PAFD_ENDPOINT * NewEndpoint, IN PUNICODE_STRING TransportDeviceName, IN LONG GroupID ); #if REFERENCE_DEBUG VOID AfdReferenceEndpoint ( IN PAFD_ENDPOINT Endpoint, IN LONG LocationId, IN ULONG Param ); BOOLEAN AfdCheckAndReferenceEndpoint ( IN PAFD_ENDPOINT Endpoint, IN LONG LocationId, IN ULONG Param ); VOID AfdDereferenceEndpoint ( IN PAFD_ENDPOINT Endpoint, IN LONG LocationId, IN ULONG Param ); VOID AfdUpdateEndpoint ( IN PAFD_ENDPOINT Endpoint, IN LONG LocationId, IN ULONG Param ); #define REFERENCE_ENDPOINT(_e) { \ static LONG _arl; \ AfdReferenceEndpoint((_e),AFD_GET_ARL(__FILE__"(%d)+"),__LINE__); \ } #define REFERENCE_ENDPOINT2(_e,_s,_p) { \ static LONG _arl; \ AfdReferenceEndpoint((_e),AFD_GET_ARL(_s"+"),(_p)); \ } #define CHECK_REFERENCE_ENDPOINT(_e,_r) { \ static LONG _arl; \ _r = AfdCheckAndReferenceEndpoint((_e),AFD_GET_ARL(__FILE__"(%d)*"),\ __LINE__); \ } #define DEREFERENCE_ENDPOINT(_e) { \ static LONG _arl; \ AfdDereferenceEndpoint((_e),AFD_GET_ARL(__FILE__"(%d)-"),__LINE__); \ } #define DEREFERENCE_ENDPOINT2(_e,_s,_p) { \ static LONG _arl; \ AfdDereferenceEndpoint((_e),AFD_GET_ARL(_s"-"),(_p)); \ } #define UPDATE_ENDPOINT(_e) { \ static LONG _arl; \ AfdUpdateEndpoint((_e),AFD_GET_ARL(__FILE__"(%d)="),__LINE__); \ } #define UPDATE_ENDPOINT2(_e,_s,_p) { \ static LONG _arl; \ AfdUpdateEndpoint((_e),AFD_GET_ARL(_s"="),(_p)); \ } #else BOOLEAN AfdCheckAndReferenceEndpoint ( IN PAFD_ENDPOINT Endpoint ); VOID AfdDereferenceEndpoint ( IN PAFD_ENDPOINT Endpoint ); #define REFERENCE_ENDPOINT(_e) (VOID)InterlockedIncrement( (PLONG)&(_e)->ReferenceCount ) #define REFERENCE_ENDPOINT2(_e,_s,_p) InterlockedIncrement( (PLONG)&(_e)->ReferenceCount ) #define CHECK_REFERENCE_ENDPOINT(_e,_r) _r=AfdCheckAndReferenceEndpoint((_e)) #define DEREFERENCE_ENDPOINT(_e) AfdDereferenceEndpoint((_e)) #define DEREFERENCE_ENDPOINT2(_e,_s,_p) AfdDereferenceEndpoint((_e)) #define UPDATE_ENDPOINT(_e) #define UPDATE_ENDPOINT2(_e,_s,_p) #endif VOID AfdRefreshEndpoint ( IN PAFD_ENDPOINT Endpoint ); // // Connection handling routines. // VOID AfdAbortConnection ( IN PAFD_CONNECTION Connection ); NTSTATUS AfdAddFreeConnection ( IN PAFD_ENDPOINT Endpoint ); PAFD_CONNECTION AfdAllocateConnection ( VOID ); NTSTATUS AfdCreateConnection ( IN PUNICODE_STRING TransportDeviceName, IN HANDLE AddressHandle OPTIONAL, IN BOOLEAN TdiBufferring, IN LOGICAL InLine, IN PEPROCESS ProcessToCharge, OUT PAFD_CONNECTION *Connection ); PAFD_CONNECTION AfdGetFreeConnection ( IN PAFD_ENDPOINT Endpoint, OUT PIRP *Irp ); PAFD_CONNECTION AfdGetReturnedConnection ( IN PAFD_ENDPOINT Endpoint, IN LONG Sequence ); PAFD_CONNECTION AfdFindReturnedConnection( IN PAFD_ENDPOINT Endpoint, IN LONG Sequence ); PAFD_CONNECTION AfdGetUnacceptedConnection ( IN PAFD_ENDPOINT Endpoint ); PAFD_CONNECTION AfdGetConnectionReferenceFromEndpoint ( PAFD_ENDPOINT Endpoint ); #if REFERENCE_DEBUG VOID AfdReferenceConnection ( IN PAFD_CONNECTION Connection, IN LONG LocationId, IN ULONG Param ); BOOLEAN AfdCheckAndReferenceConnection ( PAFD_CONNECTION Connection, IN LONG LocationId, IN ULONG Param ); VOID AfdDereferenceConnection ( IN PAFD_CONNECTION Connection, IN LONG LocationId, IN ULONG Param ); #define REFERENCE_CONNECTION(_c) { \ static LONG _arl; \ AfdReferenceConnection((_c),AFD_GET_ARL(__FILE__"(%d)+"),__LINE__); \ } #define REFERENCE_CONNECTION2(_c,_s,_p) { \ static LONG _arl; \ AfdReferenceConnection((_c),AFD_GET_ARL(_s"+"),(_p)); \ } #define CHECK_REFERENCE_CONNECTION(_c,_r) { \ static LONG _arl; \ _r=AfdCheckAndReferenceConnection((_c),AFD_GET_ARL(__FILE__"(%d)*"),\ __LINE__); \ } #define CHECK_REFERENCE_CONNECTION2(_c,_s,_p,_r) { \ static LONG _arl; \ _r = AfdCheckAndReferenceConnection((_c),AFD_GET_ARL(_s"*"),(_p)); \ } #define DEREFERENCE_CONNECTION(_c) { \ static LONG _arl; \ AfdDereferenceConnection((_c),AFD_GET_ARL(__FILE__"(%d)-"),__LINE__);\ } #define DEREFERENCE_CONNECTION2(_c,_s,_p) { \ static LONG _arl; \ AfdDereferenceConnection((_c),AFD_GET_ARL(_s"-"),(_p)); \ } VOID AfdUpdateConnectionTrack ( IN PAFD_CONNECTION Connection, IN LONG LocationId, IN ULONG Param ); #define UPDATE_CONN(_c) \ if( (_c) != NULL ) { \ static LONG _arl; \ AfdUpdateConnectionTrack( \ (_c), \ AFD_GET_ARL(__FILE__"(%d)="), \ __LINE__ \ ); \ } else #define UPDATE_CONN2(_c,_s,_p) \ if( (_c) != NULL ) { \ static LONG _arl; \ AfdUpdateConnectionTrack((_c),AFD_GET_ARL(_s"="),(_p)); \ } else #else VOID AfdCloseConnection ( IN PAFD_CONNECTION Connection ); BOOLEAN AfdCheckAndReferenceConnection ( PAFD_CONNECTION Connection ); #define REFERENCE_CONNECTION(_c) (VOID)InterlockedIncrement( (PLONG)&(_c)->ReferenceCount ) #define REFERENCE_CONNECTION2(_c,_s,_p) (VOID)InterlockedIncrement( (PLONG)&(_c)->ReferenceCount ) #define CHECK_REFERENCE_CONNECTION(_c,_r) _r=AfdCheckAndReferenceConnection((_c)) #define CHECK_REFERENCE_CONNECTION2(_c,_s,_p,_r) _r=AfdCheckAndReferenceConnection((_c)) #define DEREFERENCE_CONNECTION(_c) \ if (InterlockedDecrement((PLONG)&(_c)->ReferenceCount)==0) { \ AfdCloseConnection (_c); \ } \ #define DEREFERENCE_CONNECTION2(_c,_s,_p) \ if (InterlockedDecrement((PLONG)&(_c)->ReferenceCount)==0) { \ AfdCloseConnection (_c); \ } \ #define UPDATE_CONN(_c) #define UPDATE_CONN2(_c,_s,_p) #endif VOID AfdAddConnectedReference ( IN PAFD_CONNECTION Connection ); VOID AfdDeleteConnectedReference ( IN PAFD_CONNECTION Connection, IN BOOLEAN EndpointLockHeld ); // // Routines to handle fast IO. // BOOLEAN AfdFastIoRead ( IN struct _FILE_OBJECT *FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, OUT PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatus, IN struct _DEVICE_OBJECT *DeviceObject ); BOOLEAN AfdFastIoWrite ( IN struct _FILE_OBJECT *FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, IN PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatus, IN struct _DEVICE_OBJECT *DeviceObject ); BOOLEAN AfdFastIoDeviceControl ( IN struct _FILE_OBJECT *FileObject, IN BOOLEAN Wait, IN PVOID InputBuffer OPTIONAL, IN ULONG InputBufferLength, OUT PVOID OutputBuffer OPTIONAL, IN ULONG OutputBufferLength, IN ULONG IoControlCode, OUT PIO_STATUS_BLOCK IoStatus, IN struct _DEVICE_OBJECT *DeviceObject ); // // Routines to handle getting and setting connect data. // NTSTATUS AfdGetConnectData ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdSetConnectData ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdSaveReceivedConnectData ( IN OUT PAFD_CONNECT_DATA_BUFFERS * DataBuffers, IN ULONG IoControlCode, IN PVOID Buffer, IN ULONG BufferLength ); // // Buffer management routines. // PVOID AfdAllocateBuffer ( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag ); PVOID AfdAllocateBufferTag ( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag ); VOID NTAPI AfdFreeBufferTag( IN PVOID AfdBufferTag ); PVOID AfdAllocateRemoteAddress ( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag ); VOID NTAPI AfdFreeRemoteAddress( IN PVOID AfdBufferTag ); VOID AfdInitializeBufferTag ( IN PAFD_BUFFER_TAG AfdBufferTag, IN ULONG AddressSize ); #define AFDB_RAISE_ON_FAILURE ((ULONG_PTR)1) PAFD_BUFFER_TAG AfdGetBufferTag ( IN ULONG AddressSize, IN PEPROCESS Process ); #define AfdGetBufferTagRaiseOnFailure(_as,_pr) \ AfdGetBufferTag((_as),((PEPROCESS)((ULONG_PTR)(_pr)|AFDB_RAISE_ON_FAILURE))) ULONG AfdCalculateBufferSize ( IN ULONG BufferDataSize, IN ULONG AddressSize ); PAFD_BUFFER AfdGetBuffer ( IN ULONG BufferDataSize, IN ULONG AddressSize, IN PEPROCESS Process ); #define AfdGetBufferRaiseOnFailure(_ds,_as,_pr) \ AfdGetBuffer((_ds),(_as),((PEPROCESS)((ULONG_PTR)(_pr)|AFDB_RAISE_ON_FAILURE))) VOID AfdReturnBuffer ( IN PAFD_BUFFER_HEADER AfdBufferHeader, IN PEPROCESS Process ); VOID NTAPI AfdFreeBuffer( IN PVOID AfdBuffer ); VOID AfdInitializeBufferManager ( VOID ); // // Group ID managment routines. // BOOLEAN AfdInitializeGroup( VOID ); VOID AfdTerminateGroup( VOID ); BOOLEAN AfdReferenceGroup( IN LONG Group, OUT PAFD_GROUP_TYPE GroupType ); BOOLEAN AfdDereferenceGroup( IN LONG Group ); BOOLEAN AfdGetGroup( IN OUT PLONG Group, OUT PAFD_GROUP_TYPE GroupType ); BOOLEAN AfdCancelIrp ( IN PIRP Irp ); // PnP and PM routines NTSTATUS FASTCALL AfdPnpPower ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS AfdRoutingInterfaceQuery ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS FASTCALL AfdRoutingInterfaceChange ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS AfdAddressListQuery ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS FASTCALL AfdAddressListChange ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); VOID AfdDeregisterPnPHandlers ( PVOID Param ); VOID AfdDereferenceRoutingQuery ( IN USHORT AddressType ); NTSTATUS FASTCALL AfdDoTransportIoctl ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); BOOLEAN AfdLRRepostReceive ( PAFD_LR_LIST_ITEM ListEntry ); VOID AfdLRListAddItem ( PAFD_LR_LIST_ITEM Item, PAFD_LR_LIST_ROUTINE Routine ); VOID AfdCheckLookasideLists ( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); ULONG AfdComputeTpInfoSize ( ULONG ElementCount, LONG IrpCount, CCHAR IrpStackCount ); NTSTATUS FASTCALL AfdTransmitPackets ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); NTSTATUS FASTCALL AfdSuperDisconnect ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp ); VOID AfdCompleteClosePendedTPackets ( PAFD_ENDPOINT Endpoint ); PVOID AfdAllocateTpInfo ( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag ); VOID NTAPI AfdFreeTpInfo ( PVOID TpInfo ); // // SAN prototypes // NTSTATUS AfdServiceWaitForListen ( PIRP Irp, PAFD_CONNECTION Connection, PAFD_LOCK_QUEUE_HANDLE LockHandle ); VOID AfdSanCancelAccept ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS AfdSanAcceptCore ( PIRP AcceptIrp, PFILE_OBJECT AcceptFileObject, PAFD_CONNECTION Connection, PAFD_LOCK_QUEUE_HANDLE LockHandle ); NTSTATUS AfdSanCreateHelper ( PIRP Irp, PFILE_FULL_EA_INFORMATION EaBuffer, PAFD_ENDPOINT *Endpoint ); VOID AfdSanCleanupHelper ( PAFD_ENDPOINT Endpoint ); VOID AfdSanCleanupEndpoint ( PAFD_ENDPOINT Endpoint ); NTSTATUS AfdSanFastCementEndpoint ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdSanFastSetEvents ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdSanFastResetEvents ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS FASTCALL AfdSanConnectHandler ( PIRP Irp, PIO_STACK_LOCATION IrpSp ); NTSTATUS AfdSanFastCompleteAccept ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS FASTCALL AfdSanRedirectRequest ( PIRP Irp, PIO_STACK_LOCATION IrpSp ); NTSTATUS AfdSanFastCompleteRequest ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdSanFastCompleteIo ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdSanFastRefreshEndpoint ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdSanFastGetPhysicalAddr ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdSanPollBegin ( PAFD_ENDPOINT Endpoint, ULONG EventMask ); VOID AfdSanPollEnd ( PAFD_ENDPOINT Endpoint, ULONG EventMask ); VOID AfdSanPollUpdate ( PAFD_ENDPOINT Endpoint, ULONG EventMask ); NTSTATUS AfdSanPollMerge ( PAFD_ENDPOINT Endpoint, PAFD_SWITCH_CONTEXT Context ); NTSTATUS AfdSanFastTransferCtx ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdSanFastGetServicePid ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdSanFastSetServiceProcess ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS AfdSanFastProviderChange ( IN PFILE_OBJECT FileObject, IN ULONG IoctlCode, IN KPROCESSOR_MODE RequestorMode, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, OUT PUINT_PTR Information ); NTSTATUS FASTCALL AfdSanAddrListChange ( PIRP Irp, PIO_STACK_LOCATION IrpSp ); NTSTATUS FASTCALL AfdSanAcquireContext ( PIRP Irp, PIO_STACK_LOCATION IrpSp ); BOOLEAN AfdSanFastUnlockAll ( IN PFILE_OBJECT FileObject, IN PEPROCESS Process, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ); VOID AfdSanReleaseConnection ( PAFD_ENDPOINT ListenEndpoint, PAFD_CONNECTION Connection, BOOLEAN CheckBacklog ); VOID AfdSanAbortConnection ( PAFD_CONNECTION Connection ); NTSTATUS AfdValidateStatus ( NTSTATUS Status ); // // Check if datagram part of the union is valid // #define IS_DGRAM_ENDPOINT(endp) \ ((endp)->Type==AfdBlockTypeDatagram) // // Check if Vc part of the union is valid // #define IS_VC_ENDPOINT(endp) \ ( ((endp)->Type==AfdBlockTypeEndpoint) || \ ((endp)->Type==AfdBlockTypeVcConnecting) || \ ((endp)->Type==AfdBlockTypeVcListening) || \ ((endp)->Type==AfdBlockTypeVcBoth) ) #define IS_SAN_ENDPOINT(endp) \ ((endp)->Type==AfdBlockTypeSanEndpoint) #define IS_SAN_HELPER(endp) \ ((endp)->Type==AfdBlockTypeSanHelper) #define IS_MESSAGE_ENDPOINT(endp) \ ((endp)->afdMessageMode) #define IS_RAW_ENDPOINT(endp) \ ((endp)->afdRaw) #define IS_CROOT_ENDPOINT(endp) \ ((endp)->afdMultipoint && (endp)->afdC_Root) #define IS_DELAYED_ACCEPTANCE_ENDPOINT(endp) \ ((endp)->DelayedAcceptance) #define IS_TDI_MESSAGE_MODE(endp) \ ((BOOLEAN)(((endp)->TdiServiceFlags&TDI_SERVICE_MESSAGE_MODE)!=0)) #define IS_TDI_BUFFERRING(endp) \ ((BOOLEAN)(((endp)->TdiServiceFlags&TDI_SERVICE_INTERNAL_BUFFERING)!=0)) #define IS_TDI_EXPEDITED(endp) \ ((BOOLEAN)(((endp)->TdiServiceFlags&TDI_SERVICE_EXPEDITED_DATA)!=0)) #define IS_TDI_ORDERLY_RELEASE(endp) \ ((BOOLEAN)(((endp)->TdiServiceFlags&TDI_SERVICE_ORDERLY_RELEASE)!=0)) #define IS_TDI_DGRAM_CONNECTION(endp) \ ((BOOLEAN)(((endp)->TdiServiceFlags&TDI_SERVICE_DGRAM_CONNECTION)!=0)) #define IS_TDI_FORCE_ACCESS_CHECK(endp) \ ((BOOLEAN)(((endp)->TdiServiceFlags&TDI_SERVICE_FORCE_ACCESS_CHECK)!=0)) #define IS_TDI_DELAYED_ACCEPTANCE(endp) \ ((BOOLEAN)(((endp)->TdiServiceFlags&TDI_SERVICE_DELAYED_ACCEPTANCE)!=0)) #define IS_DATA_ON_CONNECTION_B(conn) \ ((conn)->Common.Bufferring.ReceiveBytesIndicated.QuadPart > \ ((conn)->Common.Bufferring.ReceiveBytesTaken.QuadPart + \ (conn)->Common.Bufferring.ReceiveBytesOutstanding.QuadPart )\ || \ (conn)->VcZeroByteReceiveIndicated) #define IS_EXPEDITED_DATA_ON_CONNECTION_B(conn) \ ((conn)->Common.Bufferring.ReceiveExpeditedBytesIndicated.QuadPart > \ ((conn)->Common.Bufferring.ReceiveExpeditedBytesTaken.QuadPart + \ (conn)->Common.Bufferring.ReceiveExpeditedBytesOutstanding.QuadPart) ) #define IS_DATA_ON_CONNECTION_NB(conn) \ ( (conn)->VcBufferredReceiveCount != 0 ) #define IS_EXPEDITED_DATA_ON_CONNECTION_NB(conn) \ ( (conn)->VcBufferredExpeditedCount != 0 ) #define IS_DATA_ON_CONNECTION(conn) \ ((conn)->TdiBufferring ? \ IS_DATA_ON_CONNECTION_B(conn) : \ IS_DATA_ON_CONNECTION_NB(conn) ) #define IS_EXPEDITED_DATA_ON_CONNECTION(conn) \ ((conn)->TdiBufferring ? \ IS_EXPEDITED_DATA_ON_CONNECTION_B(conn) : \ IS_EXPEDITED_DATA_ON_CONNECTION_NB(conn) ) #define ARE_DATAGRAMS_ON_ENDPOINT(endp) \ ( (endp)->DgBufferredReceiveCount != 0 ) #define AFD_START_STATE_CHANGE(endp,newState) \ (InterlockedCompareExchange( \ &(endp)->StateChangeInProgress, \ newState, \ 0)==0) #if DBG #define AFD_END_STATE_CHANGE(endp) \ ASSERT (InterlockedExchange(&(endp)->StateChangeInProgress,0)!=0) #else #define AFD_END_STATE_CHANGE(endp) \ (endp)->StateChangeInProgress = 0; #endif #define AFD_ALLOCATE_REMOTE_ADDRESS(_l) \ (((ULONG)(_l)<=AfdStandardAddressLength) \ ? ExAllocateFromNPagedLookasideList( \ &AfdLookasideLists->RemoteAddrList )\ : AFD_ALLOCATE_POOL(NonPagedPool, \ (_l), AFD_REMOTE_ADDRESS_POOL_TAG) \ ) #define AFD_RETURN_REMOTE_ADDRESS(_a,_l) \ (((ULONG)(_l)<=AfdStandardAddressLength) \ ? ExFreeToNPagedLookasideList( \ &AfdLookasideLists->RemoteAddrList, \ (_a)) \ : AFD_FREE_POOL((_a), AFD_REMOTE_ADDRESS_POOL_TAG) \ ) #if DBG LONG AfdApcExceptionFilter( PEXCEPTION_POINTERS ExceptionPointers, PCHAR SourceFile, LONG LineNumber ); #endif // // Debug statistic manipulators. On checked builds these macros update // their corresponding statistic counter. On retail builds, these macros // evaluate to nothing. // #if AFD_KEEP_STATS #define AfdRecordPoolQuotaCharged( b ) \ ExInterlockedAddLargeStatistic( \ &AfdQuotaStats.Charged, \ (b) \ ) #define AfdRecordPoolQuotaReturned( b ) \ ExInterlockedAddLargeStatistic( \ &AfdQuotaStats.Returned, \ (b) \ ) #define AfdRecordAddrOpened() InterlockedIncrement( &AfdHandleStats.AddrOpened ) #define AfdRecordAddrClosed() InterlockedIncrement( &AfdHandleStats.AddrClosed ) #define AfdRecordAddrRef() InterlockedIncrement( &AfdHandleStats.AddrRef ) #define AfdRecordAddrDeref() InterlockedIncrement( &AfdHandleStats.AddrDeref ) #define AfdRecordConnOpened() InterlockedIncrement( &AfdHandleStats.ConnOpened ) #define AfdRecordConnClosed() InterlockedIncrement( &AfdHandleStats.ConnClosed ) #define AfdRecordConnRef() InterlockedIncrement( &AfdHandleStats.ConnRef ) #define AfdRecordConnDeref() InterlockedIncrement( &AfdHandleStats.ConnDeref ) #define AfdRecordFileRef() InterlockedIncrement( &AfdHandleStats.FileRef ) #define AfdRecordFileDeref() InterlockedIncrement( &AfdHandleStats.FileDeref ) #define AfdRecordAfdWorkItemsQueued() InterlockedIncrement( &AfdQueueStats.AfdWorkItemsQueued ) #define AfdRecordExWorkItemsQueued() InterlockedIncrement( &AfdQueueStats.ExWorkItemsQueued ) #define AfdRecordWorkerEnter() InterlockedIncrement( &AfdQueueStats.WorkerEnter ) #define AfdRecordWorkerLeave() InterlockedIncrement( &AfdQueueStats.WorkerLeave ) #define AfdRecordAfdWorkItemsProcessed() InterlockedIncrement( &AfdQueueStats.AfdWorkItemsProcessed ) #define AfdRecordAfdWorkerThread(t) \ if( 1 ) { \ ASSERT( AfdQueueStats.AfdWorkerThread == NULL || \ (t) == NULL ); \ AfdQueueStats.AfdWorkerThread = (t); \ } else #define AfdRecordConnectedReferencesAdded() InterlockedIncrement( &AfdConnectionStats.ConnectedReferencesAdded ) #define AfdRecordConnectedReferencesDeleted() InterlockedIncrement( &AfdConnectionStats.ConnectedReferencesDeleted ) #define AfdRecordGracefulDisconnectsInitiated() InterlockedIncrement( &AfdConnectionStats.GracefulDisconnectsInitiated ) #define AfdRecordGracefulDisconnectsCompleted() InterlockedIncrement( &AfdConnectionStats.GracefulDisconnectsCompleted ) #define AfdRecordGracefulDisconnectIndications() InterlockedIncrement( &AfdConnectionStats.GracefulDisconnectIndications ) #define AfdRecordAbortiveDisconnectsInitiated() InterlockedIncrement( &AfdConnectionStats.AbortiveDisconnectsInitiated ) #define AfdRecordAbortiveDisconnectsCompleted() InterlockedIncrement( &AfdConnectionStats.AbortiveDisconnectsCompleted ) #define AfdRecordAbortiveDisconnectIndications() InterlockedIncrement( &AfdConnectionStats.AbortiveDisconnectIndications ) #define AfdRecordConnectionIndications() InterlockedIncrement( &AfdConnectionStats.ConnectionIndications ) #define AfdRecordConnectionsDropped() InterlockedIncrement( &AfdConnectionStats.ConnectionsDropped ) #define AfdRecordConnectionsAccepted() InterlockedIncrement( &AfdConnectionStats.ConnectionsAccepted ) #define AfdRecordConnectionsPreaccepted() InterlockedIncrement( &AfdConnectionStats.ConnectionsPreaccepted ) #define AfdRecordConnectionsReused() InterlockedIncrement( &AfdConnectionStats.ConnectionsReused ) #define AfdRecordEndpointsReused() InterlockedIncrement( &AfdConnectionStats.EndpointsReused ) #else // !AFD_KEEP_STATS #define AfdRecordPoolQuotaCharged(b) #define AfdRecordPoolQuotaReturned(b) #define AfdRecordAddrOpened() #define AfdRecordAddrClosed() #define AfdRecordAddrRef() #define AfdRecordAddrDeref() #define AfdRecordConnOpened() #define AfdRecordConnClosed() #define AfdRecordConnRef() #define AfdRecordConnDeref() #define AfdRecordFileRef() #define AfdRecordFileDeref() #define AfdRecordAfdWorkItemsQueued() #define AfdRecordExWorkItemsQueued() #define AfdRecordWorkerEnter() #define AfdRecordWorkerLeave() #define AfdRecordAfdWorkItemsProcessed() #define AfdRecordAfdWorkerThread(t) #define AfdRecordConnectedReferencesAdded() #define AfdRecordConnectedReferencesDeleted() #define AfdRecordGracefulDisconnectsInitiated() #define AfdRecordGracefulDisconnectsCompleted() #define AfdRecordGracefulDisconnectIndications() #define AfdRecordAbortiveDisconnectsInitiated() #define AfdRecordAbortiveDisconnectsCompleted() #define AfdRecordAbortiveDisconnectIndications() #define AfdRecordConnectionIndications() #define AfdRecordConnectionsDropped() #define AfdRecordConnectionsAccepted() #define AfdRecordConnectionsPreaccepted() #define AfdRecordConnectionsReused() #define AfdRecordEndpointsReused() #endif // if AFD_KEEP_STATS #endif // ndef _AFDPROCS_