Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2309 lines
59 KiB

/*++
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 PULONG_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 PULONG_PTR Information
);
LONG
AfdExceptionFilter(
#if DBG
IN PCHAR SourceFile,
IN LONG LineNumber,
#endif
IN PEXCEPTION_POINTERS ExceptionPointers,
OUT PNTSTATUS ExceptionCode OPTIONAL
);
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 PULONG_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 PULONG_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 PULONG_PTR Information
);
NTSTATUS
AfdGetTransportInfo (
IN PUNICODE_STRING TransportDeviceName,
IN OUT PAFD_TRANSPORT_INFO *TransportInfo
);
NTSTATUS
AfdQueryProviderInfo (
IN PUNICODE_STRING TransportDeviceName,
#ifdef _AFD_VARIABLE_STACK_
OUT CCHAR *StackSize OPTIONAL,
#endif //_AFD_VARIABLE_STACK_
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 PULONG_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 PULONG_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 PULONG_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 PULONG_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
AfdUnbind (
IN PAFD_ENDPOINT Endpoint
);
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 PULONG_PTR Information
);
NTSTATUS
AfdGetSecurity (
IN PAFD_ENDPOINT Endpoint,
IN SECURITY_INFORMATION SecurityInformation,
IN ULONG BufferLength,
OUT PVOID Buffer,
OUT PSIZE_T DataLength
);
NTSTATUS
AfdSetSecurity (
IN PAFD_ENDPOINT Endpoint,
IN SECURITY_INFORMATION SecurityInformation,
IN PSECURITY_DESCRIPTOR SecurityDescriptor
);
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 PULONG_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 PULONG_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 PAFD_TRANSPORT_INFO TransportInfo,
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 PULONG_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 PULONG_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
);
#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,
IN CCHAR StackSize
);
PAFD_BUFFER
FASTCALL
AfdGetBufferFast (
IN ULONG BufferDataSize,
IN ULONG AddressSize,
IN PEPROCESS Process
);
#ifdef _AFD_VARIABLE_STACK_
PAFD_BUFFER
FASTCALL
AfdGetBufferWithMaxStackSize (
IN ULONG BufferDataSize,
IN ULONG AddressSize,
IN PEPROCESS Process
);
#define AfdGetBuffer(_e,_ds,_as,_pr) \
(((_e)->TransportInfo->GetBuffer)(_ds,_as,_pr))
#else // _AFD_VARIABLE_STACK_
#define AfdGetBuffer(_e,_ds,_as,_pr) AfdGetBufferFast(_ds,_as,_pr)
#endif // _AFD_VARIABLE_STACK_
#define AfdGetBufferRaiseOnFailure(_e,_ds,_as,_pr) \
AfdGetBuffer(_e,_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 PULONG_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 PULONG_PTR Information
);
NTSTATUS
FASTCALL
AfdAddressListChange (
IN PIRP Irp,
IN PIO_STACK_LOCATION IrpSp
);
VOID
AfdDeregisterPnPHandlers (
PVOID Param
);
VOID
AfdCleanupRoutingChange (
IN PAFD_ENDPOINT Endpoint
);
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
);
#ifdef _AFD_VARIABLE_STACK_
VOID
AfdFixTransportEntryPointsForBigStackSize (
IN OUT PAFD_TRANSPORT_INFO TransportInfo,
IN CCHAR StackSize
);
NTSTATUS
FASTCALL
AfdCallDriverStackIncrease (
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
);
PIRP
AfdGetStackIncreaseIrpAndRecordIt (
IN PAFD_ENDPOINT Endpoint,
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
#if DBG
,
IN PCHAR File,
IN ULONG Line
#endif
);
#endif //_AFD_VARIABLE_STACK_
PAFD_TPACKETS_INFO_INTERNAL
FASTCALL
AfdGetTpInfoFast (
ULONG ElementCount
);
#ifdef _AFD_VARIABLE_STACK_
#define AfdGetTpInfo(_e,_c) \
(((_e)->TransportInfo->GetTpInfo)(_c))
PAFD_TPACKETS_INFO_INTERNAL
FASTCALL
AfdGetTpInfoWithMaxStackSize (
ULONG ElementCount
);
#else //_AFD_VARIABLE_STACK_
#define AfdGetTpInfo(_e,_c) AfdGetTpInfoFast(_c)
#endif //_AFD_VARIABLE_STACK_
ULONG
AfdComputeTpInfoSize (
ULONG ElementCount,
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
);
BOOLEAN
AfdEnqueueTpSendIrp (
PAFD_ENDPOINT Endpoint,
PIRP SendIrp,
BOOLEAN AfdIrp
);
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
AfdSanHelperCleanup (
PAFD_ENDPOINT SanHlprEndpoint
);
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 PULONG_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 PULONG_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 PULONG_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 PULONG_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 PULONG_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 PULONG_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 PULONG_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 PULONG_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 PULONG_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 PULONG_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 PULONG_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 PULONG_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
AfdSanRestartRequestProcessing (
PAFD_ENDPOINT Endpoint,
NTSTATUS Status
);
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))
#ifdef TDI_SERVICE_ADDRESS_SECURITY
#define IS_TDI_ADDRESS_SECURITY(endp) \
((BOOLEAN)(((endp)->TdiServiceFlags&TDI_SERVICE_ADDRESS_SECURITY)!=0))
#else
#define IS_TDI_ADDRESS_SECURITY(endp) \
FALSE
#endif
#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
//
// Do interlocked to have a memory barrier (on both x86 and IA64)
//
#define AFD_END_STATE_CHANGE(endp) \
InterlockedExchange(&(endp)->StateChangeInProgress,0)
#endif
LOGICAL
FORCEINLINE
AfdPreventStateChange (
PAFD_ENDPOINT Endpoint
)
{
LONG state;
do {
state = Endpoint->StateChangeInProgress;
}
while (state<=0 &&
InterlockedCompareExchange (
&Endpoint->StateChangeInProgress,
state-1,
state)!=state);
return (state<=0);
}
#define AFD_PREVENT_STATE_CHANGE(endp) AfdPreventStateChange(endp)
#if DBG
#define AFD_REALLOW_STATE_CHANGE(endp) \
ASSERT (InterlockedIncrement(&(endp)->StateChangeInProgress)<=0)
#else
#define AFD_REALLOW_STATE_CHANGE(endp) \
InterlockedIncrement(&(endp)->StateChangeInProgress)
#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
#if DBG
#define AFD_ALLOCATE_POOL(a,b,t) AfdAllocatePool( a,b,t,__FILE__,__LINE__,FALSE,LowPoolPriority )
#define AFD_ALLOCATE_POOL_WITH_QUOTA(a,b,t) AfdAllocatePool( (a)|POOL_RAISE_IF_ALLOCATION_FAILURE,b,t,__FILE__,__LINE__,TRUE,LowPoolPriority )
#define AFD_ALLOCATE_POOL_PRIORITY(a,b,t,p) AfdAllocatePool( a,b,t,__FILE__,__LINE__,FALSE,p )
PVOID
AfdAllocatePool (
IN POOL_TYPE PoolType,
IN SIZE_T NumberOfBytes,
IN ULONG Tag,
IN PCHAR FileName,
IN ULONG LineNumber,
IN BOOLEAN WithQuota,
IN EX_POOL_PRIORITY Priority
);
#define AFD_FREE_POOL(a,t) AfdFreePool(a,t)
VOID
AfdFreePool (
IN PVOID Pointer,
IN ULONG Tag
);
BOOLEAN
AfdRecordOutstandingIrpDebug (
IN PAFD_ENDPOINT Endpoint,
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PCHAR FileName,
IN ULONG LineNumber
);
#define AfdRecordOutstandingIrp(a,b,c) \
AfdRecordOutstandingIrpDebug(a,b,c,__FILE__,__LINE__)
#ifdef _AFD_VARIABLE_STACK_
#define AfdIoCallDriver(_e,_d,_i) \
(AfdRecordOutstandingIrp(_e,_d,_i) \
? ((_e)->TransportInfo->CallDriver)(_d,_i) \
: STATUS_INSUFFICIENT_RESOURCES \
)
#define AfdCheckStackSizeAndRecordOutstandingIrp(_e,_d,_i) \
( ((_i)->CurrentLocation>(_d)->StackSize) \
? (AfdRecordOutstandingIrp(_e,_d,_i) ? (_i) : (PIRP)NULL) \
: AfdGetStackIncreaseIrpAndRecordIt(_e,_d,_i,__FILE__,__LINE__) \
)
#else // _AFD_VARIABLE_STACK_
#define AfdIoCallDriver(_e,_d,_i) \
(AfdRecordOutstandingIrp(_e,_d,_i) \
? IoCallDriver(_d,_i) \
: STATUS_INSUFFICIENT_RESOURCES \
)
#endif // _AFD_VARIABLE_STACK_
#define AfdCompleteOutstandingIrp(_e,_i) \
AfdCompleteOutstandingIrpDebug(_e,_i)
VOID
AfdCompleteOutstandingIrpDebug (
IN PAFD_ENDPOINT Endpoint,
IN PIRP Irp
);
#ifdef AFDDBG_QUOTA
VOID
AfdRecordQuotaHistory(
IN PEPROCESS Process,
IN LONG Bytes,
IN PSZ Type,
IN PVOID Block
);
#else
#define AfdRecordQuotaHistory(a,b,c,d)
#endif
extern ULONG AfdLocksAcquired;
//
// Queued spinlock wrappers - perform basic validation
//
#define AfdAcquireSpinLock(a,b) \
ASSERT(AfdLoaded); (b)->SpinLock=(a); KeAcquireInStackQueuedSpinLock(&(a)->ActualSpinLock,&((b)->LockHandle)); AfdLocksAcquired++
#define AfdReleaseSpinLock(a,b) \
AfdLocksAcquired--; ASSERT ((b)->SpinLock==(a)); ASSERT( AfdLoaded ); KeReleaseInStackQueuedSpinLock(&((b)->LockHandle));
#define AfdAcquireSpinLockAtDpcLevel(a,b) \
ASSERT( AfdLoaded ); (b)->SpinLock=(a); KeAcquireInStackQueuedSpinLockAtDpcLevel(&(a)->ActualSpinLock,&((b)->LockHandle)); AfdLocksAcquired++
#define AfdReleaseSpinLockFromDpcLevel(a,b) \
AfdLocksAcquired--; ASSERT ((b)->SpinLock==(a)); ASSERT( AfdLoaded ); KeReleaseInStackQueuedSpinLockFromDpcLevel(&((b)->LockHandle))
#define AfdInitializeSpinLock(a) \
KeInitializeSpinLock(&(a)->ActualSpinLock)
//
// Define our own assert so that we can actually catch assertion failures
// when running a checked AFD on a free kernel.
//
VOID
AfdAssert(
PVOID FailedAssertion,
PVOID FileName,
ULONG LineNumber,
PCHAR Message
);
#undef ASSERT
#define ASSERT( exp ) \
if (!(exp)) \
AfdAssert( #exp, __FILE__, __LINE__, NULL )
#undef ASSERTMSG
#define ASSERTMSG( msg, exp ) \
if (!(exp)) \
AfdAssert( #exp, __FILE__, __LINE__, msg )
#define AFD_EXCEPTION_FILTER_NO_STATUS() \
AfdExceptionFilter( \
(LPSTR)__FILE__, \
(LONG)__LINE__, \
GetExceptionInformation(), \
NULL \
)
#define AFD_EXCEPTION_FILTER(_s) \
AfdExceptionFilter( \
(LPSTR)__FILE__, \
(LONG)__LINE__, \
GetExceptionInformation(), \
&_s \
)
#else // !DBG
#define AFD_ALLOCATE_POOL(a,b,t) ExAllocatePoolWithTagPriority(a,b,t,LowPoolPriority)
#define AFD_ALLOCATE_POOL_WITH_QUOTA(a,b,t) ExAllocatePoolWithQuotaTag((a)|POOL_RAISE_IF_ALLOCATION_FAILURE,b,t)
#define AFD_ALLOCATE_POOL_PRIORITY(a,b,t,p) ExAllocatePoolWithTagPriority(a,b,t,p)
#define AFD_FREE_POOL(a,t) MyFreePoolWithTag(a,t)
#define AfdRecordOutstandingIrp(_e,_d,_i) \
(InterlockedIncrement(&((_e)->OutstandingIrpCount)), TRUE)
#ifdef _AFD_VARIABLE_STACK_
#define AfdIoCallDriver(_e,_d,_i) \
(AfdRecordOutstandingIrp(_e,_d,_i), ((_e)->TransportInfo->CallDriver) (_d,_i))
#define AfdCheckStackSizeAndRecordOutstandingIrp(_e,_d,_i) \
( ((_i)->CurrentLocation>(_d)->StackSize) \
? (InterlockedIncrement(&((_e)->OutstandingIrpCount)),_i) \
: AfdGetStackIncreaseIrpAndRecordIt(_e,_d,_i) \
)
#else // _AFD_VARIABLE_STACK_
#define AfdIoCallDriver(_e,_d,_i) \
(AfdRecordOutstandingIrp(_e,_d,_i), IoCallDriver (_d,_i))
#endif
#define AfdCompleteOutstandingIrp(_e,_i) \
InterlockedDecrement(&((_e)->OutstandingIrpCount))
#define AfdRecordQuotaHistory(a,b,c,d)
#define AfdAcquireSpinLock(a,b) KeAcquireInStackQueuedSpinLock(&(a)->ActualSpinLock,(b))
#define AfdReleaseSpinLock(a,b) KeReleaseInStackQueuedSpinLock((b))
#define AfdAcquireSpinLockAtDpcLevel(a,b) KeAcquireInStackQueuedSpinLockAtDpcLevel(&(a)->ActualSpinLock,(b))
#define AfdReleaseSpinLockFromDpcLevel(a,b) KeReleaseInStackQueuedSpinLockFromDpcLevel((b))
#define AfdInitializeSpinLock(a) \
KeInitializeSpinLock(&(a)->ActualSpinLock)
#define AFD_EXCEPTION_FILTER_NO_STATUS() \
EXCEPTION_EXECUTE_HANDLER
#define AFD_EXCEPTION_FILTER(_s) \
AfdExceptionFilter( \
GetExceptionInformation(), \
&_s \
)
#endif // def DBG
#if DBG || REFERENCE_DEBUG
VOID
AfdInitializeDebugData(
VOID
);
VOID
AfdFreeDebugData (
VOID
);
#endif
#endif // ndef _AFDPROCS_