4 // Define this if you want debugging support
6 #define _CC_DEBUG_ 0x00
9 // These define the Debug Masks Supported
11 #define CC_API_DEBUG 0x01
14 // Debug/Tracing support
17 #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
18 #define CCTRACE(x, ...) \
20 DbgPrintEx("%s [%.16s] - ", \
22 PsGetCurrentProcess()->ImageFileName); \
23 DbgPrintEx(__VA_ARGS__); \
26 #define CCTRACE(x, ...) \
27 if (x & CcRosTraceLevel) \
29 DbgPrint("%s [%.16s] - ", \
31 PsGetCurrentProcess()->ImageFileName); \
32 DbgPrint(__VA_ARGS__); \
36 #define CCTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__)
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
;
56 typedef struct _PF_SCENARIO_ID
60 } PF_SCENARIO_ID
, *PPF_SCENARIO_ID
;
62 typedef struct _PF_LOG_ENTRY
69 ULONG FileSequenceNumber
;
71 } PF_LOG_ENTRY
, *PPF_LOG_ENTRY
;
73 typedef struct _PFSN_LOG_ENTRIES
75 LIST_ENTRY TraceBuffersLink
;
78 PF_LOG_ENTRY Entries
[ANYSIZE_ARRAY
];
79 } PFSN_LOG_ENTRIES
, *PPFSN_LOG_ENTRIES
;
81 typedef struct _PF_SECTION_INFO
84 ULONG FileSequenceNumber
;
87 } PF_SECTION_INFO
, *PPF_SECTION_INFO
;
89 typedef struct _PF_TRACE_HEADER
94 PF_SCENARIO_ID ScenarioId
;
95 ULONG ScenarioType
; // PF_SCENARIO_TYPE
96 ULONG EventEntryIdxs
[8];
97 ULONG NumEventEntryIdxs
;
98 ULONG TraceBufferOffset
;
100 ULONG SectionInfoOffset
;
102 ULONG FaultsPerPeriod
[10];
103 LARGE_INTEGER LaunchTime
;
104 ULONGLONG Reserved
[5];
105 } PF_TRACE_HEADER
, *PPF_TRACE_HEADER
;
107 typedef struct _PFSN_TRACE_DUMP
109 LIST_ENTRY CompletedTracesLink
;
110 PF_TRACE_HEADER Trace
;
111 } PFSN_TRACE_DUMP
, *PPFSN_TRACE_DUMP
;
113 typedef struct _PFSN_TRACE_HEADER
116 LIST_ENTRY ActiveTracesLink
;
117 PF_SCENARIO_ID ScenarioId
;
118 ULONG ScenarioType
; // PF_SCENARIO_TYPE
119 ULONG EventEntryIdxs
[8];
120 ULONG NumEventEntryIdxs
;
121 PPFSN_LOG_ENTRIES CurrentTraceBuffer
;
122 LIST_ENTRY TraceBuffersList
;
123 ULONG NumTraceBuffers
;
124 KSPIN_LOCK TraceBufferSpinLock
;
126 LARGE_INTEGER TraceTimerPeriod
;
128 KSPIN_LOCK TraceTimerSpinLock
;
129 ULONG FaultsPerPeriod
[10];
135 EX_RUNDOWN_REF RefCount
;
136 WORK_QUEUE_ITEM EndTraceWorkItem
;
138 PPFSN_TRACE_DUMP TraceDump
;
139 NTSTATUS TraceDumpStatus
;
140 LARGE_INTEGER LaunchTime
;
141 PPF_SECTION_INFO SectionInfo
;
142 ULONG SectionInfoCount
;
143 } PFSN_TRACE_HEADER
, *PPFSN_TRACE_HEADER
;
145 typedef struct _PFSN_PREFETCHER_GLOBALS
147 LIST_ENTRY ActiveTraces
;
148 KSPIN_LOCK ActiveTracesLock
;
149 PPFSN_TRACE_HEADER SystemWideTrace
;
150 LIST_ENTRY CompletedTraces
;
151 FAST_MUTEX CompletedTracesLock
;
152 LONG NumCompletedTraces
;
153 PKEVENT CompletedTracesEvent
;
154 LONG ActivePrefetches
;
155 } PFSN_PREFETCHER_GLOBALS
, *PPFSN_PREFETCHER_GLOBALS
;
157 typedef struct _ROS_SHARED_CACHE_MAP
162 LARGE_INTEGER FileSize
;
163 LARGE_INTEGER SectionSize
;
164 PFILE_OBJECT FileObject
;
166 LIST_ENTRY SharedCacheMapLinks
;
168 PCACHE_MANAGER_CALLBACKS Callbacks
;
169 PVOID LazyWriteContext
;
170 LIST_ENTRY PrivateList
;
171 ULONG DirtyPageThreshold
;
174 LIST_ENTRY CacheMapVacbListHead
;
177 KSPIN_LOCK CacheMapLock
;
179 BOOLEAN Trace
; /* enable extra trace output for this cache map and it's VACBs */
181 } ROS_SHARED_CACHE_MAP
, *PROS_SHARED_CACHE_MAP
;
183 #define READAHEAD_DISABLED 0x1
184 #define WRITEBEHIND_DISABLED 0x2
186 typedef struct _ROS_VACB
188 /* Base address of the region where the view's data is mapped. */
190 /* Memory area representing the region where the view's data is mapped. */
191 struct _MEMORY_AREA
* MemoryArea
;
192 /* Are the contents of the view valid. */
194 /* Are the contents of the view newer than those on disk. */
196 /* Page out in progress */
199 /* Entry in the list of VACBs for this shared cache map. */
200 LIST_ENTRY CacheMapVacbListEntry
;
201 /* Entry in the list of VACBs which are dirty. */
202 LIST_ENTRY DirtyVacbListEntry
;
203 /* Entry in the list of VACBs. */
204 LIST_ENTRY VacbLruListEntry
;
205 /* Offset in the file which this view maps. */
206 LARGE_INTEGER FileOffset
;
209 /* Number of references. */
210 ULONG ReferenceCount
;
211 /* How many times was it pinned? */
214 /* Pointer to the shared cache map for the file which this view maps data for. */
215 PROS_SHARED_CACHE_MAP SharedCacheMap
;
216 /* Pointer to the next VACB in a chain. */
217 } ROS_VACB
, *PROS_VACB
;
219 typedef struct _INTERNAL_BCB
227 CSHORT RefCount
; /* (At offset 0x34 on WinNT4) */
228 } INTERNAL_BCB
, *PINTERNAL_BCB
;
230 typedef struct _LAZY_WRITER
232 LIST_ENTRY WorkQueue
;
237 BOOLEAN PendingTeardown
;
238 } LAZY_WRITER
, *PLAZY_WRITER
;
240 typedef struct _WORK_QUEUE_ENTRY
242 LIST_ENTRY WorkQueueLinks
;
247 FILE_OBJECT
*FileObject
;
251 SHARED_CACHE_MAP
*SharedCacheMap
;
259 unsigned long Reason
;
262 unsigned char Function
;
263 } WORK_QUEUE_ENTRY
, *PWORK_QUEUE_ENTRY
;
265 typedef enum _WORK_QUEUE_FUNCTIONS
271 } WORK_QUEUE_FUNCTIONS
, *PWORK_QUEUE_FUNCTIONS
;
273 extern LAZY_WRITER LazyWriter
;
275 #define NODE_TYPE_DEFERRED_WRITE 0x02FC
276 #define NODE_TYPE_PRIVATE_MAP 0x02FE
277 #define NODE_TYPE_SHARED_MAP 0x02FF
281 CcPfInitializePrefetcher(
288 IN PFILE_OBJECT FileObject
,
289 IN PMDL MemoryDescriptorList
295 IN PFILE_OBJECT FileObject
,
296 IN PLARGE_INTEGER FileOffset
,
302 CcRosFlushVacb(PROS_VACB Vacb
);
307 PROS_SHARED_CACHE_MAP SharedCacheMap
,
309 PLONGLONG BaseOffset
,
321 CcShutdownLazyWriter(VOID
);
325 CcReadVirtualAddress(PROS_VACB Vacb
);
329 CcWriteVirtualAddress(PROS_VACB Vacb
);
333 CcInitializeCacheManager(VOID
);
338 PROS_SHARED_CACHE_MAP SharedCacheMap
,
346 PROS_SHARED_CACHE_MAP SharedCacheMap
,
352 CcInitCacheZeroPage(VOID
);
357 PROS_SHARED_CACHE_MAP SharedCacheMap
,
368 CcRosUnmarkDirtyVacb(
374 CcRosFlushDirtyPages(
378 BOOLEAN CalledFromLazy
383 CcRosDereferenceCache(PFILE_OBJECT FileObject
);
387 CcRosReferenceCache(PFILE_OBJECT FileObject
);
391 CcRosRemoveIfClosed(PSECTION_OBJECT_POINTERS SectionObjectPointer
);
396 PROS_SHARED_CACHE_MAP SharedCacheMap
,
406 PROS_SHARED_CACHE_MAP SharedCacheMap
,
415 CcRosInitializeFileCache(
416 PFILE_OBJECT FileObject
,
417 PCC_FILE_SIZES FileSizes
,
419 PCACHE_MANAGER_CALLBACKS CallBacks
,
420 PVOID LazyWriterContext
425 CcRosReleaseFileCache(
426 PFILE_OBJECT FileObject
431 CcShutdownSystem(VOID
);
435 CcWorkerThread(PVOID Parameter
);
441 PVOID DeferredContext
,
442 PVOID SystemArgument1
,
443 PVOID SystemArgument2
);
446 CcScheduleLazyWriteScan(BOOLEAN NoDelay
);
449 CcPostDeferredWrites(VOID
);
453 IN PWORK_QUEUE_ENTRY WorkItem
,
454 IN PLIST_ENTRY WorkQueue
);
458 IN PFILE_OBJECT FileObject
);
462 CcRosAcquireVacbLock(
463 _Inout_ PROS_VACB Vacb
,
464 _In_ PLARGE_INTEGER Timeout
)
467 Status
= KeWaitForSingleObject(&Vacb
->Mutex
,
477 CcRosReleaseVacbLock(
478 _Inout_ PROS_VACB Vacb
)
480 KeReleaseMutex(&Vacb
->Mutex
, FALSE
);
486 _In_ LONGLONG Offset1
,
487 _In_ LONGLONG Length1
,
488 _In_ LONGLONG Offset2
,
489 _In_ LONGLONG Length2
)
491 if (Offset1
+ Length1
<= Offset2
)
493 if (Offset2
+ Length2
<= Offset1
)
501 _In_ LONGLONG Offset1
,
502 _In_ LONGLONG Length1
,
505 return DoRangesIntersect(Offset1
, Length1
, Point
, 1);
508 #define CcBugCheck(A, B, C) KeBugCheckEx(CACHE_MANAGER, BugCheckFileId | ((ULONG)(__LINE__)), A, B, C)