|
|
//+-------------------------------------------------------------------------
//
// 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; }
|