windows-nt/Source/XPSP1/NT/base/fs/mailslot/filobsup.c

193 lines
3.9 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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;
}