214 lines
5.9 KiB
C
214 lines
5.9 KiB
C
//+-------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) 1992, Microsoft Corporation.
|
|
//
|
|
// File: FILOBSUP.C
|
|
//
|
|
// Contents: This module implements the Dfs File object support routines.
|
|
//
|
|
// Functions: DfsSetFileObject - associate internal data structs to file obj
|
|
// DfsDecodeFileObject - get internal structures from file obj
|
|
//
|
|
// History: 12 Nov 1991 AlanW Created from CDFS souce.
|
|
// 02 Mar 1993 AlanW Added association of DFS_FCBs with
|
|
// file objects (without actually
|
|
// modifying fscontext fields).
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
#include "dfsprocs.h"
|
|
#include "fcbsup.h"
|
|
|
|
//
|
|
// The debug trace level
|
|
//
|
|
|
|
#define Dbg (DEBUG_TRACE_FILOBSUP)
|
|
|
|
#ifdef ALLOC_PRAGMA
|
|
#pragma alloc_text ( PAGE, DfsSetFileObject )
|
|
#pragma alloc_text ( PAGE, DfsDecodeFileObject )
|
|
#endif // ALLOC_PRAGMA
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Function: DfsSetFileObject, public
|
|
//
|
|
// Synopsis: This routine sets the file system pointers within the
|
|
// file object
|
|
//
|
|
// Arguments: [FileObject] -- the file object being modified.
|
|
// [TypeOfOpen] -- Supplies the type of open denoted by
|
|
// the file object. This is only used by this
|
|
// procedure for sanity checking.
|
|
// [VcbOrFcb] -- Supplies a pointer to either a DFS_VCB or DFS_FCB.
|
|
//
|
|
// Returns: None.
|
|
//
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
VOID
|
|
DfsSetFileObject (
|
|
IN PFILE_OBJECT FileObject,
|
|
IN TYPE_OF_OPEN TypeOfOpen,
|
|
IN PVOID VcbOrFcb
|
|
) {
|
|
DfsDbgTrace(+1, Dbg, "DfsSetFileObject, FileObject = %08lx\n", FileObject);
|
|
|
|
ASSERT( TypeOfOpen == RedirectedFileOpen
|
|
&& NodeType( VcbOrFcb ) == DSFS_NTC_FCB
|
|
&& ((PDFS_FCB) VcbOrFcb)->FileObject == FileObject
|
|
|
|
||
|
|
|
|
(TypeOfOpen == UserVolumeOpen
|
|
|| TypeOfOpen == LogicalRootDeviceOpen)
|
|
&& NodeType( VcbOrFcb ) == DSFS_NTC_VCB
|
|
|
|
||
|
|
|
|
TypeOfOpen == FilesystemDeviceOpen
|
|
&& NodeType( VcbOrFcb ) == IO_TYPE_DEVICE
|
|
|
|
||
|
|
|
|
TypeOfOpen == UnopenedFileObject );
|
|
|
|
|
|
|
|
//
|
|
// Now set the fscontext fields of the file object
|
|
//
|
|
|
|
if ( ARGUMENT_PRESENT( FileObject )) {
|
|
ASSERT( DfsLookupFcb(FileObject) == NULL );
|
|
|
|
if (TypeOfOpen == RedirectedFileOpen) {
|
|
DfsAttachFcb(FileObject, (PDFS_FCB) VcbOrFcb);
|
|
} else {
|
|
FileObject->FsContext = VcbOrFcb;
|
|
FileObject->FsContext2 = NULL;
|
|
}
|
|
}
|
|
|
|
//
|
|
// And return to our caller
|
|
//
|
|
|
|
DfsDbgTrace(-1, Dbg, "DfsSetFileObject -> VOID\n", 0);
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Function: DfsDecodeFileObject, public
|
|
//
|
|
// Synopsis: This procedure takes a pointer to a file object, that
|
|
// has already been opened by the Dsfs file system and
|
|
// figures out what really is opened.
|
|
//
|
|
// Arguments: [FileObject] -- Supplies the file object pointer being
|
|
// interrogated
|
|
// [ppVcb] -- Receives a pointer to the Vcb for the file object.
|
|
// [ppFcb] -- Receives a pointer to the Fcb for the
|
|
// file object, if one exists.
|
|
//
|
|
// Returns: [TYPE_OF_OPEN] - returns the type of file denoted by the
|
|
// input file object.
|
|
//
|
|
// FilesystemDeviceOpen -
|
|
//
|
|
// LogicalRootDeviceOpen -
|
|
//
|
|
// RedirectedFileOpen - The FO represents a user's opened file or
|
|
// directory which must be passed through to some other
|
|
// FSD. Fcb, Vcb are set. Fcb points to an Fcb.
|
|
//
|
|
//--------------------------------------------------------------------
|
|
|
|
TYPE_OF_OPEN
|
|
DfsDecodeFileObject (
|
|
IN PFILE_OBJECT FileObject,
|
|
OUT PDFS_VCB *ppVcb,
|
|
OUT PDFS_FCB *ppFcb
|
|
) {
|
|
TYPE_OF_OPEN TypeOfOpen;
|
|
PVOID FsContext = FileObject->FsContext;
|
|
PDFS_FCB pFcb;
|
|
|
|
DfsDbgTrace(+1, Dbg, "DfsDecodeFileObject, FileObject = %08lx\n",
|
|
FileObject);
|
|
|
|
//
|
|
// Zero out the out pointer parameters.
|
|
//
|
|
|
|
*ppFcb = NULL;
|
|
*ppVcb = NULL;
|
|
|
|
//
|
|
// Attempt to look up the associated DFS_FCB in the lookaside table.
|
|
// If it's there, the open type must be RedirectedFileOpen.
|
|
//
|
|
|
|
pFcb = DfsLookupFcb(FileObject);
|
|
if (pFcb != NULL) {
|
|
*ppFcb = pFcb;
|
|
*ppVcb = pFcb->Vcb;
|
|
|
|
ASSERT(pFcb->TargetDevice != NULL);
|
|
TypeOfOpen = RedirectedFileOpen;
|
|
|
|
DfsDbgTrace(0, Dbg, "DfsDecodeFileObject, Fcb = %08x\n", pFcb);
|
|
DfsDbgTrace(-1, Dbg, "DfsDecodeFileObject -> %x\n", TypeOfOpen);
|
|
return TypeOfOpen;
|
|
}
|
|
|
|
//
|
|
// Special case the situation where FsContext is null
|
|
//
|
|
|
|
if ( FsContext == NULL ) {
|
|
|
|
TypeOfOpen = UnopenedFileObject;
|
|
|
|
} else {
|
|
|
|
//
|
|
// Now we can case on the node type code of the fscontext pointer
|
|
// and set the appropriate out pointers
|
|
//
|
|
|
|
switch ( NodeType( FsContext )) {
|
|
|
|
case IO_TYPE_DEVICE:
|
|
|
|
TypeOfOpen = FilesystemDeviceOpen;
|
|
break;
|
|
|
|
case DSFS_NTC_VCB:
|
|
*ppVcb = (PDFS_VCB) FsContext;
|
|
|
|
TypeOfOpen = LogicalRootDeviceOpen;
|
|
break;
|
|
|
|
default:
|
|
TypeOfOpen = UnknownOpen;
|
|
}
|
|
}
|
|
|
|
//
|
|
// and return to our caller
|
|
//
|
|
|
|
DfsDbgTrace(-1, Dbg, "DfsDecodeFileObject -> %x\n", TypeOfOpen);
|
|
|
|
return TypeOfOpen;
|
|
}
|