231 lines
7.4 KiB
C
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
|
|
);
|
|
|
|
|