windows-nt/Source/XPSP1/NT/base/fs/rdr2/rdbss/smb.mrx/csc.h
2020-09-26 16:20:57 +08:00

446 lines
10 KiB
C

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