reactos/drivers/filesystems/cdfs/filobsup.c
Joachim Henze 19f220bf51 [0.4.9][CDFS_NEW] -> [CDFS]
port back:
0.4.10-dev-615-g 45fd48bd0f [CDFS_NEW] -> [CDFS] No old driver, thus no new driver
0.4.10-dev-614-g 5795254933 [CDFS] Delete the old CDFS driver.

The new MS PL licensed one worked for several years fine for us now
even in the older releases.
So no need to keep our old unfinished one any longer within
the release-branches. They are no mausoleum.
This does *not* change, which driver is actually in use.
We do continue to use 1:1 the state of current releases/0.4.10
2023-03-23 22:09:06 +01:00

250 lines
5.2 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1989-2000 Microsoft Corporation
Module Name:
FilObSup.c
Abstract:
This module implements the Cdfs File object support routines.
--*/
#include "cdprocs.h"
//
// The Bug check file id for this module
//
#define BugCheckFileId (CDFS_BUG_CHECK_FILOBSUP)
//
// Local constants.
//
#define TYPE_OF_OPEN_MASK (0x00000007)
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, CdDecodeFileObject)
#pragma alloc_text(PAGE, CdFastDecodeFileObject)
#pragma alloc_text(PAGE, CdSetFileObject)
#endif
_When_(TypeOfOpen == UnopenedFileObject, _At_(Fcb, _In_opt_))
_When_(TypeOfOpen != UnopenedFileObject, _At_(Fcb, _In_))
VOID
CdSetFileObject (
_In_ PIRP_CONTEXT IrpContext,
_Inout_ PFILE_OBJECT FileObject,
_In_ TYPE_OF_OPEN TypeOfOpen,
PFCB Fcb,
_In_opt_ PCCB Ccb
)
/*++
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();
UNREFERENCED_PARAMETER( IrpContext );
//
// We only have values 0 to 7 available so make sure we didn't
// inadvertantly add a new type.
//
NT_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.
//
NT_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;
#ifdef _MSC_VER
#pragma warning( suppress: 4213 )
#endif
SetFlag( (*(PULONG_PTR)&FileObject->FsContext2), TypeOfOpen ); /* ReactOS Change: GCC "invalid lvalue in assignment" */
//
// Set the Vpb field in the file object.
//
FileObject->Vpb = Fcb->Vcb->Vpb;
return;
}
_When_(return == UnopenedFileObject, _At_(*Fcb, _Post_null_))
_When_(return != UnopenedFileObject, _At_(Fcb, _Outptr_))
_When_(return == UnopenedFileObject, _At_(*Ccb, _Post_null_))
_When_(return != UnopenedFileObject, _At_(Ccb, _Outptr_))
TYPE_OF_OPEN
CdDecodeFileObject (
_In_ PIRP_CONTEXT IrpContext,
_In_ PFILE_OBJECT FileObject,
PFCB *Fcb,
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();
UNREFERENCED_PARAMETER( IrpContext );
//
// 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;
#ifdef _MSC_VER
#pragma warning( suppress: 4213 )
#endif
ClearFlag( (*(PULONG_PTR)Ccb), TYPE_OF_OPEN_MASK ); /* ReactOS Change: GCC "invalid lvalue in assignment" */
}
//
// Now return the type of open.
//
return TypeOfOpen;
}
TYPE_OF_OPEN
CdFastDecodeFileObject (
_In_ PFILE_OBJECT FileObject,
_Out_ PFCB *Fcb
)
/*++
Routine Description:
This procedure takes a pointer to a file object, that has already been
opened by Cdfs 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 );
}