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
;
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
;
68 typedef struct _PF_SCENARIO_ID
72 } PF_SCENARIO_ID
, *PPF_SCENARIO_ID
;
74 typedef struct _PF_LOG_ENTRY
81 ULONG FileSequenceNumber
;
83 } PF_LOG_ENTRY
, *PPF_LOG_ENTRY
;
85 typedef struct _PFSN_LOG_ENTRIES
87 LIST_ENTRY TraceBuffersLink
;
90 PF_LOG_ENTRY Entries
[ANYSIZE_ARRAY
];
91 } PFSN_LOG_ENTRIES
, *PPFSN_LOG_ENTRIES
;
93 typedef struct _PF_SECTION_INFO
96 ULONG FileSequenceNumber
;
99 } PF_SECTION_INFO
, *PPF_SECTION_INFO
;
101 typedef struct _PF_TRACE_HEADER
106 PF_SCENARIO_ID ScenarioId
;
107 ULONG ScenarioType
; // PF_SCENARIO_TYPE
108 ULONG EventEntryIdxs
[8];
109 ULONG NumEventEntryIdxs
;
110 ULONG TraceBufferOffset
;
112 ULONG SectionInfoOffset
;
114 ULONG FaultsPerPeriod
[10];
115 LARGE_INTEGER LaunchTime
;
116 ULONGLONG Reserved
[5];
117 } PF_TRACE_HEADER
, *PPF_TRACE_HEADER
;
119 typedef struct _PFSN_TRACE_DUMP
121 LIST_ENTRY CompletedTracesLink
;
122 PF_TRACE_HEADER Trace
;
123 } PFSN_TRACE_DUMP
, *PPFSN_TRACE_DUMP
;
125 typedef struct _PFSN_TRACE_HEADER
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
;
138 LARGE_INTEGER TraceTimerPeriod
;
140 KSPIN_LOCK TraceTimerSpinLock
;
141 ULONG FaultsPerPeriod
[10];
147 EX_RUNDOWN_REF RefCount
;
148 WORK_QUEUE_ITEM EndTraceWorkItem
;
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
;
157 typedef struct _PFSN_PREFETCHER_GLOBALS
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
;
169 typedef struct _ROS_SHARED_CACHE_MAP
174 LARGE_INTEGER FileSize
;
175 LARGE_INTEGER SectionSize
;
176 PFILE_OBJECT FileObject
;
178 LIST_ENTRY SharedCacheMapLinks
;
180 PCACHE_MANAGER_CALLBACKS Callbacks
;
181 PVOID LazyWriteContext
;
182 LIST_ENTRY PrivateList
;
183 ULONG DirtyPageThreshold
;
184 PRIVATE_CACHE_MAP PrivateCacheMap
;
187 LIST_ENTRY CacheMapVacbListHead
;
190 KSPIN_LOCK CacheMapLock
;
192 BOOLEAN Trace
; /* enable extra trace output for this cache map and it's VACBs */
194 } ROS_SHARED_CACHE_MAP
, *PROS_SHARED_CACHE_MAP
;
196 #define READAHEAD_DISABLED 0x1
197 #define WRITEBEHIND_DISABLED 0x2
199 typedef struct _ROS_VACB
201 /* Base address of the region where the view's data is mapped. */
203 /* Memory area representing the region where the view's data is mapped. */
204 struct _MEMORY_AREA
* MemoryArea
;
205 /* Are the contents of the view valid. */
207 /* Are the contents of the view newer than those on disk. */
209 /* Page out in progress */
212 /* Entry in the list of VACBs for this shared cache map. */
213 LIST_ENTRY CacheMapVacbListEntry
;
214 /* Entry in the list of VACBs which are dirty. */
215 LIST_ENTRY DirtyVacbListEntry
;
216 /* Entry in the list of VACBs. */
217 LIST_ENTRY VacbLruListEntry
;
218 /* Offset in the file which this view maps. */
219 LARGE_INTEGER FileOffset
;
222 /* Number of references. */
223 volatile ULONG ReferenceCount
;
224 /* How many times was it pinned? */
227 /* Pointer to the shared cache map for the file which this view maps data for. */
228 PROS_SHARED_CACHE_MAP SharedCacheMap
;
229 /* Pointer to the next VACB in a chain. */
230 } ROS_VACB
, *PROS_VACB
;
232 typedef struct _INTERNAL_BCB
240 CSHORT RefCount
; /* (At offset 0x34 on WinNT4) */
241 } INTERNAL_BCB
, *PINTERNAL_BCB
;
243 typedef struct _LAZY_WRITER
245 LIST_ENTRY WorkQueue
;
250 BOOLEAN PendingTeardown
;
251 } LAZY_WRITER
, *PLAZY_WRITER
;
253 typedef struct _WORK_QUEUE_ENTRY
255 LIST_ENTRY WorkQueueLinks
;
260 FILE_OBJECT
*FileObject
;
264 SHARED_CACHE_MAP
*SharedCacheMap
;
272 unsigned long Reason
;
275 unsigned char Function
;
276 } WORK_QUEUE_ENTRY
, *PWORK_QUEUE_ENTRY
;
278 typedef enum _WORK_QUEUE_FUNCTIONS
284 } WORK_QUEUE_FUNCTIONS
, *PWORK_QUEUE_FUNCTIONS
;
286 extern LAZY_WRITER LazyWriter
;
288 #define NODE_TYPE_DEFERRED_WRITE 0x02FC
289 #define NODE_TYPE_PRIVATE_MAP 0x02FE
290 #define NODE_TYPE_SHARED_MAP 0x02FF
294 CcPfInitializePrefetcher(
301 IN PFILE_OBJECT FileObject
,
302 IN PMDL MemoryDescriptorList
308 IN PFILE_OBJECT FileObject
,
309 IN PLARGE_INTEGER FileOffset
,
315 CcRosFlushVacb(PROS_VACB Vacb
);
320 PROS_SHARED_CACHE_MAP SharedCacheMap
,
322 PLONGLONG BaseOffset
,
334 CcShutdownLazyWriter(VOID
);
338 CcReadVirtualAddress(PROS_VACB Vacb
);
342 CcWriteVirtualAddress(PROS_VACB Vacb
);
346 CcInitializeCacheManager(VOID
);
351 PROS_SHARED_CACHE_MAP SharedCacheMap
,
359 PROS_SHARED_CACHE_MAP SharedCacheMap
,
365 CcInitCacheZeroPage(VOID
);
370 PROS_SHARED_CACHE_MAP SharedCacheMap
,
381 CcRosUnmarkDirtyVacb(
387 CcRosFlushDirtyPages(
391 BOOLEAN CalledFromLazy
396 CcRosDereferenceCache(PFILE_OBJECT FileObject
);
400 CcRosReferenceCache(PFILE_OBJECT FileObject
);
404 CcRosRemoveIfClosed(PSECTION_OBJECT_POINTERS SectionObjectPointer
);
409 PROS_SHARED_CACHE_MAP SharedCacheMap
,
419 PROS_SHARED_CACHE_MAP SharedCacheMap
,
428 CcRosInitializeFileCache(
429 PFILE_OBJECT FileObject
,
430 PCC_FILE_SIZES FileSizes
,
432 PCACHE_MANAGER_CALLBACKS CallBacks
,
433 PVOID LazyWriterContext
438 CcRosReleaseFileCache(
439 PFILE_OBJECT FileObject
444 CcShutdownSystem(VOID
);
448 CcWorkerThread(PVOID Parameter
);
454 PVOID DeferredContext
,
455 PVOID SystemArgument1
,
456 PVOID SystemArgument2
);
459 CcScheduleLazyWriteScan(BOOLEAN NoDelay
);
462 CcPostDeferredWrites(VOID
);
466 IN PWORK_QUEUE_ENTRY WorkItem
,
467 IN PLIST_ENTRY WorkQueue
);
471 IN PFILE_OBJECT FileObject
);
475 CcRosAcquireVacbLock(
476 _Inout_ PROS_VACB Vacb
,
477 _In_ PLARGE_INTEGER Timeout
)
480 Status
= KeWaitForSingleObject(&Vacb
->Mutex
,
490 CcRosReleaseVacbLock(
491 _Inout_ PROS_VACB Vacb
)
493 KeReleaseMutex(&Vacb
->Mutex
, FALSE
);
499 _In_ LONGLONG Offset1
,
500 _In_ LONGLONG Length1
,
501 _In_ LONGLONG Offset2
,
502 _In_ LONGLONG Length2
)
504 if (Offset1
+ Length1
<= Offset2
)
506 if (Offset2
+ Length2
<= Offset1
)
514 _In_ LONGLONG Offset1
,
515 _In_ LONGLONG Length1
,
518 return DoRangesIntersect(Offset1
, Length1
, Point
, 1);
521 #define CcBugCheck(A, B, C) KeBugCheckEx(CACHE_MANAGER, BugCheckFileId | ((ULONG)(__LINE__)), A, B, C)
524 #define CcRosVacbIncRefCount(vacb) CcRosVacbIncRefCount_(vacb,__FILE__,__LINE__)
525 #define CcRosVacbDecRefCount(vacb) CcRosVacbDecRefCount_(vacb,__FILE__,__LINE__)
526 #define CcRosVacbGetRefCount(vacb) CcRosVacbGetRefCount_(vacb,__FILE__,__LINE__)
529 CcRosVacbIncRefCount_(
535 CcRosVacbDecRefCount_(
541 CcRosVacbGetRefCount_(
547 #define CcRosVacbIncRefCount(vacb) InterlockedIncrement((PLONG)&(vacb)->ReferenceCount)
548 #define CcRosVacbDecRefCount(vacb) InterlockedDecrement((PLONG)&(vacb)->ReferenceCount)
549 #define CcRosVacbGetRefCount(vacb) InterlockedCompareExchange((PLONG)&(vacb)->ReferenceCount, 0, 0)