1074 lines
23 KiB
C
1074 lines
23 KiB
C
/*++
|
|
|
|
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_
|
|
|