592 lines
16 KiB
C
592 lines
16 KiB
C
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
afdstr.h
|
|
|
|
Abstract:
|
|
|
|
This module contains typedefs for structures used by AFD.
|
|
|
|
Author:
|
|
|
|
David Treadwell (davidtr) 21-Feb-1992
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _AFDSTR_
|
|
#define _AFDSTR_
|
|
|
|
#ifndef REFERENCE_DEBUG
|
|
#if DBG
|
|
#define REFERENCE_DEBUG 1
|
|
#define GLOBAL_REFERENCE_DEBUG 0
|
|
#else
|
|
#define REFERENCE_DEBUG 0
|
|
#define GLOBAL_REFERENCE_DEBUG 0
|
|
#endif
|
|
#endif
|
|
|
|
#if REFERENCE_DEBUG
|
|
|
|
#define MAX_REFERENCE 64
|
|
|
|
typedef struct _AFD_REFERENCE_DEBUG {
|
|
PVOID Info1;
|
|
PVOID Info2;
|
|
ULONG Action;
|
|
ULONG NewCount;
|
|
} AFD_REFERENCE_DEBUG, *PAFD_REFERENCE_DEBUG;
|
|
|
|
#if GLOBAL_REFERENCE_DEBUG
|
|
#define MAX_GLOBAL_REFERENCE 4096
|
|
|
|
typedef struct _AFD_GLOBAL_REFERENCE_DEBUG {
|
|
PVOID Info1;
|
|
PVOID Info2;
|
|
ULONG Action;
|
|
ULONG NewCount;
|
|
PVOID Connection;
|
|
LARGE_INTEGER TickCounter;
|
|
PVOID Dummy;
|
|
} AFD_GLOBAL_REFERENCE_DEBUG, *PAFD_GLOBAL_REFERENCE_DEBUG;
|
|
#endif
|
|
|
|
#endif
|
|
|
|
//
|
|
// A structure for maintaining work queue information in AFD.
|
|
//
|
|
|
|
typedef struct _AFD_WORK_ITEM {
|
|
LIST_ENTRY WorkItemListEntry;
|
|
PWORKER_THREAD_ROUTINE AfdWorkerRoutine;
|
|
PVOID Context;
|
|
} AFD_WORK_ITEM, *PAFD_WORK_ITEM;
|
|
|
|
//
|
|
// Structures for holding connect data pointers and lengths. This is
|
|
// kept separate from the normal structures to save space in those
|
|
// structures for transports that do not support and applications
|
|
// which do not use connect data.
|
|
//
|
|
|
|
typedef struct _AFD_CONNECT_DATA_INFO {
|
|
PVOID Buffer;
|
|
ULONG BufferLength;
|
|
} AFD_CONNECT_DATA_INFO, *PAFD_CONNECT_DATA_INFO;
|
|
|
|
typedef struct _AFD_CONNECT_DATA_BUFFERS {
|
|
AFD_CONNECT_DATA_INFO SendConnectData;
|
|
AFD_CONNECT_DATA_INFO SendConnectOptions;
|
|
AFD_CONNECT_DATA_INFO ReceiveConnectData;
|
|
AFD_CONNECT_DATA_INFO ReceiveConnectOptions;
|
|
AFD_CONNECT_DATA_INFO SendDisconnectData;
|
|
AFD_CONNECT_DATA_INFO SendDisconnectOptions;
|
|
AFD_CONNECT_DATA_INFO ReceiveDisconnectData;
|
|
AFD_CONNECT_DATA_INFO ReceiveDisconnectOptions;
|
|
TDI_CONNECTION_INFORMATION TdiConnectionInfo;
|
|
} AFD_CONNECT_DATA_BUFFERS, *PAFD_CONNECT_DATA_BUFFERS;
|
|
|
|
//
|
|
// Structure used for holding disconnect context information.
|
|
//
|
|
|
|
struct _AFD_ENDPOINT;
|
|
struct _AFD_CONNECTION;
|
|
|
|
typedef struct _AFD_DISCONNECT_CONTEXT {
|
|
LIST_ENTRY DisconnectListEntry;
|
|
struct _AFD_ENDPOINT *Endpoint;
|
|
PTDI_CONNECTION_INFORMATION TdiConnectionInformation;
|
|
LARGE_INTEGER Timeout;
|
|
struct _AFD_CONNECTION *Connection;
|
|
PIRP Irp;
|
|
} AFD_DISCONNECT_CONTEXT, *PAFD_DISCONNECT_CONTEXT;
|
|
|
|
//
|
|
// Endpoint and connection structures and related informaion.
|
|
//
|
|
|
|
#define AfdBlockTypeEndpoint 0xAFD0
|
|
#define AfdBlockTypeVcConnecting 0xAFD1
|
|
#define AfdBlockTypeVcListening 0xAFD2
|
|
#define AfdBlockTypeDatagram 0xAFD3
|
|
#define AfdBlockTypeConnection 0xAFD4
|
|
#define AfdBlockTypeHelper 0xAFD5
|
|
|
|
#define IS_AFD_ENDPOINT_TYPE( endpoint ) \
|
|
( (endpoint)->Type == AfdBlockTypeEndpoint || \
|
|
(endpoint)->Type == AfdBlockTypeVcConnecting || \
|
|
(endpoint)->Type == AfdBlockTypeVcListening || \
|
|
(endpoint)->Type == AfdBlockTypeDatagram || \
|
|
(endpoint)->Type == AfdBlockTypeHelper )
|
|
|
|
#define AfdConnectionStateFree 0
|
|
#define AfdConnectionStateUnaccepted 1
|
|
#define AfdConnectionStateReturned 2
|
|
#define AfdConnectionStateConnected 3
|
|
#define AfdConnectionStateClosing 4
|
|
|
|
typedef struct _AFD_CONNECTION {
|
|
|
|
USHORT Type;
|
|
USHORT State;
|
|
LONG ReferenceCount;
|
|
|
|
LIST_ENTRY ListEntry;
|
|
HANDLE Handle;
|
|
PFILE_OBJECT FileObject;
|
|
LONGLONG ConnectTime;
|
|
|
|
union {
|
|
|
|
struct {
|
|
LARGE_INTEGER ReceiveBytesIndicated;
|
|
LARGE_INTEGER ReceiveBytesTaken;
|
|
LARGE_INTEGER ReceiveBytesOutstanding;
|
|
|
|
LARGE_INTEGER ReceiveExpeditedBytesIndicated;
|
|
LARGE_INTEGER ReceiveExpeditedBytesTaken;
|
|
LARGE_INTEGER ReceiveExpeditedBytesOutstanding;
|
|
BOOLEAN NonBlockingSendPossible;
|
|
BOOLEAN ZeroByteReceiveIndicated;
|
|
} Bufferring;
|
|
|
|
struct {
|
|
LIST_ENTRY ReceiveIrpListHead;
|
|
LIST_ENTRY ReceiveBufferListHead;
|
|
LIST_ENTRY SendIrpListHead;
|
|
|
|
CLONG BufferredReceiveBytes;
|
|
CLONG BufferredExpeditedBytes;
|
|
CSHORT BufferredReceiveCount;
|
|
CSHORT BufferredExpeditedCount;
|
|
|
|
CLONG ReceiveBytesInTransport;
|
|
CLONG BufferredSendBytes;
|
|
CSHORT ReceiveCountInTransport;
|
|
CSHORT BufferredSendCount;
|
|
|
|
PIRP DisconnectIrp;
|
|
} NonBufferring;
|
|
|
|
} Common;
|
|
|
|
struct _AFD_ENDPOINT *Endpoint;
|
|
|
|
CLONG MaxBufferredReceiveBytes;
|
|
CLONG MaxBufferredSendBytes;
|
|
CSHORT MaxBufferredReceiveCount;
|
|
CSHORT MaxBufferredSendCount;
|
|
|
|
PAFD_CONNECT_DATA_BUFFERS ConnectDataBuffers;
|
|
PEPROCESS OwningProcess;
|
|
PDEVICE_OBJECT DeviceObject;
|
|
PTRANSPORT_ADDRESS RemoteAddress;
|
|
ULONG RemoteAddressLength;
|
|
BOOLEAN DisconnectIndicated;
|
|
BOOLEAN AbortIndicated;
|
|
BOOLEAN TdiBufferring;
|
|
BOOLEAN ConnectedReferenceAdded;
|
|
BOOLEAN SpecialCondition;
|
|
BOOLEAN CleanupBegun;
|
|
BOOLEAN ClosePendedTransmit;
|
|
|
|
AFD_DISCONNECT_CONTEXT DisconnectContext;
|
|
AFD_WORK_ITEM WorkItem;
|
|
|
|
#if ENABLE_ABORT_TIMER_HACK
|
|
struct _AFD_ABORT_TIMER_INFO * AbortTimerInfo;
|
|
#endif // ENABLE_ABORT_TIMER_HACK
|
|
|
|
#if REFERENCE_DEBUG
|
|
LONG CurrentReferenceSlot;
|
|
ULONG Dummy1;
|
|
ULONG Dummy2;
|
|
AFD_REFERENCE_DEBUG ReferenceDebug[MAX_REFERENCE];
|
|
#endif
|
|
|
|
} AFD_CONNECTION, *PAFD_CONNECTION;
|
|
|
|
//
|
|
// Some macros that make code more readable.
|
|
//
|
|
|
|
#define VcNonBlockingSendPossible Common.Bufferring.NonBlockingSendPossible
|
|
#define VcZeroByteReceiveIndicated Common.Bufferring.ZeroByteReceiveIndicated
|
|
|
|
#define VcReceiveIrpListHead Common.NonBufferring.ReceiveIrpListHead
|
|
#define VcReceiveBufferListHead Common.NonBufferring.ReceiveBufferListHead
|
|
#define VcSendIrpListHead Common.NonBufferring.SendIrpListHead
|
|
|
|
#define VcBufferredReceiveBytes Common.NonBufferring.BufferredReceiveBytes
|
|
#define VcBufferredExpeditedBytes Common.NonBufferring.BufferredExpeditedBytes
|
|
#define VcBufferredReceiveCount Common.NonBufferring.BufferredReceiveCount
|
|
#define VcBufferredExpeditedCount Common.NonBufferring.BufferredExpeditedCount
|
|
|
|
#define VcReceiveBytesInTransport Common.NonBufferring.ReceiveBytesInTransport
|
|
#define VcReceiveCountInTransport Common.NonBufferring.ReceiveCountInTransport
|
|
|
|
#define VcBufferredSendBytes Common.NonBufferring.BufferredSendBytes
|
|
#define VcBufferredSendCount Common.NonBufferring.BufferredSendCount
|
|
|
|
#define VcDisconnectIrp Common.NonBufferring.DisconnectIrp
|
|
|
|
//
|
|
// Information stored about each transport device name for which there
|
|
// is an open endpoint.
|
|
//
|
|
|
|
typedef struct _AFD_TRANSPORT_INFO {
|
|
LIST_ENTRY TransportInfoListEntry;
|
|
UNICODE_STRING TransportDeviceName;
|
|
TDI_PROVIDER_INFO ProviderInfo;
|
|
//WCHAR TransportDeviceNameStructure;
|
|
} AFD_TRANSPORT_INFO, *PAFD_TRANSPORT_INFO;
|
|
|
|
//
|
|
// Endpoint state definitions.
|
|
//
|
|
|
|
#define AfdEndpointStateOpen 0
|
|
#define AfdEndpointStateBound 1
|
|
#define AfdEndpointStateListening 2
|
|
#define AfdEndpointStateConnected 3
|
|
#define AfdEndpointStateCleanup 4
|
|
#define AfdEndpointStateClosing 5
|
|
#define AfdEndpointStateTransmitClosing 6
|
|
#define AfdEndpointStateInvalid 7
|
|
|
|
typedef struct _AFD_ENDPOINT {
|
|
|
|
USHORT Type;
|
|
UCHAR State;
|
|
|
|
LONG ReferenceCount;
|
|
|
|
BOOLEAN NonBlocking;
|
|
BOOLEAN InLine;
|
|
BOOLEAN TdiBufferring;
|
|
|
|
LIST_ENTRY GlobalEndpointListEntry;
|
|
LIST_ENTRY ConstrainedEndpointListEntry;
|
|
AFD_ENDPOINT_TYPE EndpointType;
|
|
HANDLE AddressHandle;
|
|
PFILE_OBJECT AddressFileObject;
|
|
|
|
//
|
|
// Use a union to overlap the fields that are exclusive to datagram
|
|
// connecting, or listening endpoints. Since many fields are
|
|
// relevant to only one type of socket, it makes no sense to
|
|
// maintain the fields for all sockets--instead, save some nonpaged
|
|
// pool by combining them.
|
|
//
|
|
|
|
union {
|
|
|
|
//
|
|
// Information for circuit-based connected endpoints.
|
|
//
|
|
|
|
struct {
|
|
PAFD_CONNECTION Connection;
|
|
NTSTATUS ConnectStatus;
|
|
struct _AFD_ENDPOINT *ListenEndpoint;
|
|
} VcConnecting;
|
|
|
|
//
|
|
// Information for circuit-based listening endpoints.
|
|
//
|
|
|
|
struct {
|
|
LIST_ENTRY FreeConnectionListHead;
|
|
LIST_ENTRY UnacceptedConnectionListHead;
|
|
LIST_ENTRY ReturnedConnectionListHead;
|
|
LIST_ENTRY ListeningIrpListHead;
|
|
LONG FailedConnectionAdds;
|
|
LONG FreeConnectionCount;
|
|
LONG TdiAcceptPendingCount;
|
|
BOOLEAN EnableDynamicBacklog;
|
|
} VcListening;
|
|
|
|
//
|
|
// Information for datagram endpoints. Note that different
|
|
// information is kept depending on whether the underlying
|
|
// transport buffers internally.
|
|
//
|
|
|
|
struct {
|
|
PTRANSPORT_ADDRESS RemoteAddress;
|
|
ULONG RemoteAddressLength;
|
|
|
|
LIST_ENTRY ReceiveIrpListHead;
|
|
LIST_ENTRY PeekIrpListHead;
|
|
LIST_ENTRY ReceiveBufferListHead;
|
|
CLONG BufferredDatagramBytes;
|
|
CSHORT BufferredDatagramCount;
|
|
|
|
CLONG MaxBufferredReceiveBytes;
|
|
CLONG MaxBufferredSendBytes;
|
|
CSHORT MaxBufferredReceiveCount;
|
|
CSHORT MaxBufferredSendCount;
|
|
|
|
BOOLEAN CircularQueueing;
|
|
} Datagram;
|
|
|
|
} Common;
|
|
|
|
CLONG DisconnectMode;
|
|
CLONG OutstandingIrpCount;
|
|
PTRANSPORT_ADDRESS LocalAddress;
|
|
ULONG LocalAddressLength;
|
|
PVOID Context;
|
|
CLONG ContextLength;
|
|
KSPIN_LOCK SpinLock;
|
|
PEPROCESS OwningProcess;
|
|
PAFD_CONNECT_DATA_BUFFERS ConnectDataBuffers;
|
|
PIRP TransmitIrp;
|
|
struct _AFD_TRANSMIT_FILE_INFO_INTERNAL * TransmitInfo;
|
|
PDEVICE_OBJECT AddressDeviceObject;
|
|
PAFD_TRANSPORT_INFO TransportInfo;
|
|
BOOLEAN ConnectOutstanding;
|
|
BOOLEAN SendDisconnected;
|
|
BOOLEAN EndpointCleanedUp;
|
|
BOOLEAN TdiMessageMode;
|
|
BOOLEAN PollCalled;
|
|
|
|
AFD_WORK_ITEM WorkItem;
|
|
|
|
//
|
|
// EventSelect info.
|
|
//
|
|
|
|
PKEVENT EventObject;
|
|
ULONG EventsEnabled;
|
|
ULONG EventsDisabled;
|
|
ULONG EventsActive;
|
|
NTSTATUS EventStatus[AFD_NUM_POLL_EVENTS];
|
|
|
|
//
|
|
// Socket grouping.
|
|
//
|
|
|
|
LONG GroupID;
|
|
AFD_GROUP_TYPE GroupType;
|
|
|
|
//
|
|
// Debug stuff.
|
|
//
|
|
|
|
#if REFERENCE_DEBUG
|
|
PAFD_REFERENCE_DEBUG ReferenceDebug;
|
|
LONG CurrentReferenceSlot;
|
|
#endif
|
|
|
|
#if DBG
|
|
LIST_ENTRY OutstandingIrpListHead;
|
|
LONG ObReferenceBias;
|
|
#endif
|
|
|
|
} AFD_ENDPOINT, *PAFD_ENDPOINT;
|
|
|
|
//
|
|
// A couple of useful manifests that make code more readable.
|
|
//
|
|
|
|
#define ReceiveDatagramIrpListHead Common.Datagram.ReceiveIrpListHead
|
|
#define PeekDatagramIrpListHead Common.Datagram.PeekIrpListHead
|
|
#define ReceiveDatagramBufferListHead Common.Datagram.ReceiveBufferListHead
|
|
#define BufferredDatagramCount Common.Datagram.BufferredDatagramCount
|
|
#define BufferredDatagramBytes Common.Datagram.BufferredDatagramBytes
|
|
|
|
#define AFD_CONNECTION_FROM_ENDPOINT( endpoint ) \
|
|
( (endpoint)->Type == AfdBlockTypeVcConnecting ? \
|
|
(endpoint)->Common.VcConnecting.Connection : NULL )
|
|
|
|
//
|
|
// A structure which describes buffers used by AFD to perform bufferring
|
|
// for TDI providers which do not perform internal bufferring.
|
|
//
|
|
|
|
typedef struct _AFD_BUFFER {
|
|
union {
|
|
SINGLE_LIST_ENTRY SList; // for buffer lookaside lists
|
|
LIST_ENTRY BufferListEntry;// to place these structures on lists
|
|
};
|
|
PLIST_ENTRY BufferListHead; // the global list this buffer belongs to
|
|
struct _AFD_BUFFER *NextBuffer;// next buffer in chain
|
|
PVOID Buffer; // a pointer to the actual data buffer
|
|
CLONG BufferLength; // amount of space allocated for the buffer
|
|
CLONG DataLength; // actual data in the buffer
|
|
CLONG DataOffset; // offset in buffer to start of unread data
|
|
PIRP Irp; // pointer to the IRP associated w/the buffer
|
|
PMDL Mdl; // pointer to an MDL describing the buffer
|
|
PVOID Context; // stores context info
|
|
PVOID SourceAddress; // pointer to address of datagram sender
|
|
CLONG SourceAddressLength; // length of datagram sender's address
|
|
PFILE_OBJECT FileObject; // for fast-path TransmitFile
|
|
LONGLONG FileOffset; // for fast-path TransmitFile
|
|
ULONG ReadLength; // for fast-path TransmitFile
|
|
USHORT AllocatedAddressLength; // length allocated for address
|
|
BOOLEAN ExpeditedData; // TRUE if the buffer contains expedited data
|
|
BOOLEAN PartialMessage; // TRUE if this is a partial message
|
|
TDI_CONNECTION_INFORMATION TdiInputInfo; // holds info for TDI requests
|
|
TDI_CONNECTION_INFORMATION TdiOutputInfo; // holds info for TDI requests
|
|
#if DBG
|
|
CLONG TotalChainLength;
|
|
LIST_ENTRY DebugListEntry;
|
|
PVOID Caller;
|
|
PVOID CallersCaller;
|
|
#endif
|
|
// IRP Irp; // the IRP follows this structure
|
|
// MDL Mdl; // the MDL follows the IRP
|
|
// UCHAR Address[]; // address of datagram sender
|
|
// UCHAR Buffer[BufferLength]; // the actual data buffer is last
|
|
} AFD_BUFFER, *PAFD_BUFFER;
|
|
|
|
//
|
|
// Macros for making it easier to deal with the debug-only TotalChainLength
|
|
// AFD_BUFFER field.
|
|
//
|
|
|
|
#if DBG
|
|
#define SET_CHAIN_LENGTH(b,l) ((b)->TotalChainLength = (l))
|
|
#define RESET_CHAIN_LENGTH(b) ((b)->TotalChainLength = (b)->BufferLength)
|
|
#else
|
|
#define SET_CHAIN_LENGTH(b,l)
|
|
#define RESET_CHAIN_LENGTH(b)
|
|
#endif
|
|
|
|
//
|
|
// Internal information for the transmit file IOCTL. Note that
|
|
// this must be the same size as AFD_TRANSMIT_FILE_INFO in afd.h!!!!
|
|
//
|
|
|
|
typedef struct _AFD_TRANSMIT_IRP_INFO {
|
|
PIRP Irp;
|
|
PAFD_BUFFER AfdBuffer;
|
|
ULONG Length;
|
|
} AFD_TRANSMIT_IRP_INFO, *PAFD_TRANSMIT_IRP_INFO;
|
|
|
|
typedef struct _AFD_TRANSMIT_FILE_INFO_INTERNAL {
|
|
LONGLONG Offset;
|
|
LONGLONG FileWriteLength;
|
|
ULONG SendPacketLength;
|
|
HANDLE FileHandle;
|
|
PVOID Head;
|
|
ULONG HeadLength;
|
|
PVOID Tail;
|
|
ULONG TailLength;
|
|
ULONG Flags;
|
|
PVOID _Dummy;
|
|
LONGLONG TotalBytesToSend;
|
|
LONGLONG BytesRead;
|
|
LONGLONG BytesSent;
|
|
PFILE_OBJECT FileObject;
|
|
PDEVICE_OBJECT DeviceObject;
|
|
PFILE_OBJECT TdiFileObject;
|
|
PDEVICE_OBJECT TdiDeviceObject;
|
|
PIRP TransmitIrp;
|
|
PAFD_ENDPOINT Endpoint;
|
|
PMDL FileMdl;
|
|
PMDL HeadMdl;
|
|
PMDL TailMdl;
|
|
PMDL FirstFileMdlAfterHead;
|
|
PMDL LastFileMdlBeforeTail;
|
|
PIRP IrpUsedToSendTail;
|
|
ULONG FileMdlLength;
|
|
BOOLEAN ReadPending;
|
|
BOOLEAN CompletionPending;
|
|
BOOLEAN NeedToSendHead;
|
|
BOOLEAN Queued;
|
|
|
|
AFD_TRANSMIT_IRP_INFO Read;
|
|
AFD_TRANSMIT_IRP_INFO Send1;
|
|
AFD_TRANSMIT_IRP_INFO Send2;
|
|
|
|
WORK_QUEUE_ITEM WorkQueueItem;
|
|
|
|
#if DBG
|
|
BOOLEAN Completed;
|
|
ULONG ReadPendingLastSetTrueLine;
|
|
ULONG ReadPendingLastSetFalseLine;
|
|
PVOID Debug1;
|
|
PVOID Debug2;
|
|
#endif
|
|
|
|
} AFD_TRANSMIT_FILE_INFO_INTERNAL, *PAFD_TRANSMIT_FILE_INFO_INTERNAL;
|
|
|
|
//
|
|
// Pointer to an IRP cleanup routine. This is used as a parameter to
|
|
// AfdCompleteIrpList().
|
|
//
|
|
|
|
typedef
|
|
VOID
|
|
(NTAPI * PAFD_IRP_CLEANUP_ROUTINE)(
|
|
IN PIRP Irp
|
|
);
|
|
|
|
//
|
|
// Debug statistics.
|
|
//
|
|
|
|
typedef struct _AFD_QUOTA_STATS {
|
|
LARGE_INTEGER Charged;
|
|
LARGE_INTEGER Returned;
|
|
} AFD_QUOTA_STATS;
|
|
|
|
typedef struct _AFD_HANDLE_STATS {
|
|
LONG AddrOpened;
|
|
LONG AddrClosed;
|
|
LONG AddrRef;
|
|
LONG AddrDeref;
|
|
LONG ConnOpened;
|
|
LONG ConnClosed;
|
|
LONG ConnRef;
|
|
LONG ConnDeref;
|
|
LONG FileRef;
|
|
LONG FileDeref;
|
|
} AFD_HANDLE_STATS;
|
|
|
|
typedef struct _AFD_QUEUE_STATS {
|
|
LONG AfdWorkItemsQueued;
|
|
LONG ExWorkItemsQueued;
|
|
LONG WorkerEnter;
|
|
LONG WorkerLeave;
|
|
LONG AfdWorkItemsProcessed;
|
|
PETHREAD AfdWorkerThread;
|
|
} AFD_QUEUE_STATS;
|
|
|
|
typedef struct _AFD_CONNECTION_STATS {
|
|
LONG ConnectedReferencesAdded;
|
|
LONG ConnectedReferencesDeleted;
|
|
LONG GracefulDisconnectsInitiated;
|
|
LONG GracefulDisconnectsCompleted;
|
|
LONG GracefulDisconnectIndications;
|
|
LONG AbortiveDisconnectsInitiated;
|
|
LONG AbortiveDisconnectsCompleted;
|
|
LONG AbortiveDisconnectIndications;
|
|
} AFD_CONNECTION_STATS;
|
|
|
|
//
|
|
// Buffer for lookaside list descriptors. Lookaside list descriptors
|
|
// cannot be statically allocated, as they need to ALWAYS be nonpageable,
|
|
// even when the entire driver is paged out.
|
|
//
|
|
|
|
typedef struct _AFD_LOOKASIDE_LISTS {
|
|
NPAGED_LOOKASIDE_LIST WorkQueueList;
|
|
NPAGED_LOOKASIDE_LIST LargeBufferList;
|
|
NPAGED_LOOKASIDE_LIST MediumBufferList;
|
|
NPAGED_LOOKASIDE_LIST SmallBufferList;
|
|
} AFD_LOOKASIDE_LISTS, *PAFD_LOOKASIDE_LISTS;
|
|
|
|
#endif // ndef _AFDSTR_
|
|
|