windows-nt/Source/XPSP1/NT/base/fs/mup/dnr.h
2020-09-26 16:20:57 +08:00

231 lines
7.4 KiB
C

//+-------------------------------------------------------------------------
//
// Copyright (C) 1992, Microsoft Corporation.
//
// File: dnr.h
//
// Contents: Definitions for distributed name resolution context
//
// History: 26 May 1992 Alanw Created
// 04 Sep 1992 Milans Added support for replica selection
//
//--------------------------------------------------------------------------
#include "rpselect.h"
//
// Maximum number of times we'll go around the main loop in DnrResolveName.
//
#define MAX_DNR_ATTEMPTS 16
// The following define a Name resolution context which describes the
// state of an ongoing name resolution. A pointer to this context is
// used as the argument to a DPC which will initiate the next step of
// name resolution.
typedef enum {
DnrStateEnter = 0,
DnrStateStart, // Start or restart nameres process
DnrStateGetFirstDC, // contact a dc, so that we can...
DnrStateGetReferrals, // ask knowledge server for referral
DnrStateGetNextDC,
DnrStateCompleteReferral, // waiting for I/O completion of referral req.
DnrStateSendRequest, // requesting Open, ResolveName, etc.
DnrStatePostProcessOpen, // resume Dnr after call to provider
DnrStateGetFirstReplica, // select the first server.
DnrStateGetNextReplica, // a server failed, select another
DnrStateSvcListCheck, // exhausted svc list, see if svc list changed
DnrStateDone, // done, complete the IRP
DnrStateLocalCompletion = 101 // like done, small optimization
} DNR_STATE;
typedef struct _DNR_CONTEXT {
//
// The type and size of this record (must be DSFS_NTC_DNR_CONTEXT)
//
NODE_TYPE_CODE NodeTypeCode;
NODE_BYTE_SIZE NodeByteSize;
DNR_STATE State; // State of name resolution
SECURITY_CLIENT_CONTEXT SecurityContext; // Security context of caller.
PDFS_PKT_ENTRY pPktEntry; // pointer to locked PKT entry
ULONG USN; // USN of pPktEntry when we cached it
PDFS_SERVICE pService; // pointer to file service being used
PPROVIDER_DEF pProvider; // Same as pService->pProvider
//
// The Provider Defs are protected by DfsData.Resource. We don't want
// to hold this (or any other) resource when going over the net. So, we
// cache that part of the provider def that we need to use upon returning
// from the network call.
//
USHORT ProviderId;
PDEVICE_OBJECT TargetDevice;
//
// Since we don't want to hold any locks while going over the net,
// we need to reference the authenticated tree connection to the server
// we will send the open request to.
//
PFILE_OBJECT AuthConn;
// The pService field is protected by Pkt.Resource. Again, we don't want
// to hold this resource when going over the net. However, we need to
// use pService->ConnFile to send a referral request. So, we reference
// and cache the pService->ConnFile in the DnrContext, release the Pkt,
// then send the referral request over the cached DCConnFile.
//
PFILE_OBJECT DCConnFile;
PDFS_CREDENTIALS Credentials; // Credentials to use during Dnr
PIRP_CONTEXT pIrpContext; // associated IRP context
PIRP OriginalIrp; // original IRP we started with
NTSTATUS FinalStatus; // status to complete IRP with
PDFS_FCB FcbToUse; // If DNR succeeds, FCB to use.
PDFS_VCB Vcb; // associated DFS_VCB
// The DFS_NAME_CONTEXT instance is required to be passed down to all
// the underlying providers. The FileName is the first field in the
// DFS_NAME_CONTEXT as well.
// This overlaying facilitates the manipulation of DFS_NAME_CONTEXT
UNICODE_STRING FileName; // file name being processed
union {
UNICODE_STRING ContextFileName; // file name being processed
DFS_NAME_CONTEXT DfsNameContext; // the Dfs name context to be passed down
};
UNICODE_STRING RemainingPart; // remaining part of file name
UNICODE_STRING SavedFileName; // The one that came with the file
PFILE_OBJECT SavedRelatedFileObject; // object.
USHORT NewNameLen; // Length of translated name.
REPL_SELECT_CONTEXT RSelectContext; // Context for replica selection
REPL_SELECT_CONTEXT RDCSelectContext; // Context for DC replica selection
ULONG ReferralSize; // size of buffer needed for referral
unsigned int Attempts; // number of name resolution attempts
BOOLEAN ReleasePkt; // if TRUE, Pkt resource must be freed
BOOLEAN DnrActive; // if TRUE, DnrNameResolve active on this context
BOOLEAN GotReferral; // if TRUE, last action was a referral
BOOLEAN FoundInconsistency; // if TRUE, last referral involved
// inconsistencies in it.
BOOLEAN CalledDCLocator;// if TRUE, we have already called locator
BOOLEAN Impersonate; // if TRUE, we need to impersonate using SecurityToken
BOOLEAN NameAllocated; // if TRUE, FileName.Buffer was allocated separately
BOOLEAN GotReparse; // if TRUE, the a non-mup redir returned STATUS_REPARSE
BOOLEAN CachedConnFile; // if TRUE, the connfile connection was a cached one
PDEVICE_OBJECT DeviceObject;
LARGE_INTEGER StartTime;
PDFS_TARGET_INFO pDfsTargetInfo;
PDFS_TARGET_INFO pNewTargetInfo;
} DNR_CONTEXT, *PDNR_CONTEXT;
//
// The initial length of a referral requested over the network.
//
#define MAX_REFERRAL_LENGTH PAGE_SIZE
//
// The max length we'll go for a referral
//
#define MAX_REFERRAL_MAX (0xe000)
typedef struct DFS_OFFLINE_SERVER {
UNICODE_STRING LogicalServerName;
LIST_ENTRY ListEntry;
} DFS_OFFLINE_SERVER, *PDFS_OFFLINE_SERVER;
extern BOOLEAN MupUseNullSessionForDfs;
//
// Prototypes for functions in dnr.c
//
NTSTATUS
DnrStartNameResolution(
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp,
IN PDFS_VCB Vcb
);
NTSTATUS
DnrNameResolve(
IN PDNR_CONTEXT DnrContext
);
VOID
DnrComposeFileName(
OUT PUNICODE_STRING FullName,
IN PDFS_VCB Vcb,
IN PFILE_OBJECT RelatedFile,
IN PUNICODE_STRING FileName
);
NTSTATUS
DfsCreateConnection(
IN PDFS_SERVICE pService,
IN PPROVIDER_DEF pProvider,
IN BOOLEAN CSCAgentCreate,
OUT PHANDLE handle
);
NTSTATUS
DfsCloseConnection(
IN PDFS_SERVICE pService
);
BOOLEAN
DnrConcatenateFilePath (
IN PUNICODE_STRING Dest,
IN PWSTR RemainingPath,
IN USHORT Length
);
PIRP
DnrBuildFsControlRequest (
IN PFILE_OBJECT FileObject OPTIONAL,
IN PVOID Context,
IN ULONG IoControlCode,
IN PVOID MainBuffer,
IN ULONG InputBufferLength,
IN PVOID AuxiliaryBuffer OPTIONAL,
IN ULONG OutputBufferLength,
IN PIO_COMPLETION_ROUTINE CompletionRoutine
);
NTSTATUS
DfspIsRootOnline(
PUNICODE_STRING Name,
BOOLEAN CSCAgentCreate
);
NTSTATUS
DfspMarkServerOffline(
PUNICODE_STRING ServerName
);
NTSTATUS
DfspMarkServerOnline(
PUNICODE_STRING ServerName
);
PLIST_ENTRY
DfspGetOfflineEntry(
PUNICODE_STRING ServerName
);