WindowsXP-SP1/base/fs/mup/dfsfilob.c
2020-09-30 16:53:49 +02:00

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