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
;
45 typedef struct _PF_SCENARIO_ID
49 } PF_SCENARIO_ID
, *PPF_SCENARIO_ID
;
51 typedef struct _PF_LOG_ENTRY
58 ULONG FileSequenceNumber
;
60 } PF_LOG_ENTRY
, *PPF_LOG_ENTRY
;
62 typedef struct _PFSN_LOG_ENTRIES
64 LIST_ENTRY TraceBuffersLink
;
67 PF_LOG_ENTRY Entries
[ANYSIZE_ARRAY
];
68 } PFSN_LOG_ENTRIES
, *PPFSN_LOG_ENTRIES
;
70 typedef struct _PF_SECTION_INFO
73 ULONG FileSequenceNumber
;
76 } PF_SECTION_INFO
, *PPF_SECTION_INFO
;
78 typedef struct _PF_TRACE_HEADER
83 PF_SCENARIO_ID ScenarioId
;
84 ULONG ScenarioType
; // PF_SCENARIO_TYPE
85 ULONG EventEntryIdxs
[8];
86 ULONG NumEventEntryIdxs
;
87 ULONG TraceBufferOffset
;
89 ULONG SectionInfoOffset
;
91 ULONG FaultsPerPeriod
[10];
92 LARGE_INTEGER LaunchTime
;
93 ULONGLONG Reserved
[5];
94 } PF_TRACE_HEADER
, *PPF_TRACE_HEADER
;
96 typedef struct _PFSN_TRACE_DUMP
98 LIST_ENTRY CompletedTracesLink
;
99 PF_TRACE_HEADER Trace
;
100 } PFSN_TRACE_DUMP
, *PPFSN_TRACE_DUMP
;
102 typedef struct _PFSN_TRACE_HEADER
105 LIST_ENTRY ActiveTracesLink
;
106 PF_SCENARIO_ID ScenarioId
;
107 ULONG ScenarioType
; // PF_SCENARIO_TYPE
108 ULONG EventEntryIdxs
[8];
109 ULONG NumEventEntryIdxs
;
110 PPFSN_LOG_ENTRIES CurrentTraceBuffer
;
111 LIST_ENTRY TraceBuffersList
;
112 ULONG NumTraceBuffers
;
113 KSPIN_LOCK TraceBufferSpinLock
;
115 LARGE_INTEGER TraceTimerPeriod
;
117 KSPIN_LOCK TraceTimerSpinLock
;
118 ULONG FaultsPerPeriod
[10];
124 EX_RUNDOWN_REF RefCount
;
125 WORK_QUEUE_ITEM EndTraceWorkItem
;
127 PPFSN_TRACE_DUMP TraceDump
;
128 NTSTATUS TraceDumpStatus
;
129 LARGE_INTEGER LaunchTime
;
130 PPF_SECTION_INFO SectionInfo
;
131 ULONG SectionInfoCount
;
132 } PFSN_TRACE_HEADER
, *PPFSN_TRACE_HEADER
;
134 typedef struct _PFSN_PREFETCHER_GLOBALS
136 LIST_ENTRY ActiveTraces
;
137 KSPIN_LOCK ActiveTracesLock
;
138 PPFSN_TRACE_HEADER SystemWideTrace
;
139 LIST_ENTRY CompletedTraces
;
140 FAST_MUTEX CompletedTracesLock
;
141 LONG NumCompletedTraces
;
142 PKEVENT CompletedTracesEvent
;
143 LONG ActivePrefetches
;
144 } PFSN_PREFETCHER_GLOBALS
, *PPFSN_PREFETCHER_GLOBALS
;
146 typedef struct _ROS_SHARED_CACHE_MAP
148 LIST_ENTRY CacheMapVacbListHead
;
150 PFILE_OBJECT FileObject
;
151 LARGE_INTEGER SectionSize
;
152 LARGE_INTEGER FileSize
;
154 PCACHE_MANAGER_CALLBACKS Callbacks
;
155 PVOID LazyWriteContext
;
156 KSPIN_LOCK CacheMapLock
;
159 BOOLEAN Trace
; /* enable extra trace output for this cache map and it's VACBs */
161 } ROS_SHARED_CACHE_MAP
, *PROS_SHARED_CACHE_MAP
;
163 typedef struct _ROS_VACB
165 /* Base address of the region where the view's data is mapped. */
167 /* Memory area representing the region where the view's data is mapped. */
168 struct _MEMORY_AREA
* MemoryArea
;
169 /* Are the contents of the view valid. */
171 /* Are the contents of the view newer than those on disk. */
173 /* Page out in progress */
176 /* Entry in the list of VACBs for this shared cache map. */
177 LIST_ENTRY CacheMapVacbListEntry
;
178 /* Entry in the list of VACBs which are dirty. */
179 LIST_ENTRY DirtyVacbListEntry
;
180 /* Entry in the list of VACBs. */
181 LIST_ENTRY VacbLruListEntry
;
182 /* Offset in the file which this view maps. */
183 LARGE_INTEGER FileOffset
;
186 /* Number of references. */
187 ULONG ReferenceCount
;
188 /* How many times was it pinned? */
191 /* Pointer to the shared cache map for the file which this view maps data for. */
192 PROS_SHARED_CACHE_MAP SharedCacheMap
;
193 /* Pointer to the next VACB in a chain. */
194 } ROS_VACB
, *PROS_VACB
;
196 typedef struct _INTERNAL_BCB
204 CSHORT RefCount
; /* (At offset 0x34 on WinNT4) */
205 } INTERNAL_BCB
, *PINTERNAL_BCB
;
209 CcPfInitializePrefetcher(
216 IN PFILE_OBJECT FileObject
,
217 IN PMDL MemoryDescriptorList
223 IN PFILE_OBJECT FileObject
,
224 IN PLARGE_INTEGER FileOffset
,
230 CcRosFlushVacb(PROS_VACB Vacb
);
235 PROS_SHARED_CACHE_MAP SharedCacheMap
,
237 PLONGLONG BaseOffset
,
249 CcShutdownLazyWriter(VOID
);
253 CcReadVirtualAddress(PROS_VACB Vacb
);
257 CcWriteVirtualAddress(PROS_VACB Vacb
);
261 CcInitializeCacheManager(VOID
);
266 PROS_SHARED_CACHE_MAP SharedCacheMap
,
274 PROS_SHARED_CACHE_MAP SharedCacheMap
,
280 CcInitCacheZeroPage(VOID
);
285 PROS_SHARED_CACHE_MAP SharedCacheMap
,
291 CcRosFlushDirtyPages(
295 BOOLEAN CalledFromLazy
300 CcRosDereferenceCache(PFILE_OBJECT FileObject
);
304 CcRosReferenceCache(PFILE_OBJECT FileObject
);
308 CcRosRemoveIfClosed(PSECTION_OBJECT_POINTERS SectionObjectPointer
);
313 PROS_SHARED_CACHE_MAP SharedCacheMap
,
323 PROS_SHARED_CACHE_MAP SharedCacheMap
,
332 CcRosInitializeFileCache(
333 PFILE_OBJECT FileObject
,
334 PCC_FILE_SIZES FileSizes
,
336 PCACHE_MANAGER_CALLBACKS CallBacks
,
337 PVOID LazyWriterContext
342 CcRosReleaseFileCache(
343 PFILE_OBJECT FileObject
348 CcTryToInitializeFileCache(PFILE_OBJECT FileObject
);
352 CcShutdownSystem(VOID
);
356 CcRosAcquireVacbLock(
357 _Inout_ PROS_VACB Vacb
,
358 _In_ PLARGE_INTEGER Timeout
)
361 Status
= KeWaitForSingleObject(&Vacb
->Mutex
,
371 CcRosReleaseVacbLock(
372 _Inout_ PROS_VACB Vacb
)
374 KeReleaseMutex(&Vacb
->Mutex
, FALSE
);
380 _In_ LONGLONG Offset1
,
381 _In_ LONGLONG Length1
,
382 _In_ LONGLONG Offset2
,
383 _In_ LONGLONG Length2
)
385 if (Offset1
+ Length1
<= Offset2
)
387 if (Offset2
+ Length2
<= Offset1
)
395 _In_ LONGLONG Offset1
,
396 _In_ LONGLONG Length1
,
399 return DoRangesIntersect(Offset1
, Length1
, Point
, 1);