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
;
49 typedef struct _PF_SCENARIO_ID
53 } PF_SCENARIO_ID
, *PPF_SCENARIO_ID
;
55 typedef struct _PF_LOG_ENTRY
62 ULONG FileSequenceNumber
;
64 } PF_LOG_ENTRY
, *PPF_LOG_ENTRY
;
66 typedef struct _PFSN_LOG_ENTRIES
68 LIST_ENTRY TraceBuffersLink
;
71 PF_LOG_ENTRY Entries
[ANYSIZE_ARRAY
];
72 } PFSN_LOG_ENTRIES
, *PPFSN_LOG_ENTRIES
;
74 typedef struct _PF_SECTION_INFO
77 ULONG FileSequenceNumber
;
80 } PF_SECTION_INFO
, *PPF_SECTION_INFO
;
82 typedef struct _PF_TRACE_HEADER
87 PF_SCENARIO_ID ScenarioId
;
88 ULONG ScenarioType
; // PF_SCENARIO_TYPE
89 ULONG EventEntryIdxs
[8];
90 ULONG NumEventEntryIdxs
;
91 ULONG TraceBufferOffset
;
93 ULONG SectionInfoOffset
;
95 ULONG FaultsPerPeriod
[10];
96 LARGE_INTEGER LaunchTime
;
97 ULONGLONG Reserved
[5];
98 } PF_TRACE_HEADER
, *PPF_TRACE_HEADER
;
100 typedef struct _PFSN_TRACE_DUMP
102 LIST_ENTRY CompletedTracesLink
;
103 PF_TRACE_HEADER Trace
;
104 } PFSN_TRACE_DUMP
, *PPFSN_TRACE_DUMP
;
106 typedef struct _PFSN_TRACE_HEADER
109 LIST_ENTRY ActiveTracesLink
;
110 PF_SCENARIO_ID ScenarioId
;
111 ULONG ScenarioType
; // PF_SCENARIO_TYPE
112 ULONG EventEntryIdxs
[8];
113 ULONG NumEventEntryIdxs
;
114 PPFSN_LOG_ENTRIES CurrentTraceBuffer
;
115 LIST_ENTRY TraceBuffersList
;
116 ULONG NumTraceBuffers
;
117 KSPIN_LOCK TraceBufferSpinLock
;
119 LARGE_INTEGER TraceTimerPeriod
;
121 KSPIN_LOCK TraceTimerSpinLock
;
122 ULONG FaultsPerPeriod
[10];
128 EX_RUNDOWN_REF RefCount
;
129 WORK_QUEUE_ITEM EndTraceWorkItem
;
131 PPFSN_TRACE_DUMP TraceDump
;
132 NTSTATUS TraceDumpStatus
;
133 LARGE_INTEGER LaunchTime
;
134 PPF_SECTION_INFO SectionInfo
;
135 ULONG SectionInfoCount
;
136 } PFSN_TRACE_HEADER
, *PPFSN_TRACE_HEADER
;
138 typedef struct _PFSN_PREFETCHER_GLOBALS
140 LIST_ENTRY ActiveTraces
;
141 KSPIN_LOCK ActiveTracesLock
;
142 PPFSN_TRACE_HEADER SystemWideTrace
;
143 LIST_ENTRY CompletedTraces
;
144 FAST_MUTEX CompletedTracesLock
;
145 LONG NumCompletedTraces
;
146 PKEVENT CompletedTracesEvent
;
147 LONG ActivePrefetches
;
148 } PFSN_PREFETCHER_GLOBALS
, *PPFSN_PREFETCHER_GLOBALS
;
150 typedef struct _ROS_SHARED_CACHE_MAP
152 LIST_ENTRY CacheMapVacbListHead
;
154 PFILE_OBJECT FileObject
;
155 LARGE_INTEGER SectionSize
;
156 LARGE_INTEGER FileSize
;
158 PCACHE_MANAGER_CALLBACKS Callbacks
;
159 PVOID LazyWriteContext
;
160 KSPIN_LOCK CacheMapLock
;
162 ULONG DirtyPageThreshold
;
163 LIST_ENTRY SharedCacheMapLinks
;
165 BOOLEAN Trace
; /* enable extra trace output for this cache map and it's VACBs */
167 } ROS_SHARED_CACHE_MAP
, *PROS_SHARED_CACHE_MAP
;
169 typedef struct _ROS_VACB
171 /* Base address of the region where the view's data is mapped. */
173 /* Memory area representing the region where the view's data is mapped. */
174 struct _MEMORY_AREA
* MemoryArea
;
175 /* Are the contents of the view valid. */
177 /* Are the contents of the view newer than those on disk. */
179 /* Page out in progress */
182 /* Entry in the list of VACBs for this shared cache map. */
183 LIST_ENTRY CacheMapVacbListEntry
;
184 /* Entry in the list of VACBs which are dirty. */
185 LIST_ENTRY DirtyVacbListEntry
;
186 /* Entry in the list of VACBs. */
187 LIST_ENTRY VacbLruListEntry
;
188 /* Offset in the file which this view maps. */
189 LARGE_INTEGER FileOffset
;
192 /* Number of references. */
193 ULONG ReferenceCount
;
194 /* How many times was it pinned? */
197 /* Pointer to the shared cache map for the file which this view maps data for. */
198 PROS_SHARED_CACHE_MAP SharedCacheMap
;
199 /* Pointer to the next VACB in a chain. */
200 } ROS_VACB
, *PROS_VACB
;
202 typedef struct _ROS_DEFERRED_WRITE_CONTEXT
204 LIST_ENTRY CcDeferredWritesEntry
;
205 PFILE_OBJECT FileObject
;
206 PCC_POST_DEFERRED_WRITE PostRoutine
;
211 } ROS_DEFERRED_WRITE_CONTEXT
, *PROS_DEFERRED_WRITE_CONTEXT
;
213 typedef struct _INTERNAL_BCB
221 CSHORT RefCount
; /* (At offset 0x34 on WinNT4) */
222 } INTERNAL_BCB
, *PINTERNAL_BCB
;
226 CcPfInitializePrefetcher(
233 IN PFILE_OBJECT FileObject
,
234 IN PMDL MemoryDescriptorList
240 IN PFILE_OBJECT FileObject
,
241 IN PLARGE_INTEGER FileOffset
,
247 CcRosFlushVacb(PROS_VACB Vacb
);
252 PROS_SHARED_CACHE_MAP SharedCacheMap
,
254 PLONGLONG BaseOffset
,
266 CcShutdownLazyWriter(VOID
);
270 CcReadVirtualAddress(PROS_VACB Vacb
);
274 CcWriteVirtualAddress(PROS_VACB Vacb
);
278 CcInitializeCacheManager(VOID
);
283 PROS_SHARED_CACHE_MAP SharedCacheMap
,
291 PROS_SHARED_CACHE_MAP SharedCacheMap
,
297 CcInitCacheZeroPage(VOID
);
302 PROS_SHARED_CACHE_MAP SharedCacheMap
,
313 CcRosFlushDirtyPages(
317 BOOLEAN CalledFromLazy
322 CcRosDereferenceCache(PFILE_OBJECT FileObject
);
326 CcRosReferenceCache(PFILE_OBJECT FileObject
);
330 CcRosRemoveIfClosed(PSECTION_OBJECT_POINTERS SectionObjectPointer
);
335 PROS_SHARED_CACHE_MAP SharedCacheMap
,
345 PROS_SHARED_CACHE_MAP SharedCacheMap
,
354 CcRosInitializeFileCache(
355 PFILE_OBJECT FileObject
,
356 PCC_FILE_SIZES FileSizes
,
358 PCACHE_MANAGER_CALLBACKS CallBacks
,
359 PVOID LazyWriterContext
364 CcRosReleaseFileCache(
365 PFILE_OBJECT FileObject
370 CcTryToInitializeFileCache(PFILE_OBJECT FileObject
);
374 CcShutdownSystem(VOID
);
378 CcRosAcquireVacbLock(
379 _Inout_ PROS_VACB Vacb
,
380 _In_ PLARGE_INTEGER Timeout
)
383 Status
= KeWaitForSingleObject(&Vacb
->Mutex
,
393 CcRosReleaseVacbLock(
394 _Inout_ PROS_VACB Vacb
)
396 KeReleaseMutex(&Vacb
->Mutex
, FALSE
);
402 _In_ LONGLONG Offset1
,
403 _In_ LONGLONG Length1
,
404 _In_ LONGLONG Offset2
,
405 _In_ LONGLONG Length2
)
407 if (Offset1
+ Length1
<= Offset2
)
409 if (Offset2
+ Length2
<= Offset1
)
417 _In_ LONGLONG Offset1
,
418 _In_ LONGLONG Length1
,
421 return DoRangesIntersect(Offset1
, Length1
, Point
, 1);