/*++ 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_