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
;
44 typedef struct _PF_SCENARIO_ID
48 } PF_SCENARIO_ID
, *PPF_SCENARIO_ID
;
50 typedef struct _PF_LOG_ENTRY
57 ULONG FileSequenceNumber
;
59 } PF_LOG_ENTRY
, *PPF_LOG_ENTRY
;
61 typedef struct _PFSN_LOG_ENTRIES
63 LIST_ENTRY TraceBuffersLink
;
66 PF_LOG_ENTRY Entries
[ANYSIZE_ARRAY
];
67 } PFSN_LOG_ENTRIES
, *PPFSN_LOG_ENTRIES
;
69 typedef struct _PF_SECTION_INFO
72 ULONG FileSequenceNumber
;
75 } PF_SECTION_INFO
, *PPF_SECTION_INFO
;
77 typedef struct _PF_TRACE_HEADER
82 PF_SCENARIO_ID ScenarioId
;
83 ULONG ScenarioType
; // PF_SCENARIO_TYPE
84 ULONG EventEntryIdxs
[8];
85 ULONG NumEventEntryIdxs
;
86 ULONG TraceBufferOffset
;
88 ULONG SectionInfoOffset
;
90 ULONG FaultsPerPeriod
[10];
91 LARGE_INTEGER LaunchTime
;
92 ULONGLONG Reserved
[5];
93 } PF_TRACE_HEADER
, *PPF_TRACE_HEADER
;
95 typedef struct _PFSN_TRACE_DUMP
97 LIST_ENTRY CompletedTracesLink
;
98 PF_TRACE_HEADER Trace
;
99 } PFSN_TRACE_DUMP
, *PPFSN_TRACE_DUMP
;
101 typedef struct _PFSN_TRACE_HEADER
104 LIST_ENTRY ActiveTracesLink
;
105 PF_SCENARIO_ID ScenarioId
;
106 ULONG ScenarioType
; // PF_SCENARIO_TYPE
107 ULONG EventEntryIdxs
[8];
108 ULONG NumEventEntryIdxs
;
109 PPFSN_LOG_ENTRIES CurrentTraceBuffer
;
110 LIST_ENTRY TraceBuffersList
;
111 ULONG NumTraceBuffers
;
112 KSPIN_LOCK TraceBufferSpinLock
;
114 LARGE_INTEGER TraceTimerPeriod
;
116 KSPIN_LOCK TraceTimerSpinLock
;
117 ULONG FaultsPerPeriod
[10];
123 EX_RUNDOWN_REF RefCount
;
124 WORK_QUEUE_ITEM EndTraceWorkItem
;
126 PPFSN_TRACE_DUMP TraceDump
;
127 NTSTATUS TraceDumpStatus
;
128 LARGE_INTEGER LaunchTime
;
129 PPF_SECTION_INFO SectionInfo
;
130 ULONG SectionInfoCount
;
131 } PFSN_TRACE_HEADER
, *PPFSN_TRACE_HEADER
;
133 typedef struct _PFSN_PREFETCHER_GLOBALS
135 LIST_ENTRY ActiveTraces
;
136 KSPIN_LOCK ActiveTracesLock
;
137 PPFSN_TRACE_HEADER SystemWideTrace
;
138 LIST_ENTRY CompletedTraces
;
139 FAST_MUTEX CompletedTracesLock
;
140 LONG NumCompletedTraces
;
141 PKEVENT CompletedTracesEvent
;
142 LONG ActivePrefetches
;
143 } PFSN_PREFETCHER_GLOBALS
, *PPFSN_PREFETCHER_GLOBALS
;
145 typedef struct _ROS_SHARED_CACHE_MAP
147 LIST_ENTRY CacheMapVacbListHead
;
149 PFILE_OBJECT FileObject
;
150 LARGE_INTEGER SectionSize
;
151 LARGE_INTEGER FileSize
;
153 PCACHE_MANAGER_CALLBACKS Callbacks
;
154 PVOID LazyWriteContext
;
155 KSPIN_LOCK CacheMapLock
;
158 BOOLEAN Trace
; /* enable extra trace output for this cache map and it's VACBs */
160 } ROS_SHARED_CACHE_MAP
, *PROS_SHARED_CACHE_MAP
;
162 typedef struct _ROS_VACB
164 /* Base address of the region where the view's data is mapped. */
166 /* Memory area representing the region where the view's data is mapped. */
167 struct _MEMORY_AREA
* MemoryArea
;
168 /* Are the contents of the view valid. */
170 /* Are the contents of the view newer than those on disk. */
172 /* Page out in progress */
175 /* Entry in the list of VACBs for this shared cache map. */
176 LIST_ENTRY CacheMapVacbListEntry
;
177 /* Entry in the list of VACBs which are dirty. */
178 LIST_ENTRY DirtyVacbListEntry
;
179 /* Entry in the list of VACBs. */
180 LIST_ENTRY VacbLruListEntry
;
181 /* Offset in the file which this view maps. */
182 LARGE_INTEGER FileOffset
;
185 /* Number of references. */
186 ULONG ReferenceCount
;
187 /* How many times was it pinned? */
188 volatile LONG PinCount
;
189 /* Pointer to the shared cache map for the file which this view maps data for. */
190 PROS_SHARED_CACHE_MAP SharedCacheMap
;
191 /* Pointer to the next VACB in a chain. */
192 } ROS_VACB
, *PROS_VACB
;
194 typedef struct _INTERNAL_BCB
202 CSHORT RefCount
; /* (At offset 0x34 on WinNT4) */
203 } INTERNAL_BCB
, *PINTERNAL_BCB
;
207 CcPfInitializePrefetcher(
214 IN PFILE_OBJECT FileObject
,
215 IN PMDL MemoryDescriptorList
221 IN PFILE_OBJECT FileObject
,
222 IN PLARGE_INTEGER FileOffset
,
228 CcRosFlushVacb(PROS_VACB Vacb
);
233 PROS_SHARED_CACHE_MAP SharedCacheMap
,
235 PLONGLONG BaseOffset
,
247 CcReadVirtualAddress(PROS_VACB Vacb
);
251 CcWriteVirtualAddress(PROS_VACB Vacb
);
255 CcInitializeCacheManager(VOID
);
260 PROS_SHARED_CACHE_MAP SharedCacheMap
,
268 PROS_SHARED_CACHE_MAP SharedCacheMap
,
274 CcInitCacheZeroPage(VOID
);
279 PROS_SHARED_CACHE_MAP SharedCacheMap
,
285 CcRosFlushDirtyPages(
293 CcRosDereferenceCache(PFILE_OBJECT FileObject
);
297 CcRosReferenceCache(PFILE_OBJECT FileObject
);
301 CcRosRemoveIfClosed(PSECTION_OBJECT_POINTERS SectionObjectPointer
);
306 PROS_SHARED_CACHE_MAP SharedCacheMap
,
316 PROS_SHARED_CACHE_MAP SharedCacheMap
,
325 CcRosInitializeFileCache(
326 PFILE_OBJECT FileObject
,
327 PCC_FILE_SIZES FileSizes
,
329 PCACHE_MANAGER_CALLBACKS CallBacks
,
330 PVOID LazyWriterContext
335 CcRosReleaseFileCache(
336 PFILE_OBJECT FileObject
341 CcTryToInitializeFileCache(PFILE_OBJECT FileObject
);
345 CcRosAcquireVacbLock(
346 _Inout_ PROS_VACB Vacb
,
347 _In_ PLARGE_INTEGER Timeout
)
350 Status
= KeWaitForSingleObject(&Vacb
->Mutex
,
360 CcRosReleaseVacbLock(
361 _Inout_ PROS_VACB Vacb
)
363 KeReleaseMutex(&Vacb
->Mutex
, FALSE
);
369 _In_ LONGLONG Offset1
,
370 _In_ LONGLONG Length1
,
371 _In_ LONGLONG Offset2
,
372 _In_ LONGLONG Length2
)
374 if (Offset1
+ Length1
<= Offset2
)
376 if (Offset2
+ Length2
<= Offset1
)
384 _In_ LONGLONG Offset1
,
385 _In_ LONGLONG Length1
,
388 return DoRangesIntersect(Offset1
, Length1
, Point
, 1);