ReactOS  0.4.14-dev-323-g6fe6a88
fatdata.h
Go to the documentation of this file.
1 /*++
2 
3 Copyright (c) 1989-2000 Microsoft Corporation
4 
5 Module Name:
6 
7  FatData.c
8 
9 Abstract:
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 
23 extern 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
75 extern __volatile PMDL FatReserveMdl;
76 #endif
77 extern KEVENT FatReserveEvent;
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 
89 extern 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 
213 extern LONG FatDebugTraceLevel;
214 extern 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 #ifdef _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 
281 extern ULONG FatFsdEntryCount;
282 extern ULONG FatFspEntryCount;
283 extern ULONG FatIoCallDriverCount;
284 extern ULONG FatTotalTicks[];
285 
286 #define DebugDoit(X) {X;}
287 
288 extern 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 
309 extern 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 
342 extern NTSTATUS FatBreakOnInterestingIoCompletion;
343 extern NTSTATUS FatBreakOnInterestingExceptionStatus;
344 extern NTSTATUS FatBreakOnInterestingIrpCompletion;
345 
346 extern BOOLEAN FatTestRaisedStatus;
347 
348 #endif
349 
350 #endif // _FATDATA_
351 
352 
LARGE_INTEGER FatDecThirtyOne1979
Definition: fatdata.c:74
struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST NPAGED_LOOKASIDE_LIST
NPAGED_LOOKASIDE_LIST FatEResourceLookasideList
Definition: fatdata.c:104
__volatile PMDL FatReserveMdl
Definition: fatdata.c:119
LONG NTSTATUS
Definition: precomp.h:26
#define FatNull
Definition: fatdata.h:321
LOGICAL FatDiskAccountingEnabled
Definition: fatdata.c:129
LARGE_INTEGER FatMagic10000
Definition: fatdata.c:86
SLIST_HEADER FatCloseContextSList
Definition: fatdata.c:106
FAST_MUTEX FatCloseQueueMutex
Definition: fatdata.c:112
FAT_TIME_STAMP FatTimeJanOne1980
Definition: fatdata.c:83
long LONG
Definition: pedump.c:60
unsigned char BOOLEAN
LARGE_INTEGER FatMagic86400000
Definition: fatdata.c:87
LARGE_INTEGER FatOneDay
Definition: fatdata.c:72
IO_STATUS_BLOCK FatGarbageIosb
FAST_MUTEX
Definition: extypes.h:17
FAT_DATA FatData
Definition: fatdata.c:56
NPAGED_LOOKASIDE_LIST FatIrpContextLookasideList
Definition: fatdata.c:102
LARGE_INTEGER FatMaxLarge
Definition: fatdata.c:63
LARGE_INTEGER FatLargeZero
Definition: fatdata.c:62
KEVENT FatReserveEvent
Definition: fatdata.c:123
LARGE_INTEGER FatJanOne1980
Definition: fatdata.c:73
LARGE_INTEGER Fat100Milliseconds
Definition: fatdata.c:71
NPAGED_LOOKASIDE_LIST FatNonPagedFcbLookasideList
Definition: fatdata.c:103
PDEVICE_OBJECT FatDiskFileSystemDeviceObject
Definition: fatdata.c:58
LARGE_INTEGER Fat30Milliseconds
Definition: fatdata.c:70
ULONG FatMaxDelayedCloseCount
Definition: close.c:31
unsigned int ULONG
Definition: retypes.h:1
LARGE_INTEGER FatOneSecond
PDEVICE_OBJECT FatCdromFileSystemDeviceObject
Definition: fatdata.c:59
FAST_IO_DISPATCH FatFastIoDispatch
Definition: fatdata.c:96