xref: /reactos/drivers/filesystems/cdfs/filobsup.c (revision 34593d93)
145fd48bdSPierre Schweitzer /*++
245fd48bdSPierre Schweitzer 
345fd48bdSPierre Schweitzer Copyright (c) 1989-2000 Microsoft Corporation
445fd48bdSPierre Schweitzer 
545fd48bdSPierre Schweitzer Module Name:
645fd48bdSPierre Schweitzer 
745fd48bdSPierre Schweitzer     FilObSup.c
845fd48bdSPierre Schweitzer 
945fd48bdSPierre Schweitzer Abstract:
1045fd48bdSPierre Schweitzer 
1145fd48bdSPierre Schweitzer     This module implements the Cdfs File object support routines.
1245fd48bdSPierre Schweitzer 
1345fd48bdSPierre Schweitzer 
1445fd48bdSPierre Schweitzer --*/
1545fd48bdSPierre Schweitzer 
1645fd48bdSPierre Schweitzer #include "cdprocs.h"
1745fd48bdSPierre Schweitzer 
1845fd48bdSPierre Schweitzer //
1945fd48bdSPierre Schweitzer //  The Bug check file id for this module
2045fd48bdSPierre Schweitzer //
2145fd48bdSPierre Schweitzer 
2245fd48bdSPierre Schweitzer #define BugCheckFileId                   (CDFS_BUG_CHECK_FILOBSUP)
2345fd48bdSPierre Schweitzer 
2445fd48bdSPierre Schweitzer //
2545fd48bdSPierre Schweitzer //  Local constants.
2645fd48bdSPierre Schweitzer //
2745fd48bdSPierre Schweitzer 
2845fd48bdSPierre Schweitzer #define TYPE_OF_OPEN_MASK               (0x00000007)
2945fd48bdSPierre Schweitzer 
3045fd48bdSPierre Schweitzer #ifdef ALLOC_PRAGMA
3145fd48bdSPierre Schweitzer #pragma alloc_text(PAGE, CdDecodeFileObject)
3245fd48bdSPierre Schweitzer #pragma alloc_text(PAGE, CdFastDecodeFileObject)
3345fd48bdSPierre Schweitzer #pragma alloc_text(PAGE, CdSetFileObject)
3445fd48bdSPierre Schweitzer #endif
3545fd48bdSPierre Schweitzer 
3645fd48bdSPierre Schweitzer 
3745fd48bdSPierre Schweitzer _When_(TypeOfOpen == UnopenedFileObject, _At_(Fcb, _In_opt_))
3845fd48bdSPierre Schweitzer _When_(TypeOfOpen != UnopenedFileObject, _At_(Fcb, _In_))
3945fd48bdSPierre Schweitzer VOID
CdSetFileObject(_In_ PIRP_CONTEXT IrpContext,_Inout_ PFILE_OBJECT FileObject,_In_ TYPE_OF_OPEN TypeOfOpen,PFCB Fcb,_In_opt_ PCCB Ccb)4045fd48bdSPierre Schweitzer CdSetFileObject (
4145fd48bdSPierre Schweitzer     _In_ PIRP_CONTEXT IrpContext,
4245fd48bdSPierre Schweitzer     _Inout_ PFILE_OBJECT FileObject,
4345fd48bdSPierre Schweitzer     _In_ TYPE_OF_OPEN TypeOfOpen,
4445fd48bdSPierre Schweitzer     PFCB Fcb,
4545fd48bdSPierre Schweitzer     _In_opt_ PCCB Ccb
4645fd48bdSPierre Schweitzer     )
4745fd48bdSPierre Schweitzer 
4845fd48bdSPierre Schweitzer /*++
4945fd48bdSPierre Schweitzer 
5045fd48bdSPierre Schweitzer Routine Description:
5145fd48bdSPierre Schweitzer 
5245fd48bdSPierre Schweitzer     This routine will initialize the FileObject context fields based on the
5345fd48bdSPierre Schweitzer     input type and data structures.
5445fd48bdSPierre Schweitzer 
5545fd48bdSPierre Schweitzer Arguments:
5645fd48bdSPierre Schweitzer 
5745fd48bdSPierre Schweitzer     FileObject - Supplies the file object pointer being initialized.
5845fd48bdSPierre Schweitzer 
5945fd48bdSPierre Schweitzer     TypeOfOpen - Sets the type of open.
6045fd48bdSPierre Schweitzer 
6145fd48bdSPierre Schweitzer     Fcb - Fcb for this file object.  Ignored for UnopenedFileObject.
6245fd48bdSPierre Schweitzer 
6345fd48bdSPierre Schweitzer     Ccb - Ccb for the handle corresponding to this file object.  Will not
6445fd48bdSPierre Schweitzer         be present for stream file objects.
6545fd48bdSPierre Schweitzer 
6645fd48bdSPierre Schweitzer Return Value:
6745fd48bdSPierre Schweitzer 
6845fd48bdSPierre Schweitzer     None.
6945fd48bdSPierre Schweitzer 
7045fd48bdSPierre Schweitzer --*/
7145fd48bdSPierre Schweitzer 
7245fd48bdSPierre Schweitzer {
7345fd48bdSPierre Schweitzer     PAGED_CODE();
7445fd48bdSPierre Schweitzer 
7545fd48bdSPierre Schweitzer     UNREFERENCED_PARAMETER( IrpContext );
7645fd48bdSPierre Schweitzer 
7745fd48bdSPierre Schweitzer     //
7845fd48bdSPierre Schweitzer     //  We only have values 0 to 7 available so make sure we didn't
7945fd48bdSPierre Schweitzer     //  inadvertantly add a new type.
8045fd48bdSPierre Schweitzer     //
8145fd48bdSPierre Schweitzer 
8245fd48bdSPierre Schweitzer     NT_ASSERTMSG( "FileObject types exceed available bits\n", BeyondValidType <= 8 );
8345fd48bdSPierre Schweitzer 
8445fd48bdSPierre Schweitzer     //
8545fd48bdSPierre Schweitzer     //  Setting a file object to type UnopenedFileObject means just
8645fd48bdSPierre Schweitzer     //  clearing all of the context fields.  All the other input
8745fd48bdSPierre Schweitzer     //
8845fd48bdSPierre Schweitzer 
8945fd48bdSPierre Schweitzer     if (TypeOfOpen == UnopenedFileObject) {
9045fd48bdSPierre Schweitzer 
9145fd48bdSPierre Schweitzer         FileObject->FsContext =
9245fd48bdSPierre Schweitzer         FileObject->FsContext2 = NULL;
9345fd48bdSPierre Schweitzer 
9445fd48bdSPierre Schweitzer         return;
9545fd48bdSPierre Schweitzer     }
9645fd48bdSPierre Schweitzer 
9745fd48bdSPierre Schweitzer     //
9845fd48bdSPierre Schweitzer     //  Check that the 3 low-order bits of the Ccb are clear.
9945fd48bdSPierre Schweitzer     //
10045fd48bdSPierre Schweitzer 
10145fd48bdSPierre Schweitzer     NT_ASSERTMSG( "Ccb is not quad-aligned\n", !FlagOn( ((ULONG_PTR) Ccb), TYPE_OF_OPEN_MASK ));
10245fd48bdSPierre Schweitzer 
10345fd48bdSPierre Schweitzer     //
10445fd48bdSPierre Schweitzer     //  We will or the type of open into the low order bits of FsContext2
10545fd48bdSPierre Schweitzer     //  along with the Ccb value.
10645fd48bdSPierre Schweitzer     //  The Fcb is stored into the FsContext field.
10745fd48bdSPierre Schweitzer     //
10845fd48bdSPierre Schweitzer 
10945fd48bdSPierre Schweitzer     FileObject->FsContext = Fcb;
11045fd48bdSPierre Schweitzer     FileObject->FsContext2 = Ccb;
11145fd48bdSPierre Schweitzer 
11245fd48bdSPierre Schweitzer #ifdef _MSC_VER
11345fd48bdSPierre Schweitzer #pragma warning( suppress: 4213 )
11445fd48bdSPierre Schweitzer #endif
11545fd48bdSPierre Schweitzer     SetFlag( (*(PULONG_PTR)&FileObject->FsContext2), TypeOfOpen ); /* ReactOS Change: GCC "invalid lvalue in assignment" */
11645fd48bdSPierre Schweitzer 
11745fd48bdSPierre Schweitzer     //
11845fd48bdSPierre Schweitzer     //  Set the Vpb field in the file object.
11945fd48bdSPierre Schweitzer     //
12045fd48bdSPierre Schweitzer 
12145fd48bdSPierre Schweitzer     FileObject->Vpb = Fcb->Vcb->Vpb;
12245fd48bdSPierre Schweitzer 
12345fd48bdSPierre Schweitzer     return;
12445fd48bdSPierre Schweitzer }
12545fd48bdSPierre Schweitzer 
12645fd48bdSPierre Schweitzer 
12745fd48bdSPierre Schweitzer _When_(return == UnopenedFileObject, _At_(*Fcb, _Post_null_))
12845fd48bdSPierre Schweitzer _When_(return != UnopenedFileObject, _At_(Fcb, _Outptr_))
12945fd48bdSPierre Schweitzer _When_(return == UnopenedFileObject, _At_(*Ccb, _Post_null_))
13045fd48bdSPierre Schweitzer _When_(return != UnopenedFileObject, _At_(Ccb, _Outptr_))
13145fd48bdSPierre Schweitzer TYPE_OF_OPEN
CdDecodeFileObject(_In_ PIRP_CONTEXT IrpContext,_In_ PFILE_OBJECT FileObject,PFCB * Fcb,PCCB * Ccb)13245fd48bdSPierre Schweitzer CdDecodeFileObject (
13345fd48bdSPierre Schweitzer     _In_ PIRP_CONTEXT IrpContext,
13445fd48bdSPierre Schweitzer     _In_ PFILE_OBJECT FileObject,
13545fd48bdSPierre Schweitzer     PFCB *Fcb,
13645fd48bdSPierre Schweitzer     PCCB *Ccb
13745fd48bdSPierre Schweitzer     )
13845fd48bdSPierre Schweitzer 
13945fd48bdSPierre Schweitzer /*++
14045fd48bdSPierre Schweitzer 
14145fd48bdSPierre Schweitzer Routine Description:
14245fd48bdSPierre Schweitzer 
14345fd48bdSPierre Schweitzer     This routine takes a file object and extracts the Fcb and Ccb (possibly NULL)
14445fd48bdSPierre Schweitzer     and returns the type of open.
14545fd48bdSPierre Schweitzer 
14645fd48bdSPierre Schweitzer Arguments:
14745fd48bdSPierre Schweitzer 
14845fd48bdSPierre Schweitzer     FileObject - Supplies the file object pointer being initialized.
14945fd48bdSPierre Schweitzer 
15045fd48bdSPierre Schweitzer     Fcb - Address to store the Fcb contained in the file object.
15145fd48bdSPierre Schweitzer 
15245fd48bdSPierre Schweitzer     Ccb - Address to store the Ccb contained in the file object.
15345fd48bdSPierre Schweitzer 
15445fd48bdSPierre Schweitzer Return Value:
15545fd48bdSPierre Schweitzer 
15645fd48bdSPierre Schweitzer     TYPE_OF_OPEN - Indicates the type of file object.
15745fd48bdSPierre Schweitzer 
15845fd48bdSPierre Schweitzer --*/
15945fd48bdSPierre Schweitzer 
16045fd48bdSPierre Schweitzer {
16145fd48bdSPierre Schweitzer     TYPE_OF_OPEN TypeOfOpen;
16245fd48bdSPierre Schweitzer 
16345fd48bdSPierre Schweitzer     PAGED_CODE();
16445fd48bdSPierre Schweitzer 
16545fd48bdSPierre Schweitzer     UNREFERENCED_PARAMETER( IrpContext );
16645fd48bdSPierre Schweitzer 
16745fd48bdSPierre Schweitzer     //
16845fd48bdSPierre Schweitzer     //  If this is an unopened file object then return NULL for the
16945fd48bdSPierre Schweitzer     //  Fcb/Ccb.  Don't trust any other values in the file object.
17045fd48bdSPierre Schweitzer     //
17145fd48bdSPierre Schweitzer 
17245fd48bdSPierre Schweitzer     TypeOfOpen = (TYPE_OF_OPEN) FlagOn( (ULONG_PTR) FileObject->FsContext2,
17345fd48bdSPierre Schweitzer                                         TYPE_OF_OPEN_MASK );
17445fd48bdSPierre Schweitzer 
17545fd48bdSPierre Schweitzer     if (TypeOfOpen == UnopenedFileObject) {
17645fd48bdSPierre Schweitzer 
17745fd48bdSPierre Schweitzer         *Fcb = NULL;
17845fd48bdSPierre Schweitzer         *Ccb = NULL;
17945fd48bdSPierre Schweitzer 
18045fd48bdSPierre Schweitzer     } else {
18145fd48bdSPierre Schweitzer 
18245fd48bdSPierre Schweitzer         //
18345fd48bdSPierre Schweitzer         //  The Fcb is pointed to by the FsContext field.  The Ccb is in
18445fd48bdSPierre Schweitzer         //  FsContext2 (after clearing the low three bits).  The low three
18545fd48bdSPierre Schweitzer         //  bits are the file object type.
18645fd48bdSPierre Schweitzer         //
18745fd48bdSPierre Schweitzer 
18845fd48bdSPierre Schweitzer         *Fcb = FileObject->FsContext;
18945fd48bdSPierre Schweitzer         *Ccb = FileObject->FsContext2;
19045fd48bdSPierre Schweitzer 
19145fd48bdSPierre Schweitzer #ifdef _MSC_VER
19245fd48bdSPierre Schweitzer #pragma warning( suppress: 4213 )
19345fd48bdSPierre Schweitzer #endif
19445fd48bdSPierre Schweitzer         ClearFlag( (*(PULONG_PTR)Ccb), TYPE_OF_OPEN_MASK ); /* ReactOS Change: GCC "invalid lvalue in assignment" */
19545fd48bdSPierre Schweitzer     }
19645fd48bdSPierre Schweitzer 
19745fd48bdSPierre Schweitzer     //
19845fd48bdSPierre Schweitzer     //  Now return the type of open.
19945fd48bdSPierre Schweitzer     //
20045fd48bdSPierre Schweitzer 
20145fd48bdSPierre Schweitzer     return TypeOfOpen;
20245fd48bdSPierre Schweitzer }
20345fd48bdSPierre Schweitzer 
204*34593d93SVictor Perevertkin 
20545fd48bdSPierre Schweitzer TYPE_OF_OPEN
CdFastDecodeFileObject(_In_ PFILE_OBJECT FileObject,_Out_ PFCB * Fcb)20645fd48bdSPierre Schweitzer CdFastDecodeFileObject (
20745fd48bdSPierre Schweitzer     _In_ PFILE_OBJECT FileObject,
20845fd48bdSPierre Schweitzer     _Out_ PFCB *Fcb
20945fd48bdSPierre Schweitzer     )
21045fd48bdSPierre Schweitzer 
21145fd48bdSPierre Schweitzer /*++
21245fd48bdSPierre Schweitzer 
21345fd48bdSPierre Schweitzer Routine Description:
21445fd48bdSPierre Schweitzer 
21545fd48bdSPierre Schweitzer     This procedure takes a pointer to a file object, that has already been
21645fd48bdSPierre Schweitzer     opened by Cdfs and does a quick decode operation.  It will only return
21745fd48bdSPierre Schweitzer     a non null value if the file object is a user file open
21845fd48bdSPierre Schweitzer 
21945fd48bdSPierre Schweitzer Arguments:
22045fd48bdSPierre Schweitzer 
22145fd48bdSPierre Schweitzer     FileObject - Supplies the file object pointer being interrogated
22245fd48bdSPierre Schweitzer 
22345fd48bdSPierre Schweitzer     Fcb - Address to store Fcb if this is a user file object.  NULL
22445fd48bdSPierre Schweitzer         otherwise.
22545fd48bdSPierre Schweitzer 
22645fd48bdSPierre Schweitzer Return Value:
22745fd48bdSPierre Schweitzer 
22845fd48bdSPierre Schweitzer     TYPE_OF_OPEN - type of open of this file object.
22945fd48bdSPierre Schweitzer 
23045fd48bdSPierre Schweitzer --*/
23145fd48bdSPierre Schweitzer 
23245fd48bdSPierre Schweitzer {
23345fd48bdSPierre Schweitzer     PAGED_CODE();
23445fd48bdSPierre Schweitzer 
23545fd48bdSPierre Schweitzer     ASSERT_FILE_OBJECT( FileObject );
23645fd48bdSPierre Schweitzer 
23745fd48bdSPierre Schweitzer     //
23845fd48bdSPierre Schweitzer     //  The Fcb is in the FsContext field.  The type of open is in the low
23945fd48bdSPierre Schweitzer     //  bits of the Ccb.
24045fd48bdSPierre Schweitzer     //
24145fd48bdSPierre Schweitzer 
24245fd48bdSPierre Schweitzer     *Fcb = FileObject->FsContext;
24345fd48bdSPierre Schweitzer 
24445fd48bdSPierre Schweitzer     return (TYPE_OF_OPEN)
24545fd48bdSPierre Schweitzer             FlagOn( (ULONG_PTR) FileObject->FsContext2, TYPE_OF_OPEN_MASK );
24645fd48bdSPierre Schweitzer }
24745fd48bdSPierre Schweitzer 
24845fd48bdSPierre Schweitzer 
24945fd48bdSPierre Schweitzer 
250