windows-nt/Source/XPSP1/NT/base/fs/srv/srvfsd.h

419 lines
8.6 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
srvfsd.h
Abstract:
This module defines routines in the File System Driver for the LAN
Manager server.
Author:
Chuck Lenzmeier (chuckl) 1-Dec-1989
Revision History:
--*/
#ifndef _SRVFSD_
#define _SRVFSD_
//#include "srvblock.h"
#include "wmilib.h"
typedef struct _DEVICE_EXTENSION {
PDEVICE_OBJECT pDeviceObject;
ULONG TestCounter;
WMILIB_CONTEXT WmiLibContext;
} DEVICE_EXTENSION, * PDEVICE_EXTENSION;
typedef enum _tagSrvWmiEvents {
EVENT_TYPE_SMB_CREATE_DIRECTORY,
EVENT_TYPE_SMB_DELETE_DIRECTORY,
EVENT_TYPE_SMB_OPEN,
EVENT_TYPE_SMB_CREATE,
EVENT_TYPE_SMB_CLOSE,
EVENT_TYPE_SMB_FLUSH,
EVENT_TYPE_SMB_DELETE,
EVENT_TYPE_SMB_RENAME,
EVENT_TYPE_SMB_QUERY_INFORMATION,
EVENT_TYPE_SMB_SET_INFORMATION,
EVENT_TYPE_SMB_READ,
EVENT_TYPE_SMB_WRITE,
EVENT_TYPE_SMB_LOCK_BYTE_RANGE,
EVENT_TYPE_SMB_UNLOCK_BYTE_RANGE,
EVENT_TYPE_SMB_CREATE_TEMPORARY,
EVENT_TYPE_SMB_CHECK_DIRECTORY,
EVENT_TYPE_SMB_PROCESS_EXIT,
EVENT_TYPE_SMB_SEEK,
EVENT_TYPE_SMB_LOCK_AND_READ,
EVENT_TYPE_SMB_SET_INFORMATION2,
EVENT_TYPE_SMB_QUERY_INFORMATION2,
EVENT_TYPE_SMB_LOCKING_AND_X,
EVENT_TYPE_SMB_TRANSACTION,
EVENT_TYPE_SMB_TRANSACTION_SECONDARY,
EVENT_TYPE_SMB_IOCTL,
EVENT_TYPE_SMB_IOCTL_SECONDARY,
EVENT_TYPE_SMB_MOVE,
EVENT_TYPE_SMB_ECHO,
EVENT_TYPE_SMB_OPEN_AND_X,
EVENT_TYPE_SMB_READ_AND_X,
EVENT_TYPE_SMB_WRITE_AND_X,
EVENT_TYPE_SMB_FIND_CLOSE2,
EVENT_TYPE_SMB_FIND_NOTIFY_CLOSE,
EVENT_TYPE_SMB_TREE_CONNECT,
EVENT_TYPE_SMB_TREE_DISCONNECT,
EVENT_TYPE_SMB_NEGOTIATE,
EVENT_TYPE_SMB_SESSION_SETUP_AND_X,
EVENT_TYPE_SMB_LOGOFF_AND_X,
EVENT_TYPE_SMB_TREE_CONNECT_AND_X,
EVENT_TYPE_SMB_QUERY_INFORMATION_DISK,
EVENT_TYPE_SMB_SEARCH,
EVENT_TYPE_SMB_NT_TRANSACTION,
EVENT_TYPE_SMB_NT_TRANSACTION_SECONDARY,
EVENT_TYPE_SMB_NT_CREATE_AND_X,
EVENT_TYPE_SMB_NT_CANCEL,
EVENT_TYPE_SMB_OPEN_PRINT_FILE,
EVENT_TYPE_SMB_CLOSE_PRINT_FILE,
EVENT_TYPE_SMB_GET_PRINT_QUEUE,
EVENT_TYPE_SMB_READ_RAW,
EVENT_TYPE_SMB_WRITE_RAW,
EVENT_TYPE_SMB_READ_MPX,
EVENT_TYPE_SMB_WRITE_MPX,
EVENT_TYPE_SMB_WRITE_MPX_SECONDARY,
EVENT_TYPE_SMB_OPEN2,
EVENT_TYPE_SMB_FIND_FIRST2,
EVENT_TYPE_SMB_FIND_NEXT2,
EVENT_TYPE_SMB_QUERY_FS_INFORMATION,
EVENT_TYPE_SMB_SET_FS_INFORMATION,
EVENT_TYPE_SMB_QUERY_PATH_INFORMATION,
EVENT_TYPE_SMB_SET_PATH_INFORMATION,
EVENT_TYPE_SMB_QUERY_FILE_INFORMATION,
EVENT_TYPE_SMB_SET_FILE_INFORMATION,
EVENT_TYPE_SMB_FSCTL,
EVENT_TYPE_SMB_IOCTL2,
EVENT_TYPE_SMB_FIND_NOTIFY,
EVENT_TYPE_SMB_CREATE_DIRECTORY2,
EVENT_TYPE_SMB_GET_DFS_REFERRALS,
EVENT_TYPE_SMB_REPORT_DFS_INCONSISTENCY,
EVENT_TYPE_SMB_CREATE_WITH_SD_OR_EA,
EVENT_TYPE_SMB_NT_IOCTL,
EVENT_TYPE_SMB_SET_SECURITY_DESCRIPTOR,
EVENT_TYPE_SMB_NT_NOTIFY_CHANGE,
EVENT_TYPE_SMB_NT_RENAME,
EVENT_TYPE_SMB_QUERY_SECURITY_DESCRIPTOR,
EVENT_TYPE_SMB_QUERY_QUOTA,
EVENT_TYPE_SMB_SET_QUOTA,
EVENT_TYPE_SMB_LAST_EVENT
} SrvWmiEvents;
// WMI Dispatch routine
//
void
SrvWmiInitContext(
PWORK_CONTEXT WorkContext
);
void
SrvWmiStartContext(
PWORK_CONTEXT WorkContext
);
void
SrvWmiEndContext(
PWORK_CONTEXT WorkContext
);
void
SrvWmiTraceEvent(
PWORK_CONTEXT WorkContext
);
NTSTATUS
SrvWmiDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
//
// FSD dispatch routine.
//
NTSTATUS
SrvFsdDispatch (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
//
// FSD I/O completion routine
//
NTSTATUS
SrvFsdIoCompletionRoutine (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
//
// FSD TDI send completion routine
//
NTSTATUS
SrvFsdSendCompletionRoutine (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
//
// FSD Oplock request completion routine
//
NTSTATUS
SrvFsdOplockCompletionRoutine (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
//
// FSD transport Connect indication handler
//
NTSTATUS
SrvFsdTdiConnectHandler (
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
);
//
// FSD transport Disconnect indication handler
//
NTSTATUS
SrvFsdTdiDisconnectHandler (
IN PVOID TdiEventContext,
IN CONNECTION_CONTEXT ConnectionContext,
IN int DisconnectDataLength,
IN PVOID DisconnectData,
IN int DisconnectInformationLength,
IN PVOID DisconnectInformation,
IN ULONG DisconnectFlags
);
//
// FSD transport Receive indication handler
//
NTSTATUS
SrvFsdTdiReceiveHandler (
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
);
VOID
SrvPnpBindingHandler (
IN TDI_PNP_OPCODE PnpOpcode,
IN PUNICODE_STRING DeviceName,
IN PWSTR MultiSZBindList
);
NTSTATUS
SrvPnpPowerHandler (
IN PUNICODE_STRING DeviceName,
IN PNET_PNP_EVENT PnPEvent,
IN PTDI_PNP_CONTEXT Context1,
IN PTDI_PNP_CONTEXT Context2
);
//
// Routine to get a work item from the free list. Wakes the resource
// thread if the list is getting empty.
//
PWORK_CONTEXT SRVFASTCALL
SrvFsdGetReceiveWorkItem (
PWORK_QUEUE queue
);
//
// If a workitem could not be allocated, SrvServiceWorkItemShortage() is called
// when the next workitem is freed
//
VOID SRVFASTCALL
SrvServiceWorkItemShortage (
IN PWORK_CONTEXT WorkContext
);
//
// If we have detected a DoS attack, the workitem will trigger a teardown
//
VOID SRVFASTCALL
SrvServiceDoSTearDown (
IN PWORK_CONTEXT WorkContext
);
//
// Routine to queue an EX work item to an EX worker thread.
//
#define SrvFsdQueueExWorkItem(_item,_running,_type) { \
if ( !*(_running) ) { \
*(_running) = TRUE; \
ObReferenceObject( SrvDeviceObject ); \
ExQueueWorkItem( (_item), (_type) ); \
} \
}
//
// SMB processing support routines.
//
VOID SRVFASTCALL
SrvFsdRequeueReceiveWorkItem (
IN OUT PWORK_CONTEXT WorkContext
);
VOID SRVFASTCALL
SrvFsdRestartSmbComplete (
IN OUT PWORK_CONTEXT WorkContext
);
VOID
SrvFsdServiceNeedResourceQueue (
IN PWORK_CONTEXT *WorkContext,
IN PKIRQL OldIrql
);
//
// SMB processing restart routines referenced by the FSP.
//
VOID SRVFASTCALL
SrvFsdRestartRead (
IN OUT PWORK_CONTEXT WorkContext
);
VOID SRVFASTCALL
SrvFsdRestartReadAndX (
IN OUT PWORK_CONTEXT WorkContext
);
VOID SRVFASTCALL
SrvFsdRestartReadAndXCompressed (
IN OUT PWORK_CONTEXT WorkContext
);
VOID SRVFASTCALL
SrvFsdRestartWrite (
IN OUT PWORK_CONTEXT WorkContext
);
VOID SRVFASTCALL
SrvFsdRestartWriteAndX (
IN OUT PWORK_CONTEXT WorkContext
);
VOID SRVFASTCALL
IpxRestartStartSendOnCorrectProcessor (
IN OUT PWORK_CONTEXT WorkContext
);
VOID SRVFASTCALL
SrvFsdRestartLargeReadAndX (
IN OUT PWORK_CONTEXT WorkContext
);
//
// Resource shortage routines.
//
BOOLEAN
SrvAddToNeedResourceQueue (
IN PCONNECTION Connection,
IN RESOURCE_TYPE ResourceType,
IN PRFCB Rfcb OPTIONAL
);
VOID
SrvCheckForAndQueueDoS(
PWORK_QUEUE queue
);
//
// Send Completion Routines
//
NTSTATUS
SrvFsdRestartSmbAtSendCompletion (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PWORK_CONTEXT WorkContext
);
NTSTATUS
SrvQueueWorkToFspAtSendCompletion (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PWORK_CONTEXT WorkContext
);
NTSTATUS
SrvFsdRestartSendOplockIItoNone(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN OUT PWORK_CONTEXT WorkContext
);
NTSTATUS
RequeueIpxWorkItemAtSendCompletion (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN OUT PWORK_CONTEXT WorkContext
);
NTSTATUS
RestartCopyReadMpxComplete (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN OUT PWORK_CONTEXT WorkContext
);
NTSTATUS
RestartCopyReadRawResponse (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN OUT PWORK_CONTEXT WorkContext
);
VOID
SrvpNotifyChangesToNetBt(
IN TDI_PNP_OPCODE PnPOpcode,
IN PUNICODE_STRING DeviceName,
IN PWSTR MultiSZBindList);
#endif // ndef _SRVFSD_