277 lines
6.1 KiB
C
277 lines
6.1 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1989 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
FilObSup.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module implements the Named Pipe File object support routines.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Gary Kimura [GaryKi] 30-Aug-1990
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "NpProcs.h"
|
|||
|
|
|||
|
//
|
|||
|
// The Bug check file id for this module
|
|||
|
//
|
|||
|
|
|||
|
#define BugCheckFileId (NPFS_BUG_CHECK_FILOBSUP)
|
|||
|
|
|||
|
//
|
|||
|
// The debug trace level
|
|||
|
//
|
|||
|
|
|||
|
#define Dbg (DEBUG_TRACE_FILOBSUP)
|
|||
|
|
|||
|
#ifdef ALLOC_PRAGMA
|
|||
|
#pragma alloc_text(PAGE, NpDecodeFileObject)
|
|||
|
#pragma alloc_text(PAGE, NpSetFileObject)
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
NpSetFileObject (
|
|||
|
IN PFILE_OBJECT FileObject OPTIONAL,
|
|||
|
IN PVOID FsContext,
|
|||
|
IN PVOID FsContext2,
|
|||
|
IN NAMED_PIPE_END NamedPipeEnd
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine sets the file system pointers within the file object
|
|||
|
and handles the indicator for storing the named pipe end.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
FileObject - Supplies a pointer to the file object being modified, and
|
|||
|
can optionally be null.
|
|||
|
|
|||
|
FsContext - Supplies a pointer to either a ccb, vcb, or root_dcb
|
|||
|
structure.
|
|||
|
|
|||
|
FsContext2 - Supplies a pointer to either a nonpaged ccb, root_dcb_ccb,
|
|||
|
or is null
|
|||
|
|
|||
|
NamedPipeEnd - Supplies the indication if this is either the server end
|
|||
|
or client end file object. This is only applicable if the
|
|||
|
fscontext points to a ccb.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
BOOLEAN GotCcb;
|
|||
|
|
|||
|
PAGED_CODE();
|
|||
|
|
|||
|
DebugTrace(+1, Dbg, "NpSetFileObject, FileObject = %08lx\n", FileObject );
|
|||
|
|
|||
|
//
|
|||
|
// If no file object was given, do nothing.
|
|||
|
//
|
|||
|
|
|||
|
if (ARGUMENT_PRESENT( FileObject )) {
|
|||
|
|
|||
|
//
|
|||
|
// Check if we need to add in the named pipe end to the
|
|||
|
// fscontext pointer. We only need to 'OR' in a 1 if this is
|
|||
|
// the server end and fscontext points to a ccb. Also remember
|
|||
|
// now if this is a pointer is a ccb, so that we can later set
|
|||
|
// the fo_named_pipe flag
|
|||
|
//
|
|||
|
|
|||
|
if ((FsContext != NULL) &&
|
|||
|
(*(PNODE_TYPE_CODE)FsContext == NPFS_NTC_CCB)) {
|
|||
|
|
|||
|
GotCcb = TRUE;
|
|||
|
|
|||
|
if (NamedPipeEnd == FILE_PIPE_SERVER_END) {
|
|||
|
|
|||
|
FsContext = (PVOID)((ULONG_PTR)FsContext | 0x00000001);
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
GotCcb = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Now set the fscontext fields of the file object, and conditionally
|
|||
|
// set the named pipe flag in the file object if necessary.
|
|||
|
//
|
|||
|
|
|||
|
FileObject->FsContext = FsContext;
|
|||
|
FileObject->FsContext2 = FsContext2;
|
|||
|
|
|||
|
//
|
|||
|
// Set the private cache map to 1 and that what we will get our
|
|||
|
// fast I/O routines called
|
|||
|
//
|
|||
|
|
|||
|
FileObject->PrivateCacheMap = (PVOID)1;
|
|||
|
|
|||
|
if (GotCcb) {
|
|||
|
|
|||
|
FileObject->Flags |= FO_NAMED_PIPE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// And return to our caller
|
|||
|
//
|
|||
|
|
|||
|
DebugTrace(-1, Dbg, "NpSetFileObject -> VOID\n", 0);
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
NODE_TYPE_CODE
|
|||
|
NpDecodeFileObject (
|
|||
|
IN PFILE_OBJECT FileObject,
|
|||
|
OUT PFCB *Fcb OPTIONAL,
|
|||
|
OUT PCCB *Ccb,
|
|||
|
OUT PNAMED_PIPE_END NamedPipeEnd OPTIONAL
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This procedure takes a pointer to a file object, that has already been
|
|||
|
opened by the named pipe file system and figures out what it really
|
|||
|
is opened.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
FileObject - Supplies the file object pointer being interrogated
|
|||
|
|
|||
|
Fcb - Receives a pointer to the Fcb for the file object, if we can
|
|||
|
find it.
|
|||
|
|
|||
|
Ccb - Receives a pointer to the Ccb for the file object, if we can
|
|||
|
find it
|
|||
|
|
|||
|
NamedPipeEnd - Receives a value indicating if this is a server
|
|||
|
or client end file object.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NODE_TYPE_CODE - Returns the node type code for a Vcb, RootDcb, Ccb,
|
|||
|
or zero.
|
|||
|
|
|||
|
Vcb - indicates that file object opens the named pipe driver.
|
|||
|
Fcb and Ccb are NOT returned.
|
|||
|
|
|||
|
RootDcb - indicates that the file object is for the root directory.
|
|||
|
Fcb (RootDcb), and Ccb (RootDcbCcb) are set.
|
|||
|
|
|||
|
Ccb - indicates that the file object is for a named pipe instance.
|
|||
|
Ccb is set, while Fcb is optionally set.
|
|||
|
|
|||
|
Zero - indicates that the file object was for a named pipe instance
|
|||
|
but became disconnected. Fcb, Ccb, and NamedPipeEnd are NOT
|
|||
|
returned.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
NODE_TYPE_CODE NodeTypeCode;
|
|||
|
PVOID FsContext;
|
|||
|
|
|||
|
PAGED_CODE();
|
|||
|
|
|||
|
DebugTrace(+1, Dbg, "NpDecodeFileObject, FileObject = %08lx\n", FileObject);
|
|||
|
|
|||
|
//
|
|||
|
// Reference the fs context fields of the file object.
|
|||
|
//
|
|||
|
|
|||
|
FsContext = FileObject->FsContext;
|
|||
|
|
|||
|
//
|
|||
|
// If the fscontext field is null then we been disconnected.
|
|||
|
//
|
|||
|
|
|||
|
if ((FsContext == NULL) || ((ULONG_PTR)FsContext == 1)) {
|
|||
|
|
|||
|
NodeTypeCode = NTC_UNDEFINED;
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
//
|
|||
|
// We're actually pointing to something so first extract the
|
|||
|
// named pipe end information and then we can reference through
|
|||
|
// the fscontext pointer after we clean it up.
|
|||
|
//
|
|||
|
|
|||
|
if (ARGUMENT_PRESENT(NamedPipeEnd)) {
|
|||
|
if (FlagOn((ULONG_PTR)FsContext, 0x00000001)) {
|
|||
|
*NamedPipeEnd = FILE_PIPE_SERVER_END;
|
|||
|
} else {
|
|||
|
*NamedPipeEnd = FILE_PIPE_CLIENT_END;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
FsContext = (PVOID)((ULONG_PTR)FsContext & ~0x00000001);
|
|||
|
|
|||
|
//
|
|||
|
// Now we can case on the node type code of the fscontext pointer
|
|||
|
// and set the appropriate out pointers
|
|||
|
//
|
|||
|
|
|||
|
NodeTypeCode = *(PNODE_TYPE_CODE)FsContext;
|
|||
|
|
|||
|
switch (NodeTypeCode) {
|
|||
|
|
|||
|
case NPFS_NTC_VCB:
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case NPFS_NTC_ROOT_DCB:
|
|||
|
|
|||
|
*Ccb = FileObject->FsContext2;
|
|||
|
if (ARGUMENT_PRESENT(Fcb)) {
|
|||
|
*Fcb = FsContext;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case NPFS_NTC_CCB:
|
|||
|
|
|||
|
*Ccb = FsContext;
|
|||
|
if (ARGUMENT_PRESENT(Fcb)) {
|
|||
|
*Fcb = ((PCCB)FsContext)->Fcb;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
|
|||
|
NpBugCheck( NodeTypeCode, 0, 0 );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// and return to our caller
|
|||
|
//
|
|||
|
|
|||
|
DebugTrace(-1, Dbg, "NpDecodeFileObject -> %08lx\n", NodeTypeCode);
|
|||
|
|
|||
|
return NodeTypeCode;
|
|||
|
}
|
|||
|
|