3e559f8888b4b1a5992f95d95ad0d34203cc91b5
[reactos.git] / reactos / ntoskrnl / include / internal / cc.h
1 #pragma once
2
3 typedef struct _PF_SCENARIO_ID
4 {
5 WCHAR ScenName[30];
6 ULONG HashId;
7 } PF_SCENARIO_ID, *PPF_SCENARIO_ID;
8
9 typedef struct _PF_LOG_ENTRY
10 {
11 ULONG FileOffset:30;
12 ULONG Type:2;
13 union
14 {
15 ULONG FileKey;
16 ULONG FileSequenceNumber;
17 };
18 } PF_LOG_ENTRY, *PPF_LOG_ENTRY;
19
20 typedef struct _PFSN_LOG_ENTRIES
21 {
22 LIST_ENTRY TraceBuffersLink;
23 LONG NumEntries;
24 LONG MaxEntries;
25 PF_LOG_ENTRY Entries[ANYSIZE_ARRAY];
26 } PFSN_LOG_ENTRIES, *PPFSN_LOG_ENTRIES;
27
28 typedef struct _PF_SECTION_INFO
29 {
30 ULONG FileKey;
31 ULONG FileSequenceNumber;
32 ULONG FileIdLow;
33 ULONG FileIdHigh;
34 } PF_SECTION_INFO, *PPF_SECTION_INFO;
35
36 typedef struct _PF_TRACE_HEADER
37 {
38 ULONG Version;
39 ULONG MagicNumber;
40 ULONG Size;
41 PF_SCENARIO_ID ScenarioId;
42 ULONG ScenarioType; // PF_SCENARIO_TYPE
43 ULONG EventEntryIdxs[8];
44 ULONG NumEventEntryIdxs;
45 ULONG TraceBufferOffset;
46 ULONG NumEntries;
47 ULONG SectionInfoOffset;
48 ULONG NumSections;
49 ULONG FaultsPerPeriod[10];
50 LARGE_INTEGER LaunchTime;
51 ULONGLONG Reserved[5];
52 } PF_TRACE_HEADER, *PPF_TRACE_HEADER;
53
54 typedef struct _PFSN_TRACE_DUMP
55 {
56 LIST_ENTRY CompletedTracesLink;
57 PF_TRACE_HEADER Trace;
58 } PFSN_TRACE_DUMP, *PPFSN_TRACE_DUMP;
59
60 typedef struct _PFSN_TRACE_HEADER
61 {
62 ULONG Magic;
63 LIST_ENTRY ActiveTracesLink;
64 PF_SCENARIO_ID ScenarioId;
65 ULONG ScenarioType; // PF_SCENARIO_TYPE
66 ULONG EventEntryIdxs[8];
67 ULONG NumEventEntryIdxs;
68 PPFSN_LOG_ENTRIES CurrentTraceBuffer;
69 LIST_ENTRY TraceBuffersList;
70 ULONG NumTraceBuffers;
71 KSPIN_LOCK TraceBufferSpinLock;
72 KTIMER TraceTimer;
73 LARGE_INTEGER TraceTimerPeriod;
74 KDPC TraceTimerDpc;
75 KSPIN_LOCK TraceTimerSpinLock;
76 ULONG FaultsPerPeriod[10];
77 LONG LastNumFaults;
78 LONG CurPeriod;
79 LONG NumFaults;
80 LONG MaxFaults;
81 PEPROCESS Process;
82 EX_RUNDOWN_REF RefCount;
83 WORK_QUEUE_ITEM EndTraceWorkItem;
84 LONG EndTraceCalled;
85 PPFSN_TRACE_DUMP TraceDump;
86 NTSTATUS TraceDumpStatus;
87 LARGE_INTEGER LaunchTime;
88 PPF_SECTION_INFO SectionInfo;
89 ULONG SectionInfoCount;
90 } PFSN_TRACE_HEADER, *PPFSN_TRACE_HEADER;
91
92 typedef struct _PFSN_PREFETCHER_GLOBALS
93 {
94 LIST_ENTRY ActiveTraces;
95 KSPIN_LOCK ActiveTracesLock;
96 PPFSN_TRACE_HEADER SystemWideTrace;
97 LIST_ENTRY CompletedTraces;
98 FAST_MUTEX CompletedTracesLock;
99 LONG NumCompletedTraces;
100 PKEVENT CompletedTracesEvent;
101 LONG ActivePrefetches;
102 } PFSN_PREFETCHER_GLOBALS, *PPFSN_PREFETCHER_GLOBALS;
103
104 typedef struct _ROS_SHARED_CACHE_MAP
105 {
106 LIST_ENTRY CacheMapVacbListHead;
107 ULONG TimeStamp;
108 PFILE_OBJECT FileObject;
109 LARGE_INTEGER SectionSize;
110 LARGE_INTEGER FileSize;
111 PCACHE_MANAGER_CALLBACKS Callbacks;
112 PVOID LazyWriteContext;
113 KSPIN_LOCK CacheMapLock;
114 ULONG RefCount;
115 #if DBG
116 BOOLEAN Trace; /* enable extra trace output for this cache map and it's VACBs */
117 #endif
118 } ROS_SHARED_CACHE_MAP, *PROS_SHARED_CACHE_MAP;
119
120 typedef struct _ROS_VACB
121 {
122 /* Base address of the region where the view's data is mapped. */
123 PVOID BaseAddress;
124 /* Memory area representing the region where the view's data is mapped. */
125 struct _MEMORY_AREA* MemoryArea;
126 /* Are the contents of the view valid. */
127 BOOLEAN Valid;
128 /* Are the contents of the view newer than those on disk. */
129 BOOLEAN Dirty;
130 /* Page out in progress */
131 BOOLEAN PageOut;
132 ULONG MappedCount;
133 /* Entry in the list of VACBs for this shared cache map. */
134 LIST_ENTRY CacheMapVacbListEntry;
135 /* Entry in the list of VACBs which are dirty. */
136 LIST_ENTRY DirtyVacbListEntry;
137 /* Entry in the list of VACBs. */
138 LIST_ENTRY VacbLruListEntry;
139 /* Offset in the file which this view maps. */
140 LARGE_INTEGER FileOffset;
141 /* Mutex */
142 KMUTEX Mutex;
143 /* Number of references. */
144 ULONG ReferenceCount;
145 /* Pointer to the shared cache map for the file which this view maps data for. */
146 PROS_SHARED_CACHE_MAP SharedCacheMap;
147 /* Pointer to the next VACB in a chain. */
148 struct _ROS_VACB *NextInChain;
149 } ROS_VACB, *PROS_VACB;
150
151 typedef struct _INTERNAL_BCB
152 {
153 PUBLIC_BCB PFCB;
154 PROS_VACB Vacb;
155 BOOLEAN Dirty;
156 CSHORT RefCount; /* (At offset 0x34 on WinNT4) */
157 } INTERNAL_BCB, *PINTERNAL_BCB;
158
159 VOID
160 NTAPI
161 CcPfInitializePrefetcher(
162 VOID
163 );
164
165 VOID
166 NTAPI
167 CcMdlReadComplete2(
168 IN PFILE_OBJECT FileObject,
169 IN PMDL MemoryDescriptorList
170 );
171
172 VOID
173 NTAPI
174 CcMdlWriteComplete2(
175 IN PFILE_OBJECT FileObject,
176 IN PLARGE_INTEGER FileOffset,
177 IN PMDL MdlChain
178 );
179
180 NTSTATUS
181 NTAPI
182 CcRosFlushVacb(PROS_VACB Vacb);
183
184 NTSTATUS
185 NTAPI
186 CcRosGetVacb(
187 PROS_SHARED_CACHE_MAP SharedCacheMap,
188 ULONG FileOffset,
189 PULONGLONG BaseOffset,
190 PVOID *BaseAddress,
191 PBOOLEAN UptoDate,
192 PROS_VACB *Vacb
193 );
194
195 VOID
196 NTAPI
197 CcInitView(VOID);
198
199 NTSTATUS
200 NTAPI
201 CcReadVirtualAddress(PROS_VACB Vacb);
202
203 NTSTATUS
204 NTAPI
205 CcWriteVirtualAddress(PROS_VACB Vacb);
206
207 BOOLEAN
208 NTAPI
209 CcInitializeCacheManager(VOID);
210
211 NTSTATUS
212 NTAPI
213 CcRosUnmapVacb(
214 PROS_SHARED_CACHE_MAP SharedCacheMap,
215 ULONG FileOffset,
216 BOOLEAN NowDirty
217 );
218
219 PROS_VACB
220 NTAPI
221 CcRosLookupVacb(
222 PROS_SHARED_CACHE_MAP SharedCacheMap,
223 ULONG FileOffset
224 );
225
226 NTSTATUS
227 NTAPI
228 CcRosGetVacbChain(
229 PROS_SHARED_CACHE_MAP SharedCacheMap,
230 ULONG FileOffset,
231 ULONG Length,
232 PROS_VACB *Vacb
233 );
234
235 VOID
236 NTAPI
237 CcInitCacheZeroPage(VOID);
238
239 NTSTATUS
240 NTAPI
241 CcRosMarkDirtyVacb(
242 PROS_SHARED_CACHE_MAP SharedCacheMap,
243 ULONG FileOffset
244 );
245
246 NTSTATUS
247 NTAPI
248 CcRosFlushDirtyPages(
249 ULONG Target,
250 PULONG Count,
251 BOOLEAN Wait
252 );
253
254 VOID
255 NTAPI
256 CcRosDereferenceCache(PFILE_OBJECT FileObject);
257
258 VOID
259 NTAPI
260 CcRosReferenceCache(PFILE_OBJECT FileObject);
261
262 VOID
263 NTAPI
264 CcRosRemoveIfClosed(PSECTION_OBJECT_POINTERS SectionObjectPointer);
265
266 NTSTATUS
267 NTAPI
268 CcRosReleaseVacb(
269 PROS_SHARED_CACHE_MAP SharedCacheMap,
270 PROS_VACB Vacb,
271 BOOLEAN Valid,
272 BOOLEAN Dirty,
273 BOOLEAN Mapped
274 );
275
276 NTSTATUS
277 NTAPI
278 CcRosRequestVacb(
279 PROS_SHARED_CACHE_MAP SharedCacheMap,
280 ULONG FileOffset,
281 PVOID* BaseAddress,
282 PBOOLEAN UptoDate,
283 PROS_VACB *Vacb
284 );
285
286 NTSTATUS
287 NTAPI
288 CcRosInitializeFileCache(
289 PFILE_OBJECT FileObject,
290 PCACHE_MANAGER_CALLBACKS CallBacks,
291 PVOID LazyWriterContext
292 );
293
294 NTSTATUS
295 NTAPI
296 CcRosReleaseFileCache(
297 PFILE_OBJECT FileObject
298 );
299
300 NTSTATUS
301 NTAPI
302 CcTryToInitializeFileCache(PFILE_OBJECT FileObject);
303
304 FORCEINLINE
305 BOOLEAN
306 DoRangesIntersect(
307 _In_ ULONGLONG Offset1,
308 _In_ ULONG Length1,
309 _In_ ULONGLONG Offset2,
310 _In_ ULONG Length2)
311 {
312 if (Offset1 + Length1 <= Offset2)
313 return FALSE;
314 if (Offset2 + Length2 <= Offset1)
315 return FALSE;
316 return TRUE;
317 }
318
319 FORCEINLINE
320 BOOLEAN
321 IsPointInRange(
322 _In_ ULONGLONG Offset1,
323 _In_ ULONG Length1,
324 _In_ ULONGLONG Point)
325 {
326 return DoRangesIntersect(Offset1, Length1, Point, 1);
327 }