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
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_
|
|
|