193 lines
3.9 KiB
C
193 lines
3.9 KiB
C
/*++
|
||
|
||
Copyright (c) 1989 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
filobsup.c
|
||
|
||
Abstract:
|
||
|
||
This module implements the mailslot file object support routines.
|
||
|
||
Author:
|
||
|
||
Manny Weiser (mannyw) 10-Jan-1991
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "mailslot.h"
|
||
|
||
//
|
||
// The debug trace level
|
||
//
|
||
|
||
#define Dbg (DEBUG_TRACE_FILOBSUP)
|
||
|
||
#ifdef ALLOC_PRAGMA
|
||
#pragma alloc_text( PAGE, MsDecodeFileObject )
|
||
#pragma alloc_text( PAGE, MsSetFileObject )
|
||
#endif
|
||
|
||
VOID
|
||
MsSetFileObject (
|
||
IN PFILE_OBJECT FileObject OPTIONAL,
|
||
IN PVOID FsContext,
|
||
IN PVOID FsContext2
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine sets the file system pointers within the file object.
|
||
|
||
Arguments:
|
||
|
||
FileObject - Supplies a pointer to the file object being modified, and
|
||
can optionally be null.
|
||
|
||
FsContext - Supplies a pointer to either a ccb, fcb, vcb, or root_dcb
|
||
structure.
|
||
|
||
FsContext2 - Supplies a pointer to a root_dcb_ccb, or is null.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
NODE_TYPE_CODE nodeType;
|
||
|
||
PAGED_CODE();
|
||
DebugTrace(+1, Dbg, "MsSetFileObject, FileObject = %08lx\n", (ULONG)FileObject );
|
||
|
||
//
|
||
// Set the fscontext fields of the file object.
|
||
//
|
||
|
||
FileObject->FsContext = FsContext;
|
||
FileObject->FsContext2 = FsContext2;
|
||
|
||
//
|
||
// Set the mailslot flag in the file object if necessary and return.
|
||
//
|
||
|
||
if (FsContext != NULL) {
|
||
nodeType = NodeType(FsContext);
|
||
|
||
if (nodeType == MSFS_NTC_CCB || nodeType == MSFS_NTC_FCB) {
|
||
FileObject->Flags |= FO_MAILSLOT;
|
||
}
|
||
}
|
||
|
||
DebugTrace(-1, Dbg, "MsSetFileObject -> VOID\n", 0);
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
NODE_TYPE_CODE
|
||
MsDecodeFileObject (
|
||
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 mailslot file system 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:
|
||
|
||
NODE_TYPE_CODE - Returns the node type code for a Vcb, RootDcb, Ccb,
|
||
or zero.
|
||
|
||
Vcb - indicates that file object opens the mailslot driver.
|
||
|
||
RootDcb - indicates that the file object is for the root directory.
|
||
|
||
Ccb - indicates that the file object is for a mailslot file.
|
||
|
||
Zero - indicates that the file object was for a mailslot file
|
||
but has been closed.
|
||
|
||
--*/
|
||
|
||
{
|
||
NODE_TYPE_CODE NodeTypeCode = NTC_UNDEFINED;
|
||
|
||
PAGED_CODE();
|
||
DebugTrace(+1, Dbg, "MsDecodeFileObject, FileObject = %08lx\n", (ULONG)FileObject);
|
||
|
||
|
||
//
|
||
// 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;
|
||
|
||
//
|
||
// Acquire the global lock to protect the node reference counts.
|
||
//
|
||
|
||
MsAcquireGlobalLock();
|
||
|
||
if ( ((PNODE_HEADER)(*FsContext))->NodeState != NodeStateActive ) {
|
||
|
||
//
|
||
// This node is shutting down. Indicate this to the caller.
|
||
//
|
||
|
||
NodeTypeCode = NTC_UNDEFINED;
|
||
|
||
} else {
|
||
|
||
//
|
||
// The node is active. Supply a referenced pointer to the node.
|
||
//
|
||
|
||
NodeTypeCode = NodeType( *FsContext );
|
||
MsReferenceNode( ((PNODE_HEADER)(*FsContext)) );
|
||
|
||
}
|
||
|
||
//
|
||
// Release the global lock and return to the caller.
|
||
//
|
||
|
||
MsReleaseGlobalLock();
|
||
|
||
DebugTrace(0,
|
||
DEBUG_TRACE_REFCOUNT,
|
||
"Referencing block %08lx\n",
|
||
(ULONG)*FsContext);
|
||
DebugTrace(0,
|
||
DEBUG_TRACE_REFCOUNT,
|
||
" Reference count = %lx\n",
|
||
((PNODE_HEADER)(*FsContext))->ReferenceCount );
|
||
|
||
DebugTrace(-1, Dbg, "MsDecodeFileObject -> %08lx\n", NodeTypeCode);
|
||
|
||
return NodeTypeCode;
|
||
}
|