/*++ Copyright (c) 1989-2000 Microsoft Corporation Module Name: FatData.c Abstract: This module declares the global data used by the Fat file system. // @@BEGIN_DDKSPLIT Author: Gary Kimura [GaryKi] 28-Dec-1989 Revision History: // @@END_DDKSPLIT --*/ #ifndef _FATDATA_ #define _FATDATA_ // // The global fsd data record, and a global zero large integer // extern FAT_DATA FatData; extern IO_STATUS_BLOCK FatGarbageIosb; extern NPAGED_LOOKASIDE_LIST FatIrpContextLookasideList; extern NPAGED_LOOKASIDE_LIST FatNonPagedFcbLookasideList; extern NPAGED_LOOKASIDE_LIST FatEResourceLookasideList; extern PAGED_LOOKASIDE_LIST FatFcbLookasideList; extern PAGED_LOOKASIDE_LIST FatCcbLookasideList; extern SLIST_HEADER FatCloseContextSList; extern FAST_MUTEX FatCloseQueueMutex; extern PDEVICE_OBJECT FatDiskFileSystemDeviceObject; extern PDEVICE_OBJECT FatCdromFileSystemDeviceObject; extern LARGE_INTEGER FatLargeZero; extern LARGE_INTEGER FatMaxLarge; extern LARGE_INTEGER Fat30Milliseconds; extern LARGE_INTEGER Fat100Milliseconds; extern LARGE_INTEGER FatOneSecond; extern LARGE_INTEGER FatOneDay; extern LARGE_INTEGER FatJanOne1980; extern LARGE_INTEGER FatDecThirtyOne1979; extern FAT_TIME_STAMP FatTimeJanOne1980; extern LARGE_INTEGER FatMagic10000; #define FAT_SHIFT10000 13 extern LARGE_INTEGER FatMagic86400000; #define FAT_SHIFT86400000 26 #define FatConvert100nsToMilliseconds(LARGE_INTEGER) ( \ RtlExtendedMagicDivide( (LARGE_INTEGER), FatMagic10000, FAT_SHIFT10000 )\ ) #define FatConvertMillisecondsToDays(LARGE_INTEGER) ( \ RtlExtendedMagicDivide( (LARGE_INTEGER), FatMagic86400000, FAT_SHIFT86400000 ) \ ) #define FatConvertDaysToMilliseconds(DAYS) ( \ Int32x32To64( (DAYS), 86400000 ) \ ) // // Reserve MDL for paging file io forward progress. // #define FAT_RESERVE_MDL_SIZE 16 extern PMDL FatReserveMdl; extern KEVENT FatReserveEvent; // // The global structure used to contain our fast I/O callbacks // extern FAST_IO_DISPATCH FatFastIoDispatch; // // Read ahead amount used for normal data files // #define READ_AHEAD_GRANULARITY (0x10000) // // Define maximum number of parallel Reads or Writes that will be generated // per one request. // #define FAT_MAX_IO_RUNS_ON_STACK ((ULONG) 5) // // Define the maximum number of delayed closes. // #define FAT_MAX_DELAYED_CLOSES ((ULONG)16) extern ULONG FatMaxDelayedCloseCount; // // 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 the Root Directory // #define FAT_RESIDUAL_USER_REFERENCE (2) // // Define constant for time rounding. // #define TenMSec (10*1000*10) #define TwoSeconds (2*1000*1000*10) #define AlmostTenMSec (TenMSec - 1) #define AlmostTwoSeconds (TwoSeconds - 1) // too big #define HighPartPerDay (24*60*60*1000*1000*10 >> 32) #define HighPartPerDay (52734375 >> 18) // // The global Fat debug level variable, its values are: // // 0x00000000 Always gets printed (used when about to bug check) // // 0x00000001 Error conditions // 0x00000002 Debug hooks // 0x00000004 Catch exceptions before completing Irp // 0x00000008 // // 0x00000010 // 0x00000020 // 0x00000040 // 0x00000080 // // 0x00000100 // 0x00000200 // 0x00000400 // 0x00000800 // // 0x00001000 // 0x00002000 // 0x00004000 // 0x00008000 // // 0x00010000 // 0x00020000 // 0x00040000 // 0x00080000 // // 0x00100000 // 0x00200000 // 0x00400000 // 0x00800000 // // 0x01000000 // 0x02000000 // 0x04000000 // 0x08000000 // // 0x10000000 // 0x20000000 // 0x40000000 // 0x80000000 // #ifdef FASTFATDBG #define DEBUG_TRACE_ERROR (0x00000001) #define DEBUG_TRACE_DEBUG_HOOKS (0x00000002) #define DEBUG_TRACE_CATCH_EXCEPTIONS (0x00000004) #define DEBUG_TRACE_UNWIND (0x00000008) #define DEBUG_TRACE_CLEANUP (0x00000010) #define DEBUG_TRACE_CLOSE (0x00000020) #define DEBUG_TRACE_CREATE (0x00000040) #define DEBUG_TRACE_DIRCTRL (0x00000080) #define DEBUG_TRACE_EA (0x00000100) #define DEBUG_TRACE_FILEINFO (0x00000200) #define DEBUG_TRACE_FSCTRL (0x00000400) #define DEBUG_TRACE_LOCKCTRL (0x00000800) #define DEBUG_TRACE_READ (0x00001000) #define DEBUG_TRACE_VOLINFO (0x00002000) #define DEBUG_TRACE_WRITE (0x00004000) #define DEBUG_TRACE_FLUSH (0x00008000) #define DEBUG_TRACE_DEVCTRL (0x00010000) #define DEBUG_TRACE_SHUTDOWN (0x00020000) #define DEBUG_TRACE_FATDATA (0x00040000) #define DEBUG_TRACE_PNP (0x00080000) #define DEBUG_TRACE_ACCHKSUP (0x00100000) #define DEBUG_TRACE_ALLOCSUP (0x00200000) #define DEBUG_TRACE_DIRSUP (0x00400000) #define DEBUG_TRACE_FILOBSUP (0x00800000) #define DEBUG_TRACE_NAMESUP (0x01000000) #define DEBUG_TRACE_VERFYSUP (0x02000000) #define DEBUG_TRACE_CACHESUP (0x04000000) #define DEBUG_TRACE_SPLAYSUP (0x08000000) #define DEBUG_TRACE_DEVIOSUP (0x10000000) #define DEBUG_TRACE_STRUCSUP (0x20000000) #define DEBUG_TRACE_FSP_DISPATCHER (0x40000000) #define DEBUG_TRACE_FSP_DUMP (0x80000000) extern LONG FatDebugTraceLevel; extern LONG FatDebugTraceIndent; #define DebugTrace(INDENT,LEVEL,X,Y) { \ LONG _i; \ if (((LEVEL) == 0) || (FatDebugTraceLevel & (LEVEL))) { \ _i = (ULONG)PsGetCurrentThread(); \ DbgPrint("%08lx:",_i); \ if ((INDENT) < 0) { \ FatDebugTraceIndent += (INDENT); \ } \ if (FatDebugTraceIndent < 0) { \ FatDebugTraceIndent = 0; \ } \ for (_i = 0; _i < FatDebugTraceIndent; _i += 1) { \ DbgPrint(" "); \ } \ DbgPrint(X,Y); \ if ((INDENT) > 0) { \ FatDebugTraceIndent += (INDENT); \ } \ } \ } #define DebugDump(STR,LEVEL,PTR) { \ ULONG _i; \ VOID FatDump(IN PVOID Ptr); \ if (((LEVEL) == 0) || (FatDebugTraceLevel & (LEVEL))) { \ _i = (ULONG)PsGetCurrentThread(); \ DbgPrint("%08lx:",_i); \ DbgPrint(STR); \ if (PTR != NULL) {FatDump(PTR);} \ DbgBreakPoint(); \ } \ } #define DebugUnwind(X) { \ if (AbnormalTermination()) { \ DebugTrace(0, DEBUG_TRACE_UNWIND, #X ", Abnormal termination.\n", 0); \ } \ } // // The following variables are used to keep track of the total amount // of requests processed by the file system, and the number of requests // that end up being processed by the Fsp thread. The first variable // is incremented whenever an Irp context is created (which is always // at the start of an Fsd entry point) and the second is incremented // by read request. // extern ULONG FatFsdEntryCount; extern ULONG FatFspEntryCount; extern ULONG FatIoCallDriverCount; extern ULONG FatTotalTicks[]; #define DebugDoit(X) {X;} extern LONG FatPerformanceTimerLevel; #define TimerStart(LEVEL) { \ LARGE_INTEGER TStart, TEnd; \ LARGE_INTEGER TElapsed; \ TStart = KeQueryPerformanceCounter( NULL ); \ #define TimerStop(LEVEL,s) \ TEnd = KeQueryPerformanceCounter( NULL ); \ TElapsed.QuadPart = TEnd.QuadPart - TStart.QuadPart; \ FatTotalTicks[FatLogOf(LEVEL)] += TElapsed.LowPart; \ if (FlagOn( FatPerformanceTimerLevel, (LEVEL))) { \ DbgPrint("Time of %s %ld\n", (s), TElapsed.LowPart ); \ } \ } // // I need this because C can't support conditional compilation within // a macro. // extern PVOID FatNull; #else #define DebugTrace(INDENT,LEVEL,X,Y) {NOTHING;} #define DebugDump(STR,LEVEL,PTR) {NOTHING;} #define DebugUnwind(X) {NOTHING;} #define DebugDoit(X) {NOTHING;} #define TimerStart(LEVEL) #define TimerStop(LEVEL,s) #define FatNull NULL #endif // FASTFATDBG // // The following macro is for all people who compile with the DBG switch // set, not just fastfat dbg users // #if DBG #define DbgDoit(X) {X;} #else #define DbgDoit(X) {NOTHING;} #endif // DBG #if DBG extern NTSTATUS FatAssertNotStatus; extern BOOLEAN FatTestRaisedStatus; #endif #endif // _FATDATA_