|
|
/*++
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 AfdAccept ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdSuperAccept ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdDeferAccept ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
PMDL AfdAdvanceMdlChain( IN PMDL Mdl, IN ULONG Offset );
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 AfdBind ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
ULONG AfdCalcBufferArrayByteLengthRead( IN LPWSABUF BufferArray, IN ULONG BufferCount );
ULONG AfdCalcBufferArrayByteLengthWrite( IN LPWSABUF BufferArray, IN ULONG BufferCount );
VOID AfdCancelReceiveDatagram ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
VOID AfdCancelTransmit ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
NTSTATUS AfdCleanup ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdClose ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
VOID AfdCompleteIrpList ( IN PLIST_ENTRY IrpListHead, IN PKSPIN_LOCK SpinLock, IN NTSTATUS Status, IN PAFD_IRP_CLEANUP_ROUTINE CleanupRoutine OPTIONAL );
VOID AfdCompleteClosePendedTransmit ( IN PAFD_ENDPOINT Endpoint );
NTSTATUS AfdConnect ( 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 );
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 );
NTSTATUS AfdCreate ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
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 AfdEnumNetworkEvents ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdErrorEventHandler ( IN PVOID TdiEventContext, IN NTSTATUS Status );
NTSTATUS AfdEventSelect ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
BOOLEAN AfdFastTransmitFile ( IN struct _FILE_OBJECT *FileObject, IN PVOID InputBuffer OPTIONAL, IN ULONG InputBufferLength, OUT PIO_STATUS_BLOCK IoStatus );
VOID AfdFreeConnectDataBuffers ( IN PAFD_CONNECT_DATA_BUFFERS ConnectDataBuffers );
VOID AfdFreeQueuedConnections ( IN PAFD_ENDPOINT Endpoint );
NTSTATUS AfdGetAddress ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdGetContext ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdGetContextLength ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdGetInformation ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
VOID AfdIndicateEventSelectEvent ( IN PAFD_ENDPOINT Endpoint, IN ULONG PollEventBit, IN NTSTATUS Status );
VOID AfdIndicatePollEvent ( IN PAFD_ENDPOINT Endpoint, IN ULONG PollEventBit, IN NTSTATUS Status );
VOID AfdInitiateListenBacklogReplenish ( IN PAFD_ENDPOINT Endpoint );
BOOLEAN AfdInitializeData ( VOID );
NTSTATUS AfdIssueDeviceControl ( IN HANDLE FileHandle OPTIONAL, IN PFILE_OBJECT FileObject OPTIONAL, 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 );
VOID AfdInterlockedRemoveEntryList ( IN PLIST_ENTRY ListEntry, IN PKSPIN_LOCK SpinLock );
NTSTATUS AfdOpenConnection ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdPartialDisconnect ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdPoll ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
PAFD_WORK_ITEM AfdAllocateWorkItem( VOID );
VOID AfdQueueWorkItem ( IN PWORKER_THREAD_ROUTINE AfdWorkerRoutine, IN PAFD_WORK_ITEM AfdWorkItem );
VOID AfdFreeWorkItem( IN PAFD_WORK_ITEM AfdWorkItem );
#if DBG
PVOID NTAPI AfdAllocateWorkItemPool( IN POOL_TYPE PoolType, IN ULONG NumberOfBytes, IN ULONG Tag );
VOID NTAPI AfdFreeWorkItemPool( IN PVOID Block ); #endif
NTSTATUS AfdQueryHandles ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdQueryReceiveInformation ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdQueueUserApc ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdSetContext ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
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 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 AfdReceiveDatagram ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp, IN ULONG RecvFlags, IN ULONG AfdFlags );
VOID AfdCleanupReceiveDatagramIrp( IN 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 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 AfdSend ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS 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 );
NTSTATUS AfdSetInformation ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
BOOLEAN AfdShouldSendBlock ( IN PAFD_ENDPOINT Endpoint, IN PAFD_CONNECTION Connection, IN ULONG SendLength );
NTSTATUS AfdStartListen ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdTransmitFile ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdMdlReadComplete( IN PFILE_OBJECT FileObject, IN PMDL MdlChain, IN LONGLONG FileOffset, IN ULONG Length );
NTSTATUS AfdWaitForListen ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdSetQos ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdGetQos ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdNoOperation ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdValidateGroup ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
NTSTATUS AfdGetUnacceptedConnectData ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
#ifdef NT351
NTSTATUS AfdReferenceEventObjectByHandle( IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object );
#else // !NT351
#define AfdReferenceEventObjectByHandle(Handle, AccessMode, Object) \
ObReferenceObjectByHandle( \ (Handle), \ 0, \ *(POBJECT_TYPE *)ExEventObjectType, \ (AccessMode), \ (Object), \ NULL \ )
#endif
//
// Endpoint handling routines.
//
NTSTATUS AfdAllocateEndpoint ( OUT PAFD_ENDPOINT * NewEndpoint, IN PUNICODE_STRING TransportDeviceName, IN LONG GroupID );
VOID AfdCloseEndpoint ( IN PAFD_ENDPOINT Endpoint );
#if REFERENCE_DEBUG
VOID AfdReferenceEndpoint ( IN PAFD_ENDPOINT Endpoint, IN PVOID Info1, IN PVOID Info2 );
VOID AfdDereferenceEndpoint ( IN PAFD_ENDPOINT Endpoint, IN PVOID Info1, IN PVOID Info2 );
#define REFERENCE_ENDPOINT(_a) AfdReferenceEndpoint((_a),(PVOID)__FILE__,(PVOID)__LINE__)
#define REFERENCE_ENDPOINT2(_a,_b,_c) AfdReferenceEndpoint((_a),(_b),(_c))
#define DEREFERENCE_ENDPOINT(_a) AfdDereferenceEndpoint((_a),(PVOID)__FILE__,(PVOID)__LINE__)
#define DEREFERENCE_ENDPOINT2(_a,_b,_c) AfdDereferenceEndpoint((_a),(PVOID)__FILE__,(PVOID)__LINE__)
#else
VOID AfdDereferenceEndpoint ( IN PAFD_ENDPOINT Endpoint );
#define REFERENCE_ENDPOINT(_a) InterlockedIncrement( &(_a)->ReferenceCount )
#define REFERENCE_ENDPOINT2(_a,_b,_c) InterlockedIncrement( &(_a)->ReferenceCount )
#define DEREFERENCE_ENDPOINT(_a) AfdDereferenceEndpoint((_a))
#define DEREFERENCE_ENDPOINT2(_a,_b,_c) AfdDereferenceEndpoint((_a))
#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 BOOLEAN InLine, IN PEPROCESS ProcessToCharge, OUT PAFD_CONNECTION *Connection );
PAFD_CONNECTION AfdGetFreeConnection ( IN PAFD_ENDPOINT Endpoint );
PAFD_CONNECTION AfdGetReturnedConnection ( IN PAFD_ENDPOINT Endpoint, IN ULONG Sequence );
PAFD_CONNECTION AfdGetUnacceptedConnection ( IN PAFD_ENDPOINT Endpoint );
#if REFERENCE_DEBUG
VOID AfdReferenceConnection ( IN PAFD_CONNECTION Connection, IN PVOID Info1, IN PVOID Info2 );
VOID AfdDereferenceConnection ( IN PAFD_CONNECTION Connection, IN PVOID Info1, IN PVOID Info2 );
#define REFERENCE_CONNECTION(_a) AfdReferenceConnection((_a), (PVOID)__FILE__, (PVOID)__LINE__)
#define REFERENCE_CONNECTION2(_a,_b,_c) AfdReferenceConnection((_a),(_b),(_c))
#define DEREFERENCE_CONNECTION(_a) AfdDereferenceConnection((_a), (PVOID)__FILE__, (PVOID)__LINE__ )
#define DEREFERENCE_CONNECTION2(_a,_b,_c) AfdDereferenceConnection((_a),(_b),(_c))
VOID AfdUpdateConnectionTrack ( IN PAFD_CONNECTION Connection, IN LONG NewReferenceCount, IN PVOID Info1, IN PVOID Info2, IN ULONG Action );
#define UPDATE_CONN(_c,_a) \
if( (_c) != NULL ) { \ AfdUpdateConnectionTrack( \ (_c), \ (_c)->ReferenceCount, \ __FILE__, \ (PVOID)__LINE__, \ (ULONG)(_a) \ ); \ } else
#else
VOID AfdDereferenceConnection ( IN PAFD_CONNECTION Connection );
#define REFERENCE_CONNECTION(_a) InterlockedIncrement( &(_a)->ReferenceCount )
#define REFERENCE_CONNECTION2(_a,_b,_c) InterlockedIncrement( &(_a)->ReferenceCount )
#define DEREFERENCE_CONNECTION(_a) AfdDereferenceConnection((_a))
#define DEREFERENCE_CONNECTION2(_a,_b,_c) AfdDereferenceConnection((_a))
#define UPDATE_CONN(_c,_a)
#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 PIRP Irp, IN PIO_STACK_LOCATION IrpSp, IN ULONG Code );
NTSTATUS AfdSetConnectData ( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp, IN ULONG Code );
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 ULONG NumberOfBytes, IN ULONG Tag );
CLONG AfdCalculateBufferSize ( IN CLONG BufferDataSize, IN CLONG AddressSize );
PAFD_BUFFER AfdGetBuffer ( IN CLONG BufferDataSize, IN CLONG AddressSize );
PAFD_BUFFER AfdGetBufferChain ( IN CLONG BufferDataSize );
VOID AfdReturnBuffer ( IN PAFD_BUFFER AfdBuffer );
VOID AfdReturnBufferChain ( IN PAFD_BUFFER AfdBuffer );
#if DBG
VOID NTAPI AfdFreeBufferPool( IN PVOID Block ); #endif
//
// 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 );
#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)->Common.NonBufferring.BufferredReceiveCount != 0 )
#define IS_EXPEDITED_DATA_ON_CONNECTION_NB(conn) \
( (conn)->Common.NonBufferring.BufferredExpeditedCount != 0 )
#define IS_DATA_ON_CONNECTION(conn) \
( (conn)->Endpoint->TdiBufferring ? \ IS_DATA_ON_CONNECTION_B(conn) : \ IS_DATA_ON_CONNECTION_NB(conn) )
#define IS_EXPEDITED_DATA_ON_CONNECTION(conn) \
( (conn)->Endpoint->TdiBufferring ? \ IS_EXPEDITED_DATA_ON_CONNECTION_B(conn) : \ IS_EXPEDITED_DATA_ON_CONNECTION_NB(conn) )
#define ARE_DATAGRAMS_ON_ENDPOINT(endp) \
( (endp)->BufferredDatagramCount != 0 )
//
// 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 )
#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()
#endif // if AFD_KEEP_STATS
#endif // ndef _AFDPROCS_
|