ReactOS 0.4.15-dev-8339-g4028de8
fatdata.h
Go to the documentation of this file.
1/*++
2
3Copyright (c) 1989-2000 Microsoft Corporation
4
5Module Name:
6
7 FatData.c
8
9Abstract:
10
11 This module declares the global data used by the Fat file system.
12
13
14--*/
15
16#ifndef _FATDATA_
17#define _FATDATA_
18
19//
20// The global fsd data record, and a global zero large integer
21//
22
23extern FAT_DATA FatData;
24
26
30
33
36
45
47
49#define FAT_SHIFT10000 13
50
52#define FAT_SHIFT86400000 26
53
54#define FatConvert100nsToMilliseconds(LARGE_INTEGER) ( \
55 RtlExtendedMagicDivide( (LARGE_INTEGER), FatMagic10000, FAT_SHIFT10000 )\
56 )
57
58#define FatConvertMillisecondsToDays(LARGE_INTEGER) ( \
59 RtlExtendedMagicDivide( (LARGE_INTEGER), FatMagic86400000, FAT_SHIFT86400000 ) \
60 )
61
62#define FatConvertDaysToMilliseconds(DAYS) ( \
63 Int32x32To64( (DAYS), 86400000 ) \
64 )
65
66//
67// Reserve MDL for paging file io forward progress.
68//
69
70#define FAT_RESERVE_MDL_SIZE 16
71
72#ifndef __REACTOS__
73__volatile extern PMDL FatReserveMdl;
74#else
75extern __volatile PMDL FatReserveMdl;
76#endif
78
79//
80// The global structure used to contain our fast I/O callbacks
81//
82
84
85//
86// Global to store disk IO accounting Enabled/Disabled state
87//
88
89extern LOGICAL FatDiskAccountingEnabled;
90
91//
92// Read ahead amount used for normal data files
93//
94
95#define READ_AHEAD_GRANULARITY (0x10000)
96
97//
98// Define maximum number of parallel Reads or Writes that will be generated
99// per one request.
100//
101
102#define FAT_MAX_IO_RUNS_ON_STACK ((ULONG) 5)
103
104//
105// Define the maximum number of delayed closes.
106//
107
108#define FAT_MAX_DELAYED_CLOSES ((ULONG)16)
109
111
112//
113// The maximum chunk size we use when defragmenting files.
114//
115
116#define FAT_DEFAULT_DEFRAG_CHUNK_IN_BYTES (0x10000)
117
118//
119// Define constant for time rounding.
120//
121
122#define TenMSec (10*1000*10)
123#define TwoSeconds (2*1000*1000*10)
124#define AlmostTenMSec (TenMSec - 1)
125#define AlmostTwoSeconds (TwoSeconds - 1)
126
127// too big #define HighPartPerDay (24*60*60*1000*1000*10 >> 32)
128
129#define HighPartPerDay (52734375 >> 18)
130
131//
132// The global Fat debug level variable, its values are:
133//
134// 0x00000000 Always gets printed (used when about to bug check)
135//
136// 0x00000001 Error conditions
137// 0x00000002 Debug hooks
138// 0x00000004 Catch exceptions before completing Irp
139// 0x00000008
140//
141// 0x00000010
142// 0x00000020
143// 0x00000040
144// 0x00000080
145//
146// 0x00000100
147// 0x00000200
148// 0x00000400
149// 0x00000800
150//
151// 0x00001000
152// 0x00002000
153// 0x00004000
154// 0x00008000
155//
156// 0x00010000
157// 0x00020000
158// 0x00040000
159// 0x00080000
160//
161// 0x00100000
162// 0x00200000
163// 0x00400000
164// 0x00800000
165//
166// 0x01000000
167// 0x02000000
168// 0x04000000
169// 0x08000000
170//
171// 0x10000000
172// 0x20000000
173// 0x40000000
174// 0x80000000
175//
176
177
178#ifdef FASTFATDBG
179
180#define DEBUG_TRACE_ERROR (0x00000001)
181#define DEBUG_TRACE_DEBUG_HOOKS (0x00000002)
182#define DEBUG_TRACE_CATCH_EXCEPTIONS (0x00000004)
183#define DEBUG_TRACE_UNWIND (0x00000008)
184#define DEBUG_TRACE_CLEANUP (0x00000010)
185#define DEBUG_TRACE_CLOSE (0x00000020)
186#define DEBUG_TRACE_CREATE (0x00000040)
187#define DEBUG_TRACE_DIRCTRL (0x00000080)
188#define DEBUG_TRACE_EA (0x00000100)
189#define DEBUG_TRACE_FILEINFO (0x00000200)
190#define DEBUG_TRACE_FSCTRL (0x00000400)
191#define DEBUG_TRACE_LOCKCTRL (0x00000800)
192#define DEBUG_TRACE_READ (0x00001000)
193#define DEBUG_TRACE_VOLINFO (0x00002000)
194#define DEBUG_TRACE_WRITE (0x00004000)
195#define DEBUG_TRACE_FLUSH (0x00008000)
196#define DEBUG_TRACE_DEVCTRL (0x00010000)
197#define DEBUG_TRACE_SHUTDOWN (0x00020000)
198#define DEBUG_TRACE_FATDATA (0x00040000)
199#define DEBUG_TRACE_PNP (0x00080000)
200#define DEBUG_TRACE_ACCHKSUP (0x00100000)
201#define DEBUG_TRACE_ALLOCSUP (0x00200000)
202#define DEBUG_TRACE_DIRSUP (0x00400000)
203#define DEBUG_TRACE_FILOBSUP (0x00800000)
204#define DEBUG_TRACE_NAMESUP (0x01000000)
205#define DEBUG_TRACE_VERFYSUP (0x02000000)
206#define DEBUG_TRACE_CACHESUP (0x04000000)
207#define DEBUG_TRACE_SPLAYSUP (0x08000000)
208#define DEBUG_TRACE_DEVIOSUP (0x10000000)
209#define DEBUG_TRACE_STRUCSUP (0x20000000)
210#define DEBUG_TRACE_FSP_DISPATCHER (0x40000000)
211#define DEBUG_TRACE_FSP_DUMP (0x80000000)
212
213extern LONG FatDebugTraceLevel;
214extern LONG FatDebugTraceIndent;
215
216#define DebugTrace(INDENT,LEVEL,X,Y) { \
217 LONG _i; \
218 if (((LEVEL) == 0) || (FatDebugTraceLevel & (LEVEL))) { \
219 _i = (ULONG)PsGetCurrentThread(); \
220 DbgPrint("%08lx:",_i); \
221 if ((INDENT) < 0) { \
222 FatDebugTraceIndent += (INDENT); \
223 } \
224 if (FatDebugTraceIndent < 0) { \
225 FatDebugTraceIndent = 0; \
226 } \
227 for (_i = 0; _i < FatDebugTraceIndent; _i += 1) { \
228 DbgPrint(" "); \
229 } \
230 DbgPrint(X,Y); \
231 if ((INDENT) > 0) { \
232 FatDebugTraceIndent += (INDENT); \
233 } \
234 } \
235}
236
237#if !defined(__REACTOS__) || defined(_MSC_VER)
238#define DebugDump(STR,LEVEL,PTR) { \
239 __pragma(warning(push)) \
240 __pragma(warning(disable:4210)) \
241 ULONG _i; \
242 VOID FatDump(IN PVOID Ptr); \
243 if (((LEVEL) == 0) || (FatDebugTraceLevel & (LEVEL))) { \
244 _i = (ULONG)PsGetCurrentThread(); \
245 DbgPrint("%08lx:",_i); \
246 DbgPrint(STR); \
247 if (PTR != NULL) {FatDump(PTR);} \
248 NT_ASSERT(FALSE); \
249 } \
250 __pragma(warning(pop)) \
251}
252#else
253#define DebugDump(STR,LEVEL,PTR) { \
254 ULONG _i; \
255 VOID FatDump(IN PVOID Ptr); \
256 if (((LEVEL) == 0) || (FatDebugTraceLevel & (LEVEL))) { \
257 _i = (ULONG)PsGetCurrentThread(); \
258 DbgPrint("%08lx:",_i); \
259 DbgPrint(STR); \
260 if (PTR != NULL) {FatDump(PTR);} \
261 NT_ASSERT(FALSE); \
262 } \
263}
264#endif
265
266#define DebugUnwind(X) { \
267 if (_SEH2_AbnormalTermination()) { \
268 DebugTrace(0, DEBUG_TRACE_UNWIND, #X ", Abnormal termination.\n", 0); \
269 } \
270}
271
272//
273// The following variables are used to keep track of the total amount
274// of requests processed by the file system, and the number of requests
275// that end up being processed by the Fsp thread. The first variable
276// is incremented whenever an Irp context is created (which is always
277// at the start of an Fsd entry point) and the second is incremented
278// by read request.
279//
280
281extern ULONG FatFsdEntryCount;
282extern ULONG FatFspEntryCount;
283extern ULONG FatIoCallDriverCount;
284extern ULONG FatTotalTicks[];
285
286#define DebugDoit(X) {X;}
287
288extern LONG FatPerformanceTimerLevel;
289
290#define TimerStart(LEVEL) { \
291 LARGE_INTEGER TStart, TEnd; \
292 LARGE_INTEGER TElapsed; \
293 TStart = KeQueryPerformanceCounter( NULL ); \
294
295#define TimerStop(LEVEL,s) \
296 TEnd = KeQueryPerformanceCounter( NULL ); \
297 TElapsed.QuadPart = TEnd.QuadPart - TStart.QuadPart; \
298 FatTotalTicks[FatLogOf(LEVEL)] += TElapsed.LowPart; \
299 if (FlagOn( FatPerformanceTimerLevel, (LEVEL))) { \
300 DbgPrint("Time of %s %ld\n", (s), TElapsed.LowPart ); \
301 } \
302}
303
304//
305// I need this because C can't support conditional compilation within
306// a macro.
307//
308
309extern PVOID FatNull;
310
311#else
312
313#define DebugTrace(INDENT,LEVEL,X,Y) {NOTHING;}
314#define DebugDump(STR,LEVEL,PTR) {NOTHING;}
315#define DebugUnwind(X) {NOTHING;}
316#define DebugDoit(X) {NOTHING;}
317
318#define TimerStart(LEVEL)
319#define TimerStop(LEVEL,s)
320
321#define FatNull NULL
322
323#endif // FASTFATDBG
324
325//
326// The following macro is for all people who compile with the DBG switch
327// set, not just fastfat dbg users
328//
329
330#if DBG
331
332#define DbgDoit(X) {X;}
333
334#else
335
336#define DbgDoit(X) {NOTHING;}
337
338#endif // DBG
339
340#if DBG
341
342extern NTSTATUS FatBreakOnInterestingIoCompletion;
343extern NTSTATUS FatBreakOnInterestingExceptionStatus;
344extern NTSTATUS FatBreakOnInterestingIrpCompletion;
345
346extern BOOLEAN FatTestRaisedStatus;
347
348#endif
349
350#endif // _FATDATA_
351
352
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
NPAGED_LOOKASIDE_LIST FatNonPagedFcbLookasideList
Definition: fatdata.c:103
#define FatNull
Definition: fatdata.h:321
FAST_MUTEX FatCloseQueueMutex
Definition: fatdata.c:112
PDEVICE_OBJECT FatDiskFileSystemDeviceObject
Definition: fatdata.c:58
LARGE_INTEGER FatJanOne1980
Definition: fatdata.c:73
LARGE_INTEGER FatDecThirtyOne1979
Definition: fatdata.c:74
KEVENT FatReserveEvent
Definition: fatdata.c:123
LARGE_INTEGER Fat30Milliseconds
Definition: fatdata.c:70
FAT_TIME_STAMP FatTimeJanOne1980
Definition: fatdata.c:83
SLIST_HEADER FatCloseContextSList
Definition: fatdata.c:106
LOGICAL FatDiskAccountingEnabled
Definition: fatdata.c:129
LARGE_INTEGER FatMaxLarge
Definition: fatdata.c:63
LARGE_INTEGER FatLargeZero
Definition: fatdata.c:62
ULONG FatMaxDelayedCloseCount
Definition: close.c:31
LARGE_INTEGER FatOneSecond
NPAGED_LOOKASIDE_LIST FatIrpContextLookasideList
Definition: fatdata.c:102
LARGE_INTEGER FatMagic10000
Definition: fatdata.c:86
NPAGED_LOOKASIDE_LIST FatEResourceLookasideList
Definition: fatdata.c:104
FAST_IO_DISPATCH FatFastIoDispatch
Definition: fatdata.c:96
__volatile PMDL FatReserveMdl
Definition: fatdata.c:119
FAT_DATA FatData
Definition: fatdata.c:56
LARGE_INTEGER FatMagic86400000
Definition: fatdata.c:87
LARGE_INTEGER FatOneDay
Definition: fatdata.c:72
IO_STATUS_BLOCK FatGarbageIosb
LARGE_INTEGER Fat100Milliseconds
Definition: fatdata.c:71
PDEVICE_OBJECT FatCdromFileSystemDeviceObject
Definition: fatdata.c:59
long LONG
Definition: pedump.c:60
uint32_t ULONG
Definition: typedefs.h:59
FAST_MUTEX
Definition: extypes.h:17
struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST NPAGED_LOOKASIDE_LIST