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