446 lines
10 KiB
C
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__
|
|
|
|
|