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