* Sync up to trunk head (r64894).
[reactos.git] / 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 } ROS_VACB, *PROS_VACB;
149
150 typedef struct _INTERNAL_BCB
151 {
152 PUBLIC_BCB PFCB;
153 PROS_VACB Vacb;
154 BOOLEAN Dirty;
155 CSHORT RefCount; /* (At offset 0x34 on WinNT4) */
156 } INTERNAL_BCB, *PINTERNAL_BCB;
157
158 VOID
159 NTAPI
160 CcPfInitializePrefetcher(
161 VOID
162 );
163
164 VOID
165 NTAPI
166 CcMdlReadComplete2(
167 IN PFILE_OBJECT FileObject,
168 IN PMDL MemoryDescriptorList
169 );
170
171 VOID
172 NTAPI
173 CcMdlWriteComplete2(
174 IN PFILE_OBJECT FileObject,
175 IN PLARGE_INTEGER FileOffset,
176 IN PMDL MdlChain
177 );
178
179 NTSTATUS
180 NTAPI
181 CcRosFlushVacb(PROS_VACB Vacb);
182
183 NTSTATUS
184 NTAPI
185 CcRosGetVacb(
186 PROS_SHARED_CACHE_MAP SharedCacheMap,
187 LONGLONG FileOffset,
188 PLONGLONG BaseOffset,
189 PVOID *BaseAddress,
190 PBOOLEAN UptoDate,
191 PROS_VACB *Vacb
192 );
193
194 VOID
195 NTAPI
196 CcInitView(VOID);
197
198 NTSTATUS
199 NTAPI
200 CcReadVirtualAddress(PROS_VACB Vacb);
201
202 NTSTATUS
203 NTAPI
204 CcWriteVirtualAddress(PROS_VACB Vacb);
205
206 BOOLEAN
207 NTAPI
208 CcInitializeCacheManager(VOID);
209
210 NTSTATUS
211 NTAPI
212 CcRosUnmapVacb(
213 PROS_SHARED_CACHE_MAP SharedCacheMap,
214 LONGLONG FileOffset,
215 BOOLEAN NowDirty
216 );
217
218 PROS_VACB
219 NTAPI
220 CcRosLookupVacb(
221 PROS_SHARED_CACHE_MAP SharedCacheMap,
222 LONGLONG FileOffset
223 );
224
225 VOID
226 NTAPI
227 CcInitCacheZeroPage(VOID);
228
229 NTSTATUS
230 NTAPI
231 CcRosMarkDirtyVacb(
232 PROS_SHARED_CACHE_MAP SharedCacheMap,
233 LONGLONG FileOffset
234 );
235
236 NTSTATUS
237 NTAPI
238 CcRosFlushDirtyPages(
239 ULONG Target,
240 PULONG Count,
241 BOOLEAN Wait
242 );
243
244 VOID
245 NTAPI
246 CcRosDereferenceCache(PFILE_OBJECT FileObject);
247
248 VOID
249 NTAPI
250 CcRosReferenceCache(PFILE_OBJECT FileObject);
251
252 VOID
253 NTAPI
254 CcRosRemoveIfClosed(PSECTION_OBJECT_POINTERS SectionObjectPointer);
255
256 NTSTATUS
257 NTAPI
258 CcRosReleaseVacb(
259 PROS_SHARED_CACHE_MAP SharedCacheMap,
260 PROS_VACB Vacb,
261 BOOLEAN Valid,
262 BOOLEAN Dirty,
263 BOOLEAN Mapped
264 );
265
266 NTSTATUS
267 NTAPI
268 CcRosRequestVacb(
269 PROS_SHARED_CACHE_MAP SharedCacheMap,
270 LONGLONG FileOffset,
271 PVOID* BaseAddress,
272 PBOOLEAN UptoDate,
273 PROS_VACB *Vacb
274 );
275
276 NTSTATUS
277 NTAPI
278 CcRosInitializeFileCache(
279 PFILE_OBJECT FileObject,
280 PCC_FILE_SIZES FileSizes,
281 PCACHE_MANAGER_CALLBACKS CallBacks,
282 PVOID LazyWriterContext
283 );
284
285 NTSTATUS
286 NTAPI
287 CcRosReleaseFileCache(
288 PFILE_OBJECT FileObject
289 );
290
291 NTSTATUS
292 NTAPI
293 CcTryToInitializeFileCache(PFILE_OBJECT FileObject);
294
295 FORCEINLINE
296 BOOLEAN
297 DoRangesIntersect(
298 _In_ LONGLONG Offset1,
299 _In_ LONGLONG Length1,
300 _In_ LONGLONG Offset2,
301 _In_ LONGLONG Length2)
302 {
303 if (Offset1 + Length1 <= Offset2)
304 return FALSE;
305 if (Offset2 + Length2 <= Offset1)
306 return FALSE;
307 return TRUE;
308 }
309
310 FORCEINLINE
311 BOOLEAN
312 IsPointInRange(
313 _In_ LONGLONG Offset1,
314 _In_ LONGLONG Length1,
315 _In_ LONGLONG Point)
316 {
317 return DoRangesIntersect(Offset1, Length1, Point, 1);
318 }