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 CcRegularWorkQueue
;
51 extern LIST_ENTRY CcPostTickWorkQueue
;
52 extern NPAGED_LOOKASIDE_LIST CcTwilightLookasideList
;
54 typedef struct _PF_SCENARIO_ID
58 } PF_SCENARIO_ID
, *PPF_SCENARIO_ID
;
60 typedef struct _PF_LOG_ENTRY
67 ULONG FileSequenceNumber
;
69 } PF_LOG_ENTRY
, *PPF_LOG_ENTRY
;
71 typedef struct _PFSN_LOG_ENTRIES
73 LIST_ENTRY TraceBuffersLink
;
76 PF_LOG_ENTRY Entries
[ANYSIZE_ARRAY
];
77 } PFSN_LOG_ENTRIES
, *PPFSN_LOG_ENTRIES
;
79 typedef struct _PF_SECTION_INFO
82 ULONG FileSequenceNumber
;
85 } PF_SECTION_INFO
, *PPF_SECTION_INFO
;
87 typedef struct _PF_TRACE_HEADER
92 PF_SCENARIO_ID ScenarioId
;
93 ULONG ScenarioType
; // PF_SCENARIO_TYPE
94 ULONG EventEntryIdxs
[8];
95 ULONG NumEventEntryIdxs
;
96 ULONG TraceBufferOffset
;
98 ULONG SectionInfoOffset
;
100 ULONG FaultsPerPeriod
[10];
101 LARGE_INTEGER LaunchTime
;
102 ULONGLONG Reserved
[5];
103 } PF_TRACE_HEADER
, *PPF_TRACE_HEADER
;
105 typedef struct _PFSN_TRACE_DUMP
107 LIST_ENTRY CompletedTracesLink
;
108 PF_TRACE_HEADER Trace
;
109 } PFSN_TRACE_DUMP
, *PPFSN_TRACE_DUMP
;
111 typedef struct _PFSN_TRACE_HEADER
114 LIST_ENTRY ActiveTracesLink
;
115 PF_SCENARIO_ID ScenarioId
;
116 ULONG ScenarioType
; // PF_SCENARIO_TYPE
117 ULONG EventEntryIdxs
[8];
118 ULONG NumEventEntryIdxs
;
119 PPFSN_LOG_ENTRIES CurrentTraceBuffer
;
120 LIST_ENTRY TraceBuffersList
;
121 ULONG NumTraceBuffers
;
122 KSPIN_LOCK TraceBufferSpinLock
;
124 LARGE_INTEGER TraceTimerPeriod
;
126 KSPIN_LOCK TraceTimerSpinLock
;
127 ULONG FaultsPerPeriod
[10];
133 EX_RUNDOWN_REF RefCount
;
134 WORK_QUEUE_ITEM EndTraceWorkItem
;
136 PPFSN_TRACE_DUMP TraceDump
;
137 NTSTATUS TraceDumpStatus
;
138 LARGE_INTEGER LaunchTime
;
139 PPF_SECTION_INFO SectionInfo
;
140 ULONG SectionInfoCount
;
141 } PFSN_TRACE_HEADER
, *PPFSN_TRACE_HEADER
;
143 typedef struct _PFSN_PREFETCHER_GLOBALS
145 LIST_ENTRY ActiveTraces
;
146 KSPIN_LOCK ActiveTracesLock
;
147 PPFSN_TRACE_HEADER SystemWideTrace
;
148 LIST_ENTRY CompletedTraces
;
149 FAST_MUTEX CompletedTracesLock
;
150 LONG NumCompletedTraces
;
151 PKEVENT CompletedTracesEvent
;
152 LONG ActivePrefetches
;
153 } PFSN_PREFETCHER_GLOBALS
, *PPFSN_PREFETCHER_GLOBALS
;
155 typedef struct _ROS_SHARED_CACHE_MAP
157 LIST_ENTRY CacheMapVacbListHead
;
159 PFILE_OBJECT FileObject
;
160 LARGE_INTEGER SectionSize
;
161 LARGE_INTEGER FileSize
;
163 PCACHE_MANAGER_CALLBACKS Callbacks
;
164 PVOID LazyWriteContext
;
165 KSPIN_LOCK CacheMapLock
;
168 LIST_ENTRY SharedCacheMapLinks
;
169 ULONG DirtyPageThreshold
;
171 BOOLEAN Trace
; /* enable extra trace output for this cache map and it's VACBs */
173 } ROS_SHARED_CACHE_MAP
, *PROS_SHARED_CACHE_MAP
;
175 typedef struct _ROS_VACB
177 /* Base address of the region where the view's data is mapped. */
179 /* Memory area representing the region where the view's data is mapped. */
180 struct _MEMORY_AREA
* MemoryArea
;
181 /* Are the contents of the view valid. */
183 /* Are the contents of the view newer than those on disk. */
185 /* Page out in progress */
188 /* Entry in the list of VACBs for this shared cache map. */
189 LIST_ENTRY CacheMapVacbListEntry
;
190 /* Entry in the list of VACBs which are dirty. */
191 LIST_ENTRY DirtyVacbListEntry
;
192 /* Entry in the list of VACBs. */
193 LIST_ENTRY VacbLruListEntry
;
194 /* Offset in the file which this view maps. */
195 LARGE_INTEGER FileOffset
;
198 /* Number of references. */
199 ULONG ReferenceCount
;
200 /* How many times was it pinned? */
203 /* Pointer to the shared cache map for the file which this view maps data for. */
204 PROS_SHARED_CACHE_MAP SharedCacheMap
;
205 /* Pointer to the next VACB in a chain. */
206 } ROS_VACB
, *PROS_VACB
;
208 typedef struct _INTERNAL_BCB
216 CSHORT RefCount
; /* (At offset 0x34 on WinNT4) */
217 } INTERNAL_BCB
, *PINTERNAL_BCB
;
219 typedef struct _LAZY_WRITER
221 LIST_ENTRY WorkQueue
;
226 BOOLEAN PendingTeardown
;
227 } LAZY_WRITER
, *PLAZY_WRITER
;
229 typedef struct _WORK_QUEUE_ENTRY
231 LIST_ENTRY WorkQueueLinks
;
236 FILE_OBJECT
*FileObject
;
240 SHARED_CACHE_MAP
*SharedCacheMap
;
248 unsigned long Reason
;
251 unsigned char Function
;
252 } WORK_QUEUE_ENTRY
, *PWORK_QUEUE_ENTRY
;
254 extern LAZY_WRITER LazyWriter
;
256 #define NODE_TYPE_DEFERRED_WRITE 0x02FC
260 CcPfInitializePrefetcher(
267 IN PFILE_OBJECT FileObject
,
268 IN PMDL MemoryDescriptorList
274 IN PFILE_OBJECT FileObject
,
275 IN PLARGE_INTEGER FileOffset
,
281 CcRosFlushVacb(PROS_VACB Vacb
);
286 PROS_SHARED_CACHE_MAP SharedCacheMap
,
288 PLONGLONG BaseOffset
,
300 CcShutdownLazyWriter(VOID
);
304 CcReadVirtualAddress(PROS_VACB Vacb
);
308 CcWriteVirtualAddress(PROS_VACB Vacb
);
312 CcInitializeCacheManager(VOID
);
317 PROS_SHARED_CACHE_MAP SharedCacheMap
,
325 PROS_SHARED_CACHE_MAP SharedCacheMap
,
331 CcInitCacheZeroPage(VOID
);
336 PROS_SHARED_CACHE_MAP SharedCacheMap
,
347 CcRosUnmarkDirtyVacb(
353 CcRosFlushDirtyPages(
357 BOOLEAN CalledFromLazy
362 CcRosDereferenceCache(PFILE_OBJECT FileObject
);
366 CcRosReferenceCache(PFILE_OBJECT FileObject
);
370 CcRosRemoveIfClosed(PSECTION_OBJECT_POINTERS SectionObjectPointer
);
375 PROS_SHARED_CACHE_MAP SharedCacheMap
,
385 PROS_SHARED_CACHE_MAP SharedCacheMap
,
394 CcRosInitializeFileCache(
395 PFILE_OBJECT FileObject
,
396 PCC_FILE_SIZES FileSizes
,
398 PCACHE_MANAGER_CALLBACKS CallBacks
,
399 PVOID LazyWriterContext
404 CcRosReleaseFileCache(
405 PFILE_OBJECT FileObject
410 CcTryToInitializeFileCache(PFILE_OBJECT FileObject
);
414 CcShutdownSystem(VOID
);
418 CcWorkerThread(PVOID Parameter
);
424 PVOID DeferredContext
,
425 PVOID SystemArgument1
,
426 PVOID SystemArgument2
);
429 CcScheduleLazyWriteScan(BOOLEAN NoDelay
);
433 CcRosAcquireVacbLock(
434 _Inout_ PROS_VACB Vacb
,
435 _In_ PLARGE_INTEGER Timeout
)
438 Status
= KeWaitForSingleObject(&Vacb
->Mutex
,
448 CcRosReleaseVacbLock(
449 _Inout_ PROS_VACB Vacb
)
451 KeReleaseMutex(&Vacb
->Mutex
, FALSE
);
457 _In_ LONGLONG Offset1
,
458 _In_ LONGLONG Length1
,
459 _In_ LONGLONG Offset2
,
460 _In_ LONGLONG Length2
)
462 if (Offset1
+ Length1
<= Offset2
)
464 if (Offset2
+ Length2
<= Offset1
)
472 _In_ LONGLONG Offset1
,
473 _In_ LONGLONG Length1
,
476 return DoRangesIntersect(Offset1
, Length1
, Point
, 1);
479 #define CcBugCheck(A, B, C) KeBugCheckEx(CACHE_MANAGER, BugCheckFileId | ((ULONG)(__LINE__)), A, B, C)