183 lines
3.7 KiB
C
183 lines
3.7 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1989 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
filobsup.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module implements the mup file object support routines.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Manny Weiser (mannyw) 20-Dec-1991
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "mup.h"
|
|||
|
|
|||
|
//
|
|||
|
// The debug trace level
|
|||
|
//
|
|||
|
|
|||
|
#define Dbg (DEBUG_TRACE_FILOBSUP)
|
|||
|
|
|||
|
#ifdef ALLOC_PRAGMA
|
|||
|
#pragma alloc_text( PAGE, MupDecodeFileObject )
|
|||
|
#pragma alloc_text( PAGE, MupSetFileObject )
|
|||
|
#endif
|
|||
|
|
|||
|
VOID
|
|||
|
MupSetFileObject (
|
|||
|
IN PFILE_OBJECT FileObject OPTIONAL,
|
|||
|
IN PVOID FsContext,
|
|||
|
IN PVOID FsContext2
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine sets the file system pointers within the file object.
|
|||
|
This routine MUST be called with the Global Lock held.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
FileObject - Supplies a pointer to the file object being modified, and
|
|||
|
can optionally be null.
|
|||
|
|
|||
|
FsContext - Supplies a pointer to the vcb.
|
|||
|
structure.
|
|||
|
|
|||
|
FsContext2 - NULL
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PAGED_CODE();
|
|||
|
DebugTrace(+1, Dbg, "MupSetFileObject, FileObject = %08lx\n", (ULONG)FileObject );
|
|||
|
|
|||
|
//
|
|||
|
// Set the fscontext fields of the file object.
|
|||
|
//
|
|||
|
|
|||
|
FileObject->FsContext = FsContext;
|
|||
|
FileObject->FsContext2 = FsContext2;
|
|||
|
|
|||
|
DebugTrace(-1, Dbg, "MupSetFileObject -> VOID\n", 0);
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BLOCK_TYPE
|
|||
|
MupDecodeFileObject (
|
|||
|
IN PFILE_OBJECT FileObject,
|
|||
|
OUT PVOID *FsContext,
|
|||
|
OUT PVOID *FsContext2
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This procedure takes a pointer to a file object, that has already been
|
|||
|
opened by the MUP and figures out what it really is opened.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
FileObject - Supplies the file object pointer being interrogated
|
|||
|
|
|||
|
FsContext - Receive the file object FsContext pointer
|
|||
|
|
|||
|
FsContext2 - Receive the file object FsContext2 pointer
|
|||
|
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
BlockType - Returns the node type code for a Vcb or Fcb.
|
|||
|
|
|||
|
Vcb - indicates that file object opens the mup driver.
|
|||
|
|
|||
|
Ccb - indicates that the file object is for a broadcast mailslot file.
|
|||
|
|
|||
|
Zero - indicates that the file object has been closed.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
BLOCK_TYPE blockType;
|
|||
|
PBLOCK_HEADER pBlockHead;
|
|||
|
|
|||
|
PAGED_CODE();
|
|||
|
DebugTrace(+1, Dbg, "MupDecodeFileObject, FileObject = %08lx\n", (ULONG)FileObject);
|
|||
|
|
|||
|
//
|
|||
|
// Acquire the global lock to protect the block reference counts.
|
|||
|
//
|
|||
|
|
|||
|
MupAcquireGlobalLock();
|
|||
|
|
|||
|
//
|
|||
|
// Read the fs FsContext fields of the file object, then reference
|
|||
|
// the block pointed at by the file object
|
|||
|
//
|
|||
|
|
|||
|
*FsContext = FileObject->FsContext;
|
|||
|
*FsContext2 = FileObject->FsContext2;
|
|||
|
|
|||
|
ASSERT( (*FsContext) != NULL );
|
|||
|
|
|||
|
if ((*FsContext) == NULL) {
|
|||
|
|
|||
|
blockType = BlockTypeUndefined;
|
|||
|
}
|
|||
|
else {
|
|||
|
pBlockHead = (PBLOCK_HEADER)(*FsContext);
|
|||
|
if ( ((pBlockHead->BlockType != BlockTypeVcb) &&
|
|||
|
(pBlockHead->BlockType != BlockTypeFcb)) ||
|
|||
|
((pBlockHead->BlockState != BlockStateActive) &&
|
|||
|
(pBlockHead->BlockState != BlockStateClosing)) ) {
|
|||
|
*FsContext = NULL;
|
|||
|
blockType = BlockTypeUndefined;
|
|||
|
} else {
|
|||
|
|
|||
|
//
|
|||
|
// The node is active. Supply a referenced pointer to the node.
|
|||
|
//
|
|||
|
|
|||
|
blockType = BlockType( pBlockHead );
|
|||
|
MupReferenceBlock( pBlockHead );
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Release the global lock and return to the caller.
|
|||
|
//
|
|||
|
|
|||
|
MupReleaseGlobalLock();
|
|||
|
|
|||
|
DebugTrace(0,
|
|||
|
DEBUG_TRACE_REFCOUNT,
|
|||
|
"Referencing block %08lx\n",
|
|||
|
(ULONG)*FsContext);
|
|||
|
DebugTrace(0,
|
|||
|
DEBUG_TRACE_REFCOUNT,
|
|||
|
" Reference count = %lx\n",
|
|||
|
((PBLOCK_HEADER)(*FsContext))->ReferenceCount );
|
|||
|
|
|||
|
DebugTrace(-1, Dbg, "MupDecodeFileObject -> %08lx\n", blockType);
|
|||
|
|
|||
|
return blockType;
|
|||
|
}
|
|||
|
|