3 Copyright (c) 1989-2000 Microsoft Corporation
11 This module declares the global data used by the Cdfs file system.
20 // Global data structures
23 extern CD_DATA CdData
;
24 extern FAST_IO_DISPATCH CdFastIoDispatch
;
31 // This is the number of times a mounted Vcb will be referenced on behalf
32 // of the system. The counts include the following references.
34 // 1 reference - shows the volume is mounted
35 // 1 reference - 1 for VolumeDasdFcb.
36 // 2 references - 1 for RootIndexFcb, 1 for internal stream.
37 // 2 references - 1 for PathTableFcb, 1 for internal stream.
39 // For user references we add one for the reference in each of the internal
43 #define CDFS_RESIDUAL_REFERENCE (6)
44 #define CDFS_RESIDUAL_USER_REFERENCE (3)
47 // Reserved directory strings
50 extern WCHAR CdUnicodeSelfArray
[];
51 extern WCHAR CdUnicodeParentArray
[];
53 extern UNICODE_STRING CdUnicodeDirectoryNames
[];
56 // Volume descriptor identifier strings.
59 extern CHAR CdHsgId
[];
60 extern CHAR CdIsoId
[];
64 // Volume label for audio disks.
67 extern WCHAR CdAudioLabel
[];
68 extern USHORT CdAudioLabelLength
;
71 // Pseudo file names for audio disks.
74 extern CHAR CdAudioFileName
[];
75 extern UCHAR CdAudioFileNameLength
;
76 extern ULONG CdAudioDirentSize
;
77 extern ULONG CdAudioDirentsPerSector
;
78 extern ULONG CdAudioSystemUseOffset
;
80 #define AUDIO_NAME_ONES_OFFSET (6)
81 #define AUDIO_NAME_TENS_OFFSET (5)
84 // Escape sequences for mounting Unicode volumes.
87 extern PCHAR CdJolietEscape
[];
90 // Hardcoded header for RIFF files.
93 extern LONG CdXAFileHeader
[];
94 extern LONG CdAudioPlayHeader
[];
95 extern LONG CdXAAudioPhileHeader
[];
97 #ifdef CDFS_TELEMETRY_DATA
100 // Globals for Telemetry data.
103 extern CDFS_TELEMETRY_DATA_CONTEXT CdTelemetryData
;
105 #endif // CDFS_TELEMETRY_DATA
108 // The following assertion macros ensure that the indicated structure
111 // ASSERT_STRUCT( _In_ PVOID Struct, _In_ CSHORT NodeType );
112 // ASSERT_OPTIONAL_STRUCT( _In_opt_ PVOID Struct, _In_ CSHORT NodeType );
114 // ASSERT_VCB( _In_ PVCB Vcb );
115 // ASSERT_OPTIONAL_VCB( _In_opt_ PVCB Vcb );
117 // ASSERT_FCB( _In_ PFCB Fcb );
118 // ASSERT_OPTIONAL_FCB( _In_opt_ PFCB Fcb );
120 // ASSERT_FCB_NONPAGED( _In_ PFCB_NONPAGED FcbNonpaged );
121 // ASSERT_OPTIONAL_FCB( _In_opt_ PFCB_NONPAGED FcbNonpaged );
123 // ASSERT_CCB( _In_ PSCB Ccb );
124 // ASSERT_OPTIONAL_CCB( _In_opt_ PSCB Ccb );
126 // ASSERT_IRP_CONTEXT( _In_ PIRP_CONTEXT IrpContext );
127 // ASSERT_OPTIONAL_IRP_CONTEXT( _In_opt_ PIRP_CONTEXT IrpContext );
129 // ASSERT_IRP( _In_ PIRP Irp );
130 // ASSERT_OPTIONAL_IRP( _In_opt_ PIRP Irp );
132 // ASSERT_FILE_OBJECT( _In_ PFILE_OBJECT FileObject );
133 // ASSERT_OPTIONAL_FILE_OBJECT( _In_opt_ PFILE_OBJECT FileObject );
135 // The following macros are used to check the current thread owns
136 // the indicated resource
138 // ASSERT_EXCLUSIVE_RESOURCE( _In_ PERESOURCE Resource );
140 // ASSERT_SHARED_RESOURCE( _In_ PERESOURCE Resource );
142 // ASSERT_RESOURCE_NOT_MINE( _In_ PERESOURCE Resource );
144 // The following macros are used to check whether the current thread
145 // owns the resoures in the given structures.
147 // ASSERT_EXCLUSIVE_CDDATA
149 // ASSERT_EXCLUSIVE_VCB( _In_ PVCB Vcb );
151 // ASSERT_SHARED_VCB( _In_ PVCB Vcb );
153 // ASSERT_EXCLUSIVE_FCB( _In_ PFCB Fcb );
155 // ASSERT_SHARED_FCB( _In_ PFCB Fcb );
157 // ASSERT_EXCLUSIVE_FILE( _In_ PFCB Fcb );
159 // ASSERT_SHARED_FILE( _In_ PFCB Fcb );
161 // ASSERT_LOCKED_VCB( _In_ PVCB Vcb );
163 // ASSERT_NOT_LOCKED_VCB( _In_ PVCB Vcb );
165 // ASSERT_LOCKED_FCB( _In_ PFCB Fcb );
167 // ASSERT_NOT_LOCKED_FCB( _In_ PFCB Fcb );
171 // Turn on the sanity checks if this is DBG or CD_FREE_ASSERTS
181 #define ASSERT_STRUCT(S,T) NT_ASSERT( SafeNodeType( S ) == (T) )
182 #define ASSERT_OPTIONAL_STRUCT(S,T) NT_ASSERT( ((S) == NULL) || (SafeNodeType( S ) == (T)) )
184 #define ASSERT_VCB(V) ASSERT_STRUCT( (V), CDFS_NTC_VCB )
185 #define ASSERT_OPTIONAL_VCB(V) ASSERT_OPTIONAL_STRUCT( (V), CDFS_NTC_VCB )
187 #define ASSERT_FCB(F) \
188 NT_ASSERT( (SafeNodeType( F ) == CDFS_NTC_FCB_DATA ) || \
189 (SafeNodeType( F ) == CDFS_NTC_FCB_INDEX ) || \
190 (SafeNodeType( F ) == CDFS_NTC_FCB_PATH_TABLE ) )
192 #define ASSERT_OPTIONAL_FCB(F) \
193 NT_ASSERT( ((F) == NULL) || \
194 (SafeNodeType( F ) == CDFS_NTC_FCB_DATA ) || \
195 (SafeNodeType( F ) == CDFS_NTC_FCB_INDEX ) || \
196 (SafeNodeType( F ) == CDFS_NTC_FCB_PATH_TABLE ) )
198 #define ASSERT_FCB_NONPAGED(FN) ASSERT_STRUCT( (FN), CDFS_NTC_FCB_NONPAGED )
199 #define ASSERT_OPTIONAL_FCB_NONPAGED(FN) ASSERT_OPTIONAL_STRUCT( (FN), CDFS_NTC_FCB_NONPAGED )
201 #define ASSERT_CCB(C) ASSERT_STRUCT( (C), CDFS_NTC_CCB )
202 #define ASSERT_OPTIONAL_CCB(C) ASSERT_OPTIONAL_STRUCT( (C), CDFS_NTC_CCB )
204 #define ASSERT_IRP_CONTEXT(IC) ASSERT_STRUCT( (IC), CDFS_NTC_IRP_CONTEXT )
205 #define ASSERT_OPTIONAL_IRP_CONTEXT(IC) ASSERT_OPTIONAL_STRUCT( (IC), CDFS_NTC_IRP_CONTEXT )
207 #define ASSERT_IRP(I) ASSERT_STRUCT( (I), IO_TYPE_IRP )
208 #define ASSERT_OPTIONAL_IRP(I) ASSERT_OPTIONAL_STRUCT( (I), IO_TYPE_IRP )
210 #define ASSERT_FILE_OBJECT(FO) ASSERT_STRUCT( (FO), IO_TYPE_FILE )
211 #define ASSERT_OPTIONAL_FILE_OBJECT(FO) ASSERT_OPTIONAL_STRUCT( (FO), IO_TYPE_FILE )
213 #define ASSERT_EXCLUSIVE_RESOURCE(R) NT_ASSERT( ExIsResourceAcquiredExclusiveLite( R ))
215 #define ASSERT_SHARED_RESOURCE(R) NT_ASSERT( ExIsResourceAcquiredSharedLite( R ))
217 #define ASSERT_RESOURCE_NOT_MINE(R) NT_ASSERT( !ExIsResourceAcquiredSharedLite( R ))
219 #define ASSERT_EXCLUSIVE_CDDATA NT_ASSERT( ExIsResourceAcquiredExclusiveLite( &CdData.DataResource ))
220 #define ASSERT_EXCLUSIVE_VCB(V) NT_ASSERT( ExIsResourceAcquiredExclusiveLite( &(V)->VcbResource ))
221 #define ASSERT_SHARED_VCB(V) NT_ASSERT( ExIsResourceAcquiredSharedLite( &(V)->VcbResource ))
223 #define ASSERT_EXCLUSIVE_FCB(F) NT_ASSERT( ExIsResourceAcquiredExclusiveLite( &(F)->FcbNonpaged->FcbResource ))
224 #define ASSERT_SHARED_FCB(F) NT_ASSERT( ExIsResourceAcquiredSharedLite( &(F)->FcbNonpaged->FcbResource ))
226 #define ASSERT_EXCLUSIVE_FILE(F) NT_ASSERT( ExIsResourceAcquiredExclusiveLite( (F)->Resource ))
227 #define ASSERT_SHARED_FILE(F) NT_ASSERT( ExIsResourceAcquiredSharedLite( (F)->Resource ))
229 #define ASSERT_LOCKED_VCB(V) NT_ASSERT( (V)->VcbLockThread == PsGetCurrentThread() )
230 #define ASSERT_NOT_LOCKED_VCB(V) NT_ASSERT( (V)->VcbLockThread != PsGetCurrentThread() )
232 #define ASSERT_LOCKED_FCB(F) NT_ASSERT( !FlagOn( (F)->FcbState, FCB_STATE_IN_FCB_TABLE) || ((F)->FcbLockThread == PsGetCurrentThread()))
233 #define ASSERT_NOT_LOCKED_FCB(F) NT_ASSERT( (F)->FcbLockThread != PsGetCurrentThread() )
237 #define DebugBreakOnStatus(S) { NOTHING; }
239 #define ASSERT_STRUCT(S,T) { NOTHING; }
240 #define ASSERT_OPTIONAL_STRUCT(S,T) { NOTHING; }
241 #define ASSERT_VCB(V) { NOTHING; }
242 #define ASSERT_OPTIONAL_VCB(V) { NOTHING; }
243 #define ASSERT_FCB(F) { NOTHING; }
244 #define ASSERT_OPTIONAL_FCB(F) { NOTHING; }
245 #define ASSERT_FCB_NONPAGED(FN) { NOTHING; }
246 #define ASSERT_OPTIONAL_FCB(FN) { NOTHING; }
247 #define ASSERT_CCB(C) { NOTHING; }
248 #define ASSERT_OPTIONAL_CCB(C) { NOTHING; }
249 #define ASSERT_IRP_CONTEXT(IC) { NOTHING; }
250 #define ASSERT_OPTIONAL_IRP_CONTEXT(IC) { NOTHING; }
251 #define ASSERT_IRP(I) { NOTHING; }
252 #define ASSERT_OPTIONAL_IRP(I) { NOTHING; }
253 #define ASSERT_FILE_OBJECT(FO) { NOTHING; }
254 #define ASSERT_OPTIONAL_FILE_OBJECT(FO) { NOTHING; }
255 #define ASSERT_EXCLUSIVE_RESOURCE(R) { NOTHING; }
256 #define ASSERT_SHARED_RESOURCE(R) { NOTHING; }
257 #define ASSERT_RESOURCE_NOT_MINE(R) { NOTHING; }
258 #define ASSERT_EXCLUSIVE_CDDATA { NOTHING; }
259 #define ASSERT_EXCLUSIVE_VCB(V) { NOTHING; }
260 #define ASSERT_SHARED_VCB(V) { NOTHING; }
261 #define ASSERT_EXCLUSIVE_FCB(F) { NOTHING; }
262 #define ASSERT_SHARED_FCB(F) { NOTHING; }
263 #define ASSERT_EXCLUSIVE_FILE(F) { NOTHING; }
264 #define ASSERT_SHARED_FILE(F) { NOTHING; }
265 #define ASSERT_LOCKED_VCB(V) { NOTHING; }
266 #define ASSERT_NOT_LOCKED_VCB(V) { NOTHING; }
267 #define ASSERT_LOCKED_FCB(F) { NOTHING; }
268 #define ASSERT_NOT_LOCKED_FCB(F) { NOTHING; }