[HEADERS]
[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 _BCB
105 {
106 LIST_ENTRY BcbSegmentListHead;
107 LIST_ENTRY BcbRemoveListEntry;
108 BOOLEAN RemoveOnClose;
109 ULONG TimeStamp;
110 PFILE_OBJECT FileObject;
111 ULONG CacheSegmentSize;
112 LARGE_INTEGER AllocationSize;
113 LARGE_INTEGER FileSize;
114 PCACHE_MANAGER_CALLBACKS Callbacks;
115 PVOID LazyWriteContext;
116 KSPIN_LOCK BcbLock;
117 ULONG RefCount;
118 #if DBG
119 BOOLEAN Trace; /* enable extra trace output for this BCB and it's cache segments */
120 #endif
121 } BCB, *PBCB;
122
123 typedef struct _CACHE_SEGMENT
124 {
125 /* Base address of the region where the cache segment data is mapped. */
126 PVOID BaseAddress;
127 /*
128 * Memory area representing the region where the cache segment data is
129 * mapped.
130 */
131 struct _MEMORY_AREA* MemoryArea;
132 /* Are the contents of the cache segment data valid. */
133 BOOLEAN Valid;
134 /* Are the contents of the cache segment data newer than those on disk. */
135 BOOLEAN Dirty;
136 /* Page out in progress */
137 BOOLEAN PageOut;
138 ULONG MappedCount;
139 /* Entry in the list of segments for this BCB. */
140 LIST_ENTRY BcbSegmentListEntry;
141 /* Entry in the list of segments which are dirty. */
142 LIST_ENTRY DirtySegmentListEntry;
143 /* Entry in the list of segments. */
144 LIST_ENTRY CacheSegmentListEntry;
145 LIST_ENTRY CacheSegmentLRUListEntry;
146 /* Offset in the file which this cache segment maps. */
147 ULONG FileOffset;
148 /* Lock. */
149 EX_PUSH_LOCK Lock;
150 /* Number of references. */
151 ULONG ReferenceCount;
152 /* Pointer to the BCB for the file which this cache segment maps data for. */
153 PBCB Bcb;
154 /* Pointer to the next cache segment in a chain. */
155 struct _CACHE_SEGMENT* NextInChain;
156 } CACHE_SEGMENT, *PCACHE_SEGMENT;
157
158 typedef struct _INTERNAL_BCB
159 {
160 PUBLIC_BCB PFCB;
161 PCACHE_SEGMENT CacheSegment;
162 BOOLEAN Dirty;
163 CSHORT RefCount; /* (At offset 0x34 on WinNT4) */
164 } INTERNAL_BCB, *PINTERNAL_BCB;
165
166 VOID
167 NTAPI
168 CcPfInitializePrefetcher(
169 VOID
170 );
171
172 VOID
173 NTAPI
174 CcMdlReadComplete2(
175 IN PMDL MemoryDescriptorList,
176 IN PFILE_OBJECT FileObject
177 );
178
179 VOID
180 NTAPI
181 CcMdlWriteComplete2(
182 IN PFILE_OBJECT FileObject,
183 IN PLARGE_INTEGER FileOffset,
184 IN PMDL MdlChain
185 );
186
187 NTSTATUS
188 NTAPI
189 CcRosFlushCacheSegment(PCACHE_SEGMENT CacheSegment);
190
191 NTSTATUS
192 NTAPI
193 CcRosGetCacheSegment(
194 PBCB Bcb,
195 ULONG FileOffset,
196 PULONG BaseOffset,
197 PVOID *BaseAddress,
198 PBOOLEAN UptoDate,
199 PCACHE_SEGMENT *CacheSeg
200 );
201
202 VOID
203 NTAPI
204 CcInitView(VOID);
205
206 NTSTATUS
207 NTAPI
208 CcRosFreeCacheSegment(
209 PBCB,
210 PCACHE_SEGMENT
211 );
212
213 NTSTATUS
214 NTAPI
215 ReadCacheSegment(PCACHE_SEGMENT CacheSeg);
216
217 NTSTATUS
218 NTAPI
219 WriteCacheSegment(PCACHE_SEGMENT CacheSeg);
220
221 BOOLEAN
222 NTAPI
223 CcInitializeCacheManager(VOID);
224
225 NTSTATUS
226 NTAPI
227 CcRosUnmapCacheSegment(
228 PBCB Bcb,
229 ULONG FileOffset,
230 BOOLEAN NowDirty
231 );
232
233 PCACHE_SEGMENT
234 NTAPI
235 CcRosLookupCacheSegment(
236 PBCB Bcb,
237 ULONG FileOffset
238 );
239
240 NTSTATUS
241 NTAPI
242 CcRosGetCacheSegmentChain(
243 PBCB Bcb,
244 ULONG FileOffset,
245 ULONG Length,
246 PCACHE_SEGMENT* CacheSeg
247 );
248
249 VOID
250 NTAPI
251 CcInitCacheZeroPage(VOID);
252
253 NTSTATUS
254 NTAPI
255 CcRosMarkDirtyCacheSegment(
256 PBCB Bcb,
257 ULONG FileOffset
258 );
259
260 NTSTATUS
261 NTAPI
262 CcRosFlushDirtyPages(
263 ULONG Target,
264 PULONG Count
265 );
266
267 VOID
268 NTAPI
269 CcRosDereferenceCache(PFILE_OBJECT FileObject);
270
271 VOID
272 NTAPI
273 CcRosReferenceCache(PFILE_OBJECT FileObject);
274
275 VOID
276 NTAPI
277 CcRosSetRemoveOnClose(PSECTION_OBJECT_POINTERS SectionObjectPointer);
278
279 NTSTATUS
280 NTAPI
281 CcRosReleaseCacheSegment(
282 BCB* Bcb,
283 CACHE_SEGMENT *CacheSeg,
284 BOOLEAN Valid,
285 BOOLEAN Dirty,
286 BOOLEAN Mapped
287 );
288
289 NTSTATUS
290 NTAPI
291 CcRosRequestCacheSegment(
292 BCB *Bcb,
293 ULONG FileOffset,
294 PVOID* BaseAddress,
295 PBOOLEAN UptoDate,
296 CACHE_SEGMENT **CacheSeg
297 );
298
299 NTSTATUS
300 NTAPI
301 CcRosInitializeFileCache(
302 PFILE_OBJECT FileObject,
303 ULONG CacheSegmentSize,
304 PCACHE_MANAGER_CALLBACKS CallBacks,
305 PVOID LazyWriterContext
306 );
307
308 NTSTATUS
309 NTAPI
310 CcRosReleaseFileCache(
311 PFILE_OBJECT FileObject
312 );
313
314 NTSTATUS
315 NTAPI
316 CcTryToInitializeFileCache(PFILE_OBJECT FileObject);