/*++ Copyright (c) 1989 Microsoft Corporation Module Name: FilObSup.c Abstract: This module implements the Udfs File object support routines. Author: Dan Lovinger [DanLo] 23-Sep-1996 Revision History: --*/ #include "UdfProcs.h" // The Bug check file id for this module #define BugCheckFileId (UDFS_BUG_CHECK_FILOBSUP) // The local debug trace level #define Dbg (UDFS_DEBUG_LEVEL_FILOBSUP) // Local constants. #define TYPE_OF_OPEN_MASK (0x00000007) #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, UdfDecodeFileObject) #pragma alloc_text(PAGE, UdfFastDecodeFileObject) #pragma alloc_text(PAGE, UdfSetFileObject) #endif VOID UdfSetFileObject ( IN PIRP_CONTEXT IrpContext, IN PFILE_OBJECT FileObject, IN TYPE_OF_OPEN TypeOfOpen, IN PFCB Fcb OPTIONAL, IN PCCB Ccb OPTIONAL ) /*++ Routine Description: This routine will initialize the FileObject context fields based on the input type and data structures. Arguments: FileObject - Supplies the file object pointer being initialized. TypeOfOpen - Sets the type of open. Fcb - Fcb for this file object. Ignored for UnopenedFileObject. Ccb - Ccb for the handle corresponding to this file object. Will not be present for stream file objects. Return Value: None. --*/ { PAGED_CODE(); // We only have values 0 to 7 available so make sure we didn't // inadvertantly add a new type. ASSERTMSG( "FileObject types exceed available bits\n", BeyondValidType <= 8 ); // Setting a file object to type UnopenedFileObject means just // clearing all of the context fields. All the other input if (TypeOfOpen == UnopenedFileObject) { FileObject->FsContext = FileObject->FsContext2 = NULL; return; } // Check that the 3 low-order bits of the Ccb are clear. ASSERTMSG( "Ccb is not quad-aligned\n", !FlagOn( ((ULONG_PTR) Ccb), TYPE_OF_OPEN_MASK )); // We will or the type of open into the low order bits of FsContext2 // along with the Ccb value. // The Fcb is stored into the FsContext field. FileObject->FsContext = Fcb; FileObject->FsContext2 = Ccb; SetFlag( ((ULONG_PTR) FileObject->FsContext2), TypeOfOpen ); // Set the Vpb field in the file object. FileObject->Vpb = Fcb->Vcb->Vpb; return; } TYPE_OF_OPEN UdfDecodeFileObject ( IN PFILE_OBJECT FileObject, OUT PFCB *Fcb, OUT PCCB *Ccb ) /*++ Routine Description: This routine takes a file object and extracts the Fcb and Ccb (possibly NULL) and returns the type of open. Arguments: FileObject - Supplies the file object pointer being initialized. Fcb - Address to store the Fcb contained in the file object. Ccb - Address to store the Ccb contained in the file object. Return Value: TYPE_OF_OPEN - Indicates the type of file object. --*/ { TYPE_OF_OPEN TypeOfOpen; PAGED_CODE(); // If this is an unopened file object then return NULL for the // Fcb/Ccb. Don't trust any other values in the file object. TypeOfOpen = (TYPE_OF_OPEN) FlagOn( (ULONG_PTR) FileObject->FsContext2, TYPE_OF_OPEN_MASK ); if (TypeOfOpen == UnopenedFileObject) { *Fcb = NULL; *Ccb = NULL; } else { // The Fcb is pointed to by the FsContext field. The Ccb is in // FsContext2 (after clearing the low three bits). The low three // bits are the file object type. *Fcb = FileObject->FsContext; *Ccb = FileObject->FsContext2; ClearFlag( (ULONG_PTR) *Ccb, TYPE_OF_OPEN_MASK ); } // Now return the type of open. return TypeOfOpen; } TYPE_OF_OPEN UdfFastDecodeFileObject ( IN PFILE_OBJECT FileObject, OUT PFCB *Fcb ) /*++ Routine Description: This procedure takes a pointer to a file object, that has already been opened by Udfs and does a quick decode operation. It will only return a non null value if the file object is a user file open Arguments: FileObject - Supplies the file object pointer being interrogated Fcb - Address to store Fcb if this is a user file object. NULL otherwise. Return Value: TYPE_OF_OPEN - type of open of this file object. --*/ { PAGED_CODE(); ASSERT_FILE_OBJECT( FileObject ); // The Fcb is in the FsContext field. The type of open is in the low // bits of the Ccb. *Fcb = FileObject->FsContext; return (TYPE_OF_OPEN) FlagOn( (ULONG_PTR) FileObject->FsContext2, TYPE_OF_OPEN_MASK ); }