reactos/drivers/filesystems/cdfs/cddata.h

273 lines
8.8 KiB
C

/*++
Copyright (c) 1989-2000 Microsoft Corporation
Module Name:
CdData.c
Abstract:
This module declares the global data used by the Cdfs file system.
--*/
#ifndef _CDDATA_
#define _CDDATA_
//
// Global data structures
//
extern CD_DATA CdData;
extern FAST_IO_DISPATCH CdFastIoDispatch;
//
// Global constants
//
//
// This is the number of times a mounted Vcb will be referenced on behalf
// of the system. The counts include the following references.
//
// 1 reference - shows the volume is mounted
// 1 reference - 1 for VolumeDasdFcb.
// 2 references - 1 for RootIndexFcb, 1 for internal stream.
// 2 references - 1 for PathTableFcb, 1 for internal stream.
//
// For user references we add one for the reference in each of the internal
// Fcb's.
//
#define CDFS_RESIDUAL_REFERENCE (6)
#define CDFS_RESIDUAL_USER_REFERENCE (3)
//
// Reserved directory strings
//
extern WCHAR CdUnicodeSelfArray[];
extern WCHAR CdUnicodeParentArray[];
extern UNICODE_STRING CdUnicodeDirectoryNames[];
//
// Volume descriptor identifier strings.
//
extern CHAR CdHsgId[];
extern CHAR CdIsoId[];
extern CHAR CdXaId[];
//
// Volume label for audio disks.
//
extern WCHAR CdAudioLabel[];
extern USHORT CdAudioLabelLength;
//
// Pseudo file names for audio disks.
//
extern CHAR CdAudioFileName[];
extern UCHAR CdAudioFileNameLength;
extern ULONG CdAudioDirentSize;
extern ULONG CdAudioDirentsPerSector;
extern ULONG CdAudioSystemUseOffset;
#define AUDIO_NAME_ONES_OFFSET (6)
#define AUDIO_NAME_TENS_OFFSET (5)
//
// Escape sequences for mounting Unicode volumes.
//
extern PCHAR CdJolietEscape[];
//
// Hardcoded header for RIFF files.
//
extern LONG CdXAFileHeader[];
extern LONG CdAudioPlayHeader[];
extern LONG CdXAAudioPhileHeader[];
#ifdef CDFS_TELEMETRY_DATA
//
// Globals for Telemetry data.
//
extern CDFS_TELEMETRY_DATA_CONTEXT CdTelemetryData;
#endif // CDFS_TELEMETRY_DATA
//
// The following assertion macros ensure that the indicated structure
// is valid
//
// ASSERT_STRUCT( _In_ PVOID Struct, _In_ CSHORT NodeType );
// ASSERT_OPTIONAL_STRUCT( _In_opt_ PVOID Struct, _In_ CSHORT NodeType );
//
// ASSERT_VCB( _In_ PVCB Vcb );
// ASSERT_OPTIONAL_VCB( _In_opt_ PVCB Vcb );
//
// ASSERT_FCB( _In_ PFCB Fcb );
// ASSERT_OPTIONAL_FCB( _In_opt_ PFCB Fcb );
//
// ASSERT_FCB_NONPAGED( _In_ PFCB_NONPAGED FcbNonpaged );
// ASSERT_OPTIONAL_FCB( _In_opt_ PFCB_NONPAGED FcbNonpaged );
//
// ASSERT_CCB( _In_ PSCB Ccb );
// ASSERT_OPTIONAL_CCB( _In_opt_ PSCB Ccb );
//
// ASSERT_IRP_CONTEXT( _In_ PIRP_CONTEXT IrpContext );
// ASSERT_OPTIONAL_IRP_CONTEXT( _In_opt_ PIRP_CONTEXT IrpContext );
//
// ASSERT_IRP( _In_ PIRP Irp );
// ASSERT_OPTIONAL_IRP( _In_opt_ PIRP Irp );
//
// ASSERT_FILE_OBJECT( _In_ PFILE_OBJECT FileObject );
// ASSERT_OPTIONAL_FILE_OBJECT( _In_opt_ PFILE_OBJECT FileObject );
//
// The following macros are used to check the current thread owns
// the indicated resource
//
// ASSERT_EXCLUSIVE_RESOURCE( _In_ PERESOURCE Resource );
//
// ASSERT_SHARED_RESOURCE( _In_ PERESOURCE Resource );
//
// ASSERT_RESOURCE_NOT_MINE( _In_ PERESOURCE Resource );
//
// The following macros are used to check whether the current thread
// owns the resoures in the given structures.
//
// ASSERT_EXCLUSIVE_CDDATA
//
// ASSERT_EXCLUSIVE_VCB( _In_ PVCB Vcb );
//
// ASSERT_SHARED_VCB( _In_ PVCB Vcb );
//
// ASSERT_EXCLUSIVE_FCB( _In_ PFCB Fcb );
//
// ASSERT_SHARED_FCB( _In_ PFCB Fcb );
//
// ASSERT_EXCLUSIVE_FILE( _In_ PFCB Fcb );
//
// ASSERT_SHARED_FILE( _In_ PFCB Fcb );
//
// ASSERT_LOCKED_VCB( _In_ PVCB Vcb );
//
// ASSERT_NOT_LOCKED_VCB( _In_ PVCB Vcb );
//
// ASSERT_LOCKED_FCB( _In_ PFCB Fcb );
//
// ASSERT_NOT_LOCKED_FCB( _In_ PFCB Fcb );
//
//
// Turn on the sanity checks if this is DBG or CD_FREE_ASSERTS
//
#if DBG
#undef CD_SANITY
//#define CD_SANITY
#endif
#ifdef CD_SANITY
#define ASSERT_STRUCT(S,T) NT_ASSERT( SafeNodeType( S ) == (T) )
#define ASSERT_OPTIONAL_STRUCT(S,T) NT_ASSERT( ((S) == NULL) || (SafeNodeType( S ) == (T)) )
#define ASSERT_VCB(V) ASSERT_STRUCT( (V), CDFS_NTC_VCB )
#define ASSERT_OPTIONAL_VCB(V) ASSERT_OPTIONAL_STRUCT( (V), CDFS_NTC_VCB )
#define ASSERT_FCB(F) \
NT_ASSERT( (SafeNodeType( F ) == CDFS_NTC_FCB_DATA ) || \
(SafeNodeType( F ) == CDFS_NTC_FCB_INDEX ) || \
(SafeNodeType( F ) == CDFS_NTC_FCB_PATH_TABLE ) )
#define ASSERT_OPTIONAL_FCB(F) \
NT_ASSERT( ((F) == NULL) || \
(SafeNodeType( F ) == CDFS_NTC_FCB_DATA ) || \
(SafeNodeType( F ) == CDFS_NTC_FCB_INDEX ) || \
(SafeNodeType( F ) == CDFS_NTC_FCB_PATH_TABLE ) )
#define ASSERT_FCB_NONPAGED(FN) ASSERT_STRUCT( (FN), CDFS_NTC_FCB_NONPAGED )
#define ASSERT_OPTIONAL_FCB_NONPAGED(FN) ASSERT_OPTIONAL_STRUCT( (FN), CDFS_NTC_FCB_NONPAGED )
#define ASSERT_CCB(C) ASSERT_STRUCT( (C), CDFS_NTC_CCB )
#define ASSERT_OPTIONAL_CCB(C) ASSERT_OPTIONAL_STRUCT( (C), CDFS_NTC_CCB )
#define ASSERT_IRP_CONTEXT(IC) ASSERT_STRUCT( (IC), CDFS_NTC_IRP_CONTEXT )
#define ASSERT_OPTIONAL_IRP_CONTEXT(IC) ASSERT_OPTIONAL_STRUCT( (IC), CDFS_NTC_IRP_CONTEXT )
#define ASSERT_IRP(I) ASSERT_STRUCT( (I), IO_TYPE_IRP )
#define ASSERT_OPTIONAL_IRP(I) ASSERT_OPTIONAL_STRUCT( (I), IO_TYPE_IRP )
#define ASSERT_FILE_OBJECT(FO) ASSERT_STRUCT( (FO), IO_TYPE_FILE )
#define ASSERT_OPTIONAL_FILE_OBJECT(FO) ASSERT_OPTIONAL_STRUCT( (FO), IO_TYPE_FILE )
#define ASSERT_EXCLUSIVE_RESOURCE(R) NT_ASSERT( ExIsResourceAcquiredExclusiveLite( R ))
#define ASSERT_SHARED_RESOURCE(R) NT_ASSERT( ExIsResourceAcquiredSharedLite( R ))
#define ASSERT_RESOURCE_NOT_MINE(R) NT_ASSERT( !ExIsResourceAcquiredSharedLite( R ))
#define ASSERT_EXCLUSIVE_CDDATA NT_ASSERT( ExIsResourceAcquiredExclusiveLite( &CdData.DataResource ))
#define ASSERT_EXCLUSIVE_VCB(V) NT_ASSERT( ExIsResourceAcquiredExclusiveLite( &(V)->VcbResource ))
#define ASSERT_SHARED_VCB(V) NT_ASSERT( ExIsResourceAcquiredSharedLite( &(V)->VcbResource ))
#define ASSERT_EXCLUSIVE_FCB(F) NT_ASSERT( ExIsResourceAcquiredExclusiveLite( &(F)->FcbNonpaged->FcbResource ))
#define ASSERT_SHARED_FCB(F) NT_ASSERT( ExIsResourceAcquiredSharedLite( &(F)->FcbNonpaged->FcbResource ))
#define ASSERT_EXCLUSIVE_FILE(F) NT_ASSERT( ExIsResourceAcquiredExclusiveLite( (F)->Resource ))
#define ASSERT_SHARED_FILE(F) NT_ASSERT( ExIsResourceAcquiredSharedLite( (F)->Resource ))
#define ASSERT_LOCKED_VCB(V) NT_ASSERT( (V)->VcbLockThread == PsGetCurrentThread() )
#define ASSERT_NOT_LOCKED_VCB(V) NT_ASSERT( (V)->VcbLockThread != PsGetCurrentThread() )
#define ASSERT_LOCKED_FCB(F) NT_ASSERT( !FlagOn( (F)->FcbState, FCB_STATE_IN_FCB_TABLE) || ((F)->FcbLockThread == PsGetCurrentThread()))
#define ASSERT_NOT_LOCKED_FCB(F) NT_ASSERT( (F)->FcbLockThread != PsGetCurrentThread() )
#else
#define DebugBreakOnStatus(S) { NOTHING; }
#define ASSERT_STRUCT(S,T) { NOTHING; }
#define ASSERT_OPTIONAL_STRUCT(S,T) { NOTHING; }
#define ASSERT_VCB(V) { NOTHING; }
#define ASSERT_OPTIONAL_VCB(V) { NOTHING; }
#define ASSERT_FCB(F) { NOTHING; }
#define ASSERT_FCB_NONPAGED(FN) { NOTHING; }
#define ASSERT_OPTIONAL_FCB(FN) { NOTHING; }
#define ASSERT_CCB(C) { NOTHING; }
#define ASSERT_OPTIONAL_CCB(C) { NOTHING; }
#define ASSERT_IRP_CONTEXT(IC) { NOTHING; }
#define ASSERT_OPTIONAL_IRP_CONTEXT(IC) { NOTHING; }
#define ASSERT_IRP(I) { NOTHING; }
#define ASSERT_OPTIONAL_IRP(I) { NOTHING; }
#define ASSERT_FILE_OBJECT(FO) { NOTHING; }
#define ASSERT_OPTIONAL_FILE_OBJECT(FO) { NOTHING; }
#define ASSERT_EXCLUSIVE_RESOURCE(R) { NOTHING; }
#define ASSERT_SHARED_RESOURCE(R) { NOTHING; }
#define ASSERT_RESOURCE_NOT_MINE(R) { NOTHING; }
#define ASSERT_EXCLUSIVE_CDDATA { NOTHING; }
#define ASSERT_EXCLUSIVE_VCB(V) { NOTHING; }
#define ASSERT_SHARED_VCB(V) { NOTHING; }
#define ASSERT_EXCLUSIVE_FCB(F) { NOTHING; }
#define ASSERT_SHARED_FCB(F) { NOTHING; }
#define ASSERT_EXCLUSIVE_FILE(F) { NOTHING; }
#define ASSERT_SHARED_FILE(F) { NOTHING; }
#define ASSERT_LOCKED_VCB(V) { NOTHING; }
#define ASSERT_NOT_LOCKED_VCB(V) { NOTHING; }
#define ASSERT_LOCKED_FCB(F) { NOTHING; }
#define ASSERT_NOT_LOCKED_FCB(F) { NOTHING; }
#endif
#endif // _CDDATA_