16dd1f67f054fbcde754d008782423f132fedba5
[reactos.git] / ntoskrnl / include / internal / cc.h
1 #pragma once
2
3 //
4 // Define this if you want debugging support
5 //
6 #define _CC_DEBUG_ 0x00
7
8 //
9 // These define the Debug Masks Supported
10 //
11 #define CC_API_DEBUG 0x01
12
13 //
14 // Debug/Tracing support
15 //
16 #if _CC_DEBUG_
17 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
18 #define CCTRACE(x, ...) \
19 { \
20 DbgPrintEx("%s [%.16s] - ", \
21 __FUNCTION__, \
22 PsGetCurrentProcess()->ImageFileName); \
23 DbgPrintEx(__VA_ARGS__); \
24 }
25 #else
26 #define CCTRACE(x, ...) \
27 if (x & CcRosTraceLevel) \
28 { \
29 DbgPrint("%s [%.16s] - ", \
30 __FUNCTION__, \
31 PsGetCurrentProcess()->ImageFileName); \
32 DbgPrint(__VA_ARGS__); \
33 }
34 #endif
35 #else
36 #define CCTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
37 #endif
38
39 //
40 // Global Cc Data
41 //
42 extern ULONG CcRosTraceLevel;
43 extern LIST_ENTRY DirtyVacbListHead;
44 extern ULONG CcDirtyPageThreshold;
45 extern ULONG CcTotalDirtyPages;
46 extern LIST_ENTRY CcDeferredWrites;
47 extern KSPIN_LOCK CcDeferredWriteSpinLock;
48 extern ULONG CcNumberWorkerThreads;
49 extern LIST_ENTRY CcIdleWorkerThreadList;
50 extern LIST_ENTRY CcExpressWorkQueue;
51 extern LIST_ENTRY CcRegularWorkQueue;
52 extern LIST_ENTRY CcPostTickWorkQueue;
53 extern NPAGED_LOOKASIDE_LIST CcTwilightLookasideList;
54 extern LARGE_INTEGER CcIdleDelay;
55
56 //
57 // Counters
58 //
59 extern ULONG CcLazyWritePages;
60 extern ULONG CcLazyWriteIos;
61 extern ULONG CcMapDataWait;
62 extern ULONG CcMapDataNoWait;
63 extern ULONG CcPinReadWait;
64 extern ULONG CcPinReadNoWait;
65 extern ULONG CcDataPages;
66 extern ULONG CcDataFlushes;
67
68 typedef struct _PF_SCENARIO_ID
69 {
70 WCHAR ScenName[30];
71 ULONG HashId;
72 } PF_SCENARIO_ID, *PPF_SCENARIO_ID;
73
74 typedef struct _PF_LOG_ENTRY
75 {
76 ULONG FileOffset:30;
77 ULONG Type:2;
78 union
79 {
80 ULONG FileKey;
81 ULONG FileSequenceNumber;
82 };
83 } PF_LOG_ENTRY, *PPF_LOG_ENTRY;
84
85 typedef struct _PFSN_LOG_ENTRIES
86 {
87 LIST_ENTRY TraceBuffersLink;
88 LONG NumEntries;
89 LONG MaxEntries;
90 PF_LOG_ENTRY Entries[ANYSIZE_ARRAY];
91 } PFSN_LOG_ENTRIES, *PPFSN_LOG_ENTRIES;
92
93 typedef struct _PF_SECTION_INFO
94 {
95 ULONG FileKey;
96 ULONG FileSequenceNumber;
97 ULONG FileIdLow;
98 ULONG FileIdHigh;
99 } PF_SECTION_INFO, *PPF_SECTION_INFO;
100
101 typedef struct _PF_TRACE_HEADER
102 {
103 ULONG Version;
104 ULONG MagicNumber;
105 ULONG Size;
106 PF_SCENARIO_ID ScenarioId;
107 ULONG ScenarioType; // PF_SCENARIO_TYPE
108 ULONG EventEntryIdxs[8];
109 ULONG NumEventEntryIdxs;
110 ULONG TraceBufferOffset;
111 ULONG NumEntries;
112 ULONG SectionInfoOffset;
113 ULONG NumSections;
114 ULONG FaultsPerPeriod[10];
115 LARGE_INTEGER LaunchTime;
116 ULONGLONG Reserved[5];
117 } PF_TRACE_HEADER, *PPF_TRACE_HEADER;
118
119 typedef struct _PFSN_TRACE_DUMP
120 {
121 LIST_ENTRY CompletedTracesLink;
122 PF_TRACE_HEADER Trace;
123 } PFSN_TRACE_DUMP, *PPFSN_TRACE_DUMP;
124
125 typedef struct _PFSN_TRACE_HEADER
126 {
127 ULONG Magic;
128 LIST_ENTRY ActiveTracesLink;
129 PF_SCENARIO_ID ScenarioId;
130 ULONG ScenarioType; // PF_SCENARIO_TYPE
131 ULONG EventEntryIdxs[8];
132 ULONG NumEventEntryIdxs;
133 PPFSN_LOG_ENTRIES CurrentTraceBuffer;
134 LIST_ENTRY TraceBuffersList;
135 ULONG NumTraceBuffers;
136 KSPIN_LOCK TraceBufferSpinLock;
137 KTIMER TraceTimer;
138 LARGE_INTEGER TraceTimerPeriod;
139 KDPC TraceTimerDpc;
140 KSPIN_LOCK TraceTimerSpinLock;
141 ULONG FaultsPerPeriod[10];
142 LONG LastNumFaults;
143 LONG CurPeriod;
144 LONG NumFaults;
145 LONG MaxFaults;
146 PEPROCESS Process;
147 EX_RUNDOWN_REF RefCount;
148 WORK_QUEUE_ITEM EndTraceWorkItem;
149 LONG EndTraceCalled;
150 PPFSN_TRACE_DUMP TraceDump;
151 NTSTATUS TraceDumpStatus;
152 LARGE_INTEGER LaunchTime;
153 PPF_SECTION_INFO SectionInfo;
154 ULONG SectionInfoCount;
155 } PFSN_TRACE_HEADER, *PPFSN_TRACE_HEADER;
156
157 typedef struct _PFSN_PREFETCHER_GLOBALS
158 {
159 LIST_ENTRY ActiveTraces;
160 KSPIN_LOCK ActiveTracesLock;
161 PPFSN_TRACE_HEADER SystemWideTrace;
162 LIST_ENTRY CompletedTraces;
163 FAST_MUTEX CompletedTracesLock;
164 LONG NumCompletedTraces;
165 PKEVENT CompletedTracesEvent;
166 LONG ActivePrefetches;
167 } PFSN_PREFETCHER_GLOBALS, *PPFSN_PREFETCHER_GLOBALS;
168
169 typedef struct _ROS_SHARED_CACHE_MAP
170 {
171 CSHORT NodeTypeCode;
172 CSHORT NodeByteSize;
173 ULONG OpenCount;
174 LARGE_INTEGER FileSize;
175 LIST_ENTRY BcbList;
176 LARGE_INTEGER SectionSize;
177 PFILE_OBJECT FileObject;
178 ULONG DirtyPages;
179 LIST_ENTRY SharedCacheMapLinks;
180 ULONG Flags;
181 PCACHE_MANAGER_CALLBACKS Callbacks;
182 PVOID LazyWriteContext;
183 LIST_ENTRY PrivateList;
184 ULONG DirtyPageThreshold;
185 KSPIN_LOCK BcbSpinLock;
186 PRIVATE_CACHE_MAP PrivateCacheMap;
187
188 /* ROS specific */
189 LIST_ENTRY CacheMapVacbListHead;
190 ULONG TimeStamp;
191 BOOLEAN PinAccess;
192 KSPIN_LOCK CacheMapLock;
193 #if DBG
194 BOOLEAN Trace; /* enable extra trace output for this cache map and it's VACBs */
195 #endif
196 } ROS_SHARED_CACHE_MAP, *PROS_SHARED_CACHE_MAP;
197
198 #define READAHEAD_DISABLED 0x1
199 #define WRITEBEHIND_DISABLED 0x2
200
201 typedef struct _ROS_VACB
202 {
203 /* Base address of the region where the view's data is mapped. */
204 PVOID BaseAddress;
205 /* Memory area representing the region where the view's data is mapped. */
206 struct _MEMORY_AREA* MemoryArea;
207 /* Are the contents of the view valid. */
208 BOOLEAN Valid;
209 /* Are the contents of the view newer than those on disk. */
210 BOOLEAN Dirty;
211 /* Page out in progress */
212 BOOLEAN PageOut;
213 ULONG MappedCount;
214 /* Entry in the list of VACBs for this shared cache map. */
215 LIST_ENTRY CacheMapVacbListEntry;
216 /* Entry in the list of VACBs which are dirty. */
217 LIST_ENTRY DirtyVacbListEntry;
218 /* Entry in the list of VACBs. */
219 LIST_ENTRY VacbLruListEntry;
220 /* Offset in the file which this view maps. */
221 LARGE_INTEGER FileOffset;
222 /* Number of references. */
223 volatile ULONG ReferenceCount;
224 /* Pointer to the shared cache map for the file which this view maps data for. */
225 PROS_SHARED_CACHE_MAP SharedCacheMap;
226 /* Pointer to the next VACB in a chain. */
227 } ROS_VACB, *PROS_VACB;
228
229 typedef struct _INTERNAL_BCB
230 {
231 /* Lock */
232 ERESOURCE Lock;
233 PUBLIC_BCB PFCB;
234 PROS_VACB Vacb;
235 BOOLEAN Dirty;
236 ULONG PinCount;
237 CSHORT RefCount; /* (At offset 0x34 on WinNT4) */
238 LIST_ENTRY BcbEntry;
239 } INTERNAL_BCB, *PINTERNAL_BCB;
240
241 typedef struct _LAZY_WRITER
242 {
243 LIST_ENTRY WorkQueue;
244 KDPC ScanDpc;
245 KTIMER ScanTimer;
246 BOOLEAN ScanActive;
247 BOOLEAN OtherWork;
248 BOOLEAN PendingTeardown;
249 } LAZY_WRITER, *PLAZY_WRITER;
250
251 typedef struct _WORK_QUEUE_ENTRY
252 {
253 LIST_ENTRY WorkQueueLinks;
254 union
255 {
256 struct
257 {
258 FILE_OBJECT *FileObject;
259 } Read;
260 struct
261 {
262 SHARED_CACHE_MAP *SharedCacheMap;
263 } Write;
264 struct
265 {
266 KEVENT *Event;
267 } Event;
268 struct
269 {
270 unsigned long Reason;
271 } Notification;
272 } Parameters;
273 unsigned char Function;
274 } WORK_QUEUE_ENTRY, *PWORK_QUEUE_ENTRY;
275
276 typedef enum _WORK_QUEUE_FUNCTIONS
277 {
278 ReadAhead = 1,
279 WriteBehind = 2,
280 LazyWrite = 3,
281 SetDone = 4,
282 } WORK_QUEUE_FUNCTIONS, *PWORK_QUEUE_FUNCTIONS;
283
284 extern LAZY_WRITER LazyWriter;
285
286 #define NODE_TYPE_DEFERRED_WRITE 0x02FC
287 #define NODE_TYPE_PRIVATE_MAP 0x02FE
288 #define NODE_TYPE_SHARED_MAP 0x02FF
289
290 VOID
291 NTAPI
292 CcPfInitializePrefetcher(
293 VOID
294 );
295
296 VOID
297 NTAPI
298 CcMdlReadComplete2(
299 IN PFILE_OBJECT FileObject,
300 IN PMDL MemoryDescriptorList
301 );
302
303 VOID
304 NTAPI
305 CcMdlWriteComplete2(
306 IN PFILE_OBJECT FileObject,
307 IN PLARGE_INTEGER FileOffset,
308 IN PMDL MdlChain
309 );
310
311 NTSTATUS
312 NTAPI
313 CcRosFlushVacb(PROS_VACB Vacb);
314
315 NTSTATUS
316 NTAPI
317 CcRosGetVacb(
318 PROS_SHARED_CACHE_MAP SharedCacheMap,
319 LONGLONG FileOffset,
320 PLONGLONG BaseOffset,
321 PVOID *BaseAddress,
322 PBOOLEAN UptoDate,
323 PROS_VACB *Vacb
324 );
325
326 VOID
327 NTAPI
328 CcInitView(VOID);
329
330 VOID
331 NTAPI
332 CcShutdownLazyWriter(VOID);
333
334 NTSTATUS
335 NTAPI
336 CcReadVirtualAddress(PROS_VACB Vacb);
337
338 NTSTATUS
339 NTAPI
340 CcWriteVirtualAddress(PROS_VACB Vacb);
341
342 BOOLEAN
343 NTAPI
344 CcInitializeCacheManager(VOID);
345
346 NTSTATUS
347 NTAPI
348 CcRosUnmapVacb(
349 PROS_SHARED_CACHE_MAP SharedCacheMap,
350 LONGLONG FileOffset,
351 BOOLEAN NowDirty
352 );
353
354 PROS_VACB
355 NTAPI
356 CcRosLookupVacb(
357 PROS_SHARED_CACHE_MAP SharedCacheMap,
358 LONGLONG FileOffset
359 );
360
361 VOID
362 NTAPI
363 CcInitCacheZeroPage(VOID);
364
365 NTSTATUS
366 NTAPI
367 CcRosMarkDirtyFile(
368 PROS_SHARED_CACHE_MAP SharedCacheMap,
369 LONGLONG FileOffset
370 );
371
372 VOID
373 NTAPI
374 CcRosMarkDirtyVacb(
375 PROS_VACB Vacb);
376
377 VOID
378 NTAPI
379 CcRosUnmarkDirtyVacb(
380 PROS_VACB Vacb,
381 BOOLEAN LockViews);
382
383 NTSTATUS
384 NTAPI
385 CcRosFlushDirtyPages(
386 ULONG Target,
387 PULONG Count,
388 BOOLEAN Wait,
389 BOOLEAN CalledFromLazy
390 );
391
392 VOID
393 NTAPI
394 CcRosDereferenceCache(PFILE_OBJECT FileObject);
395
396 VOID
397 NTAPI
398 CcRosReferenceCache(PFILE_OBJECT FileObject);
399
400 VOID
401 NTAPI
402 CcRosRemoveIfClosed(PSECTION_OBJECT_POINTERS SectionObjectPointer);
403
404 NTSTATUS
405 NTAPI
406 CcRosReleaseVacb(
407 PROS_SHARED_CACHE_MAP SharedCacheMap,
408 PROS_VACB Vacb,
409 BOOLEAN Valid,
410 BOOLEAN Dirty,
411 BOOLEAN Mapped
412 );
413
414 NTSTATUS
415 NTAPI
416 CcRosRequestVacb(
417 PROS_SHARED_CACHE_MAP SharedCacheMap,
418 LONGLONG FileOffset,
419 PVOID* BaseAddress,
420 PBOOLEAN UptoDate,
421 PROS_VACB *Vacb
422 );
423
424 NTSTATUS
425 NTAPI
426 CcRosInitializeFileCache(
427 PFILE_OBJECT FileObject,
428 PCC_FILE_SIZES FileSizes,
429 BOOLEAN PinAccess,
430 PCACHE_MANAGER_CALLBACKS CallBacks,
431 PVOID LazyWriterContext
432 );
433
434 NTSTATUS
435 NTAPI
436 CcRosReleaseFileCache(
437 PFILE_OBJECT FileObject
438 );
439
440 VOID
441 NTAPI
442 CcShutdownSystem(VOID);
443
444 VOID
445 NTAPI
446 CcWorkerThread(PVOID Parameter);
447
448 VOID
449 NTAPI
450 CcScanDpc(
451 PKDPC Dpc,
452 PVOID DeferredContext,
453 PVOID SystemArgument1,
454 PVOID SystemArgument2);
455
456 VOID
457 CcScheduleLazyWriteScan(BOOLEAN NoDelay);
458
459 VOID
460 CcPostDeferredWrites(VOID);
461
462 VOID
463 CcPostWorkQueue(
464 IN PWORK_QUEUE_ENTRY WorkItem,
465 IN PLIST_ENTRY WorkQueue);
466
467 VOID
468 CcPerformReadAhead(
469 IN PFILE_OBJECT FileObject);
470
471 NTSTATUS
472 CcRosInternalFreeVacb(
473 IN PROS_VACB Vacb);
474
475 FORCEINLINE
476 BOOLEAN
477 DoRangesIntersect(
478 _In_ LONGLONG Offset1,
479 _In_ LONGLONG Length1,
480 _In_ LONGLONG Offset2,
481 _In_ LONGLONG Length2)
482 {
483 if (Offset1 + Length1 <= Offset2)
484 return FALSE;
485 if (Offset2 + Length2 <= Offset1)
486 return FALSE;
487 return TRUE;
488 }
489
490 FORCEINLINE
491 BOOLEAN
492 IsPointInRange(
493 _In_ LONGLONG Offset1,
494 _In_ LONGLONG Length1,
495 _In_ LONGLONG Point)
496 {
497 return DoRangesIntersect(Offset1, Length1, Point, 1);
498 }
499
500 #define CcBugCheck(A, B, C) KeBugCheckEx(CACHE_MANAGER, BugCheckFileId | ((ULONG)(__LINE__)), A, B, C)
501
502 #if DBG
503 #define CcRosVacbIncRefCount(vacb) CcRosVacbIncRefCount_(vacb,__FILE__,__LINE__)
504 #define CcRosVacbDecRefCount(vacb) CcRosVacbDecRefCount_(vacb,__FILE__,__LINE__)
505 #define CcRosVacbGetRefCount(vacb) CcRosVacbGetRefCount_(vacb,__FILE__,__LINE__)
506
507 ULONG
508 CcRosVacbIncRefCount_(
509 PROS_VACB vacb,
510 PCSTR file,
511 INT line);
512
513 ULONG
514 CcRosVacbDecRefCount_(
515 PROS_VACB vacb,
516 PCSTR file,
517 INT line);
518
519 ULONG
520 CcRosVacbGetRefCount_(
521 PROS_VACB vacb,
522 PCSTR file,
523 INT line);
524
525 #else
526 #define CcRosVacbIncRefCount(vacb) InterlockedIncrement((PLONG)&(vacb)->ReferenceCount)
527 FORCEINLINE
528 ULONG
529 CcRosVacbDecRefCount(
530 PROS_VACB vacb)
531 {
532 ULONG Refs;
533
534 Refs = InterlockedDecrement((PLONG)&vacb->ReferenceCount);
535 if (Refs == 0)
536 {
537 CcRosInternalFreeVacb(vacb);
538 }
539 return Refs;
540 }
541 #define CcRosVacbGetRefCount(vacb) InterlockedCompareExchange((PLONG)&(vacb)->ReferenceCount, 0, 0)
542 #endif