/*++ Copyright (c) 1989 Microsoft Corporation Module Name: Csc.h Abstract: This module defines the clientside cacheing interface for the SMB mini rdr. Author: Joe Linn [JoeLinn] 7-Mar-1995 Revision History: --*/ #include "dfsfsctl.h" #ifndef __INCLUDED__SMBMRX_CSC__ #define __INCLUDED__SMBMRX_CSC__ extern BOOLEAN MRxSmbIsCscEnabled; extern BOOLEAN MRxSmbIsCscEnabledForDisconnected; extern BOOLEAN MRxSmbCscTransitionEnabledByDefault; extern BOOLEAN MRxSmbEnableDisconnectedRB; extern BOOLEAN MRxSmbCscAutoDialEnabled; extern LONG vcntTransportsForCSC; #define Shared_SmbFcbAcquire SmbFcb_HeldShared #define Exclusive_SmbFcbAcquire SmbFcb_HeldExclusive #define DroppingFcbLock_SmbFcbAcquire 0x80000000 #define FailImmediately_SmbFcbAcquire 0x40000000 //STATUS_DISCONNECTED is supposed to be server_internal but it's defined in privinc\status.h //don't use it!!!! #undef STATUS_DISCONNECTED #define STATUSx_NOT_IMPLEMENTED_FOR_DISCONNECTED (STATUS_NOT_IMPLEMENTED) #ifdef MRXSMB_BUILD_FOR_CSC #define MRXSMB_CSC_SYMLINK_NAME L"\\??\\Shadow" #define IF_NOT_MRXSMB_CSC_ENABLED if(FALSE) extern LONG MRxSmbSpecialCopyChunkAllocationSizeMarker; NTKERNELAPI NTSTATUS IoGetRequestorSessionId( PIRP Irp, PULONG pSessionId); NTSTATUS MRxSmbInitializeCSC ( PUNICODE_STRING SmbMiniRedirectorName ); VOID MRxSmbUninitializeCSC ( void ); NTSTATUS MRxSmbCscIoCtl ( IN OUT PRX_CONTEXT RxContext ); NTSTATUS MRxSmbCscAcquireSmbFcb ( IN OUT PRX_CONTEXT RxContext, IN ULONG TypeOfAcquirePlusFlags, OUT SMBFCB_HOLDING_STATE *SmbFcbHoldingState ); VOID MRxSmbCscReleaseSmbFcb ( IN OUT PRX_CONTEXT RxContext, IN SMBFCB_HOLDING_STATE *SmbFcbHoldingState ); NTSTATUS MRxSmbCscReadPrologue ( IN OUT PRX_CONTEXT RxContext, OUT SMBFCB_HOLDING_STATE *SmbFcbHoldingState ); VOID MRxSmbCscReadEpilogue ( IN OUT PRX_CONTEXT RxContext, IN OUT PNTSTATUS Status ); NTSTATUS MRxSmbCscWritePrologue ( IN OUT PRX_CONTEXT RxContext, OUT SMBFCB_HOLDING_STATE *SmbFcbHoldingState ); VOID MRxSmbCscWriteEpilogue ( IN OUT PRX_CONTEXT RxContext, IN OUT PNTSTATUS Status ); VOID MRxSmbCscSetFileInfoEpilogue ( IN OUT PRX_CONTEXT RxContext, IN OUT PNTSTATUS Status ); BOOLEAN MRxSmbCscIsThisACopyChunkOpen ( IN PRX_CONTEXT RxContext, IN BOOLEAN *lpfAgentOpen ); NTSTATUS MRxSmbCscPartOfCreateVNetRoot ( IN PRX_CONTEXT RxContext, IN OUT PMRX_NET_ROOT NetRoot ); NTSTATUS MRxSmbCscCreatePrologue ( IN OUT PRX_CONTEXT RxContext, OUT SMBFCB_HOLDING_STATE *SmbFcbHoldingState ); VOID MRxSmbCscCreateEpilogue ( IN OUT PRX_CONTEXT RxContext, IN OUT PNTSTATUS Status, IN SMBFCB_HOLDING_STATE *SmbFcbHoldingState ); VOID MRxSmbCscDeleteAfterCloseEpilogue ( IN OUT PRX_CONTEXT RxContext, IN OUT PNTSTATUS Status ); VOID MRxSmbCscRenameEpilogue ( IN OUT PRX_CONTEXT RxContext, IN OUT PNTSTATUS Status ); VOID MRxSmbCscCloseShadowHandle ( IN OUT PRX_CONTEXT RxContext ); VOID MRxSmbCscUpdateShadowFromClose ( SMBPSE_ORDINARY_EXCHANGE_ARGUMENT_SIGNATURE ); VOID MRxSmbCscTearDownCscNetRoot ( IN OUT PSMBCEDB_NET_ROOT_ENTRY pNetRootEntry ); VOID MRxSmbCscDeallocateForFcb ( IN OUT PMRX_FCB pFcb ); VOID MRxSmbCscAgentSynchronizationOnStart ( IN OUT PRX_CONTEXT RxContext ); VOID MRxSmbCscAgentSynchronizationOnStop ( IN OUT PRX_CONTEXT RxContext ); VOID MRxSmbCscSignalNetStatus( BOOLEAN NetPresent, BOOLEAN fFirstLast ); VOID MRxSmbCscReleaseRxContextFromAgentWait ( void ); VOID MRxSmbCscReportFileOpens ( void ); NTSTATUS MRxSmbCscSetSecurityPrologue ( IN OUT PRX_CONTEXT RxContext ); VOID MRxSmbCscSetSecurityEpilogue ( IN OUT PRX_CONTEXT RxContext, IN OUT PNTSTATUS Status ); BOOLEAN CscIsServerOffline( PWCHAR ServerName); NTSTATUS CscTakeServerOffline( PWCHAR ServerName); NTSTATUS CscTransitionServerToOnline( ULONG hServer); NTSTATUS CscTransitionServerToOffline( ULONG SessionId, ULONG hServer, ULONG TransitionStatus); NTSTATUS CscTransitionServerEntryForDisconnectedOperation( PSMBCEDB_SERVER_ENTRY pServerEntry, PRX_CONTEXT pRxContext, NTSTATUS RemoteStatus, BOOLEAN fInvokeAutoDial ); VOID CscPrepareServerEntryForOnlineOperationFull( PSMBCEDB_SERVER_ENTRY pServerEntry); VOID CscPrepareServerEntryForOnlineOperationPartial( PSMBCEDB_SERVER_ENTRY pServerEntry); NTSTATUS CscTransitionVNetRootForDisconnectedOperation( PRX_CONTEXT RxContext, PMRX_V_NET_ROOT pVNetRoot, NTSTATUS RemoteStatus); BOOLEAN CscPerformOperationInDisconnectedMode( PRX_CONTEXT RxContext); BOOLEAN CscGetServerNameWaitingToGoOffline( OUT PWCHAR ServerName, IN OUT LPDWORD lpdwBufferSize, OUT NTSTATUS *lpStatus ); BOOLEAN CscShareIdToShareName( IN ULONG hShare, OUT PWCHAR ServerName, IN OUT LPDWORD lpdwBufferSize, OUT NTSTATUS *lpStatus ); NTSTATUS CscPreProcessCreateIrp( PIRP pIrp); NTSTATUS MRxSmbCscNotifyChangeDirectory( IN OUT PRX_CONTEXT RxContext ); NTSTATUS MRxSmbCscCleanupFobx( IN PRX_CONTEXT RxContext ); NTSTATUS MRxSmbCscInitializeNetRootEntry( PSMBCEDB_NET_ROOT_ENTRY pNetRootEntry ); VOID MRxSmbCscUninitializeNetRootEntry( PSMBCEDB_NET_ROOT_ENTRY pNetRootEntry ); NTSTATUS CscInitializeServerEntryDfsRoot( PRX_CONTEXT pRxContext, PSMBCEDB_SERVER_ENTRY pServerEntry ); PDFS_NAME_CONTEXT CscIsValidDfsNameContext( PVOID pFsContext); BOOL CSCCheckLocalOpens( PRX_CONTEXT pRxContext ); #else #ifdef MRXSMB_BUILD_FOR_CSC_DCON #error....no build-for-csc-dcon w/o build-for-csc #undef MRXSMB_BUILD_FOR_CSC_DCON #endif //ifdef MRXSMB_BUILD_FOR_CSC_DCON #define IF_MRXSMB_CSC_ENABLED if(FALSE) #define IF_NOT_MRXSMB_CSC_ENABLED if(TRUE) #define MRxSmbInitializeCSC(__name) (STATUS_SUCCESS) #define MRxSmbUninitializeCSC() {NOTHING;} #define MRxSmbCscIoCtl(__rxcontext) (STATUS_INVALID_DEVICE_REQUEST) #define MRxSmbCscReleaseSmbFcb(__rxcontext,__holdstate) {NOTHING;} #define MRxSmbCscAcquireSmbFcb(__rxcontext,__flags,__holdstate) (STATUS_SUCCESS) #define MRxSmbCscReadPrologue(__rxcontext,__holdstate) (STATUS_MORE_PROCESSING_REQUIRED) #define MRxSmbCscReadEpilogue(__rxcontext,__status) {NOTHING;} #define MRxSmbCscWritePrologue(__rxcontext,__holdstate) (STATUS_MORE_PROCESSING_REQUIRED) #define MRxSmbCscWriteEpilogue(__rxcontext,__status) {NOTHING;} #define MRxSmbCscSetFileInfoEpilogue(__rxcontext,__status) {NOTHING;} #define MRxSmbCscIsThisACopyChunkOpen(__rxcontext) (FALSE) #define MRxSmbCscPartOfCreateVNetRoot(__rxcontext,__netroot) (STATUS_NOT_IMPLEMENTED) #define MRxSmbCscCreatePrologue(__rxcontext,__holdstate) (STATUS_MORE_PROCESSING_REQUIRED) #define MRxSmbCscCreateEpilogue(__rxcontext,__status,_holdstate) {NOTHING;} #define MRxSmbCscDeleteAfterCloseEpilogue(__rxcontext,__status) {NOTHING;} #define MRxSmbCscRenameEpilogue(__rxcontext,__status) {NOTHING;} #define MRxSmbCscCloseShadowHandle(__rxcontext) {NOTHING;} // this is interesting....altho there's 2 args to the function...it's // only one in macro land......... #define MRxSmbCscUpdateShadowFromClose(__SMBPSE_OE_ARGS) {NOTHING;} #define MRxSmbCscTearDownCscNetRoot(__smbnetrootentry) {NOTHING;} #define MRxSmbCscDeallocateForFcb(pFcb) {NOTHING;} #define MRxSmbCscAgentSynchronizationOnStart(__rxc) {NOTHING;} #define MRxSmbCscAgentSynchronizationOnStop(__rxc) {NOTHING;} #define MRxSmbCscSignalNetStatus(__Flags) {NOTHING}; #define MRxSmbCscReleaseRxContextFromAgentWait(__unsetflags) {NOTHING;} #define MRxSmbCscReportFileOpens() {NOTHING;} #define CscTransitionServerEntryForDisconnectedOperation(__serverentry,__status) {NOTHING;} #define CscTransitionNetRootEntryForDisconnectedOperation(__serverentry,__netrootentry,__status) {NOTHING;} #define CscPerformOperationInDisconnectedMode(__rxcontext) FALSE #define CscPreProcessCreateIrp(__Irp__) STATUS_SUCCESS #endif //ifdef MRXSMB_BUILD_FOR_CSC #ifdef MRXSMB_BUILD_FOR_CSC_DCON #define IF_MRXSMB_BUILD_FOR_DISCONNECTED_CSC if(TRUE) #define IF_NOT_MRXSMB_BUILD_FOR_DISCONNECTED_CSC if(FALSE) NTSTATUS MRxSmbCscNegotiateDisconnected( PSMBCEDB_SERVER_ENTRY pServerEntry ); VOID MRxSmbCscUninitForTranportSurrogate( PSMBCEDB_SERVER_ENTRY pServerEntry ); VOID MRxSmbCscInitForTranportSurrogate( PSMBCEDB_SERVER_ENTRY pServerEntry, PNTSTATUS Status ); NTSTATUS MRxSmbCscDisconnectedConnect ( IN OUT PSMB_CONSTRUCT_NETROOT_EXCHANGE pNetRootExchange ); NTSTATUS MRxSmbDCscExtendForCache ( IN OUT struct _RX_CONTEXT * RxContext, IN PLARGE_INTEGER pNewFileSize, OUT PLARGE_INTEGER pNewAllocationSize ); NTSTATUS MRxSmbDCscFlush ( IN OUT struct _RX_CONTEXT * RxContext ); NTSTATUS MRxSmbDCscQueryVolumeInformation ( IN OUT struct _RX_CONTEXT * RxContext ); NTSTATUS MRxSmbDCscQueryDirectory ( IN OUT struct _RX_CONTEXT * RxContext ); NTSTATUS MRxSmbDCscQueryFileInfo ( IN OUT struct _RX_CONTEXT * RxContext ); NTSTATUS MRxSmbDCscSetFileInfo ( IN OUT struct _RX_CONTEXT * RxContext ); NTSTATUS MRxSmbDCscIsValidDirectory( IN OUT struct _RX_CONTEXT *RxContext, IN PUNICODE_STRING DirectoryName); #else #define SmbCscCeIsSpecialCscTransport(pServerEntry) (FALSE) #define IF_MRXSMB_BUILD_FOR_DISCONNECTED_CSC if(FALSE) #define IF_NOT_MRXSMB_BUILD_FOR_DISCONNECTED_CSC if(TRUE) #define MRxSmbCscNegotiateDisconnected(__se) (STATUS_INVALID_HANDLE) #define MRxSmbCscUninitForTranportSurrogate(__se) {NOTHING;} #define MRxSmbCscInitForTranportSurrogate(__se,__status) {NOTHING;} #define MRxSmbCscDisconnectedConnect(__cnrex) (STATUS_SUCCESS) #define MRxSmbDCscExtendForCache(__rxcontext,__a,__b) ((STATUS_MORE_PROCESSING_REQUIRED)) #define MRxSmbDCscFlush(__rxcontext) ((STATUS_MORE_PROCESSING_REQUIRED)) #define MRxSmbDCscQueryVolumeInformation(__rxcontext) ((STATUS_MORE_PROCESSING_REQUIRED)) #define MRxSmbDCscQueryDirectory(__rxcontext) ((STATUS_MORE_PROCESSING_REQUIRED)) #define MRxSmbDCscQueryFileInfo(__rxcontext) ((STATUS_MORE_PROCESSING_REQUIRED)) #define MRxSmbDCscSetFileInfo(__rxcontext) ((STATUS_MORE_PROCESSING_REQUIRED)) #define MRxSmbDCscIsValidDirectory(__rxcontext, _directory_name) ((STATUS_MORE_PROCESSING_REQUIRED)) #endif //ifdef MRXSMB_BUILD_FOR_CSC_DCON #endif //ifndef __INCLUDED__SMBMRX_CSC__