1 #pragma once
2
3 #include <internal/arch/mm.h>
4
5 /* TYPES *********************************************************************/
6 #define MM_SEGMENT_FINALIZE (0x40000000)
7
8
9 #define MIN(x,y) (((x)<(y))?(x):(y))
10 #define MAX(x,y) (((x)>(y))?(x):(y))
11
12 /* Determine what's needed to make paged pool fit in this category.
13 * it seems that something more is required to satisfy arm3. */
14 #define BALANCER_CAN_EVICT(Consumer) \
15 (((Consumer) == MC_USER) || \
16 ((Consumer) == MC_CACHE))
17
18 #define SEC_CACHE (0x20000000)
19
20 /* We store 8 bits of location with a page association */
21 #define ENTRIES_PER_ELEMENT 256
22
23 extern KEVENT MmWaitPageEvent;
24
25 typedef struct _CACHE_SECTION_PAGE_TABLE
26 {
27 LARGE_INTEGER FileOffset;
28 PMM_SECTION_SEGMENT Segment;
29 ULONG Refcount;
30 ULONG_PTR PageEntries[ENTRIES_PER_ELEMENT];
31 } CACHE_SECTION_PAGE_TABLE, *PCACHE_SECTION_PAGE_TABLE;
32
33 struct _MM_REQUIRED_RESOURCES;
34
35 typedef NTSTATUS (NTAPI * AcquireResource)(
36 PMMSUPPORT AddressSpace,
37 struct _MEMORY_AREA *MemoryArea,
38 struct _MM_REQUIRED_RESOURCES *Required);
39
40 typedef NTSTATUS (NTAPI * NotPresentFaultHandler)(
41 PMMSUPPORT AddressSpace,
42 struct _MEMORY_AREA *MemoryArea,
43 PVOID Address,
44 BOOLEAN Locked,
45 struct _MM_REQUIRED_RESOURCES *Required);
46
47 typedef NTSTATUS (NTAPI * FaultHandler)(
48 PMMSUPPORT AddressSpace,
49 struct _MEMORY_AREA *MemoryArea,
50 PVOID Address,
51 struct _MM_REQUIRED_RESOURCES *Required);
52
53 typedef struct _MM_REQUIRED_RESOURCES
54 {
55 ULONG Consumer;
56 ULONG Amount;
57 ULONG Offset;
58 ULONG State;
59 PVOID Context;
60 LARGE_INTEGER FileOffset;
61 AcquireResource DoAcquisition;
62 PFN_NUMBER Page[2];
63 PVOID Buffer[2];
64 SWAPENTRY SwapEntry;
65 const char *File;
66 int Line;
67 } MM_REQUIRED_RESOURCES, *PMM_REQUIRED_RESOURCES;
68
69 NTSTATUS
70 NTAPI
71 MmCreateCacheSection(PSECTION *SectionObject,
72 ACCESS_MASK DesiredAccess,
73 POBJECT_ATTRIBUTES ObjectAttributes,
74 PLARGE_INTEGER UMaximumSize,
75 ULONG SectionPageProtection,
76 ULONG AllocationAttributes,
77 PFILE_OBJECT FileObject);
78
79 PFN_NUMBER
80 NTAPI
81 MmWithdrawSectionPage(PMM_SECTION_SEGMENT Segment,
82 PLARGE_INTEGER FileOffset,
83 BOOLEAN *Dirty);
84
85 NTSTATUS
86 NTAPI
87 MmFinalizeSectionPageOut(PMM_SECTION_SEGMENT Segment,
88 PLARGE_INTEGER FileOffset,
89 PFN_NUMBER Page,
90 BOOLEAN Dirty);
91
92 /* sptab.c *******************************************************************/
93
94 VOID
95 NTAPI
96 MiInitializeSectionPageTable(PMM_SECTION_SEGMENT Segment);
97
98 typedef VOID (NTAPI *FREE_SECTION_PAGE_FUN)(
99 PMM_SECTION_SEGMENT Segment,
100 PLARGE_INTEGER Offset);
101
102 VOID
103 NTAPI
104 MmFreePageTablesSectionSegment(PMM_SECTION_SEGMENT Segment,
105 FREE_SECTION_PAGE_FUN FreePage);
106
107 NTSTATUS
108 NTAPI
109 MmSetSectionAssociation(PFN_NUMBER Page,
110 PMM_SECTION_SEGMENT Segment,
111 PLARGE_INTEGER Offset);
112
113 VOID
114 NTAPI
115 MmDeleteSectionAssociation(PFN_NUMBER Page);
116
117 NTSTATUS
118 NTAPI
119 MmpPageOutPhysicalAddress(PFN_NUMBER Page);
120
121 /* io.c **********************************************************************/
122
123 NTSTATUS
124 MmspWaitForFileLock(PFILE_OBJECT File);
125
126 NTSTATUS
127 NTAPI
128 MiSimpleRead(PFILE_OBJECT FileObject,
129 PLARGE_INTEGER FileOffset,
130 PVOID Buffer,
131 ULONG Length,
132 BOOLEAN Paging,
133 PIO_STATUS_BLOCK ReadStatus);
134
135 NTSTATUS
136 NTAPI
137 _MiSimpleWrite(PFILE_OBJECT FileObject,
138 PLARGE_INTEGER FileOffset,
139 PVOID Buffer,
140 ULONG Length,
141 PIO_STATUS_BLOCK ReadStatus,
142 const char *file,
143 int line);
144
145 #define MiSimpleWrite(F,O,B,L,R) _MiSimpleWrite(F,O,B,L,R,__FILE__,__LINE__)
146
147 NTSTATUS
148 NTAPI
149 _MiWriteBackPage(PFILE_OBJECT FileObject,
150 PLARGE_INTEGER Offset,
151 ULONG Length,
152 PFN_NUMBER Page,
153 const char *File,
154 int Line);
155
156 #define MiWriteBackPage(F,O,L,P) _MiWriteBackPage(F,O,L,P,__FILE__,__LINE__)
157
158 /* section.c *****************************************************************/
159
160 NTSTATUS
161 NTAPI
162 MmAccessFaultCacheSection(KPROCESSOR_MODE Mode,
163 ULONG_PTR Address,
164 BOOLEAN FromMdl);
165
166 NTSTATUS
167 NTAPI
168 MiReadFilePage(PMMSUPPORT AddressSpace,
169 PMEMORY_AREA MemoryArea,
170 PMM_REQUIRED_RESOURCES RequiredResources);
171
172 NTSTATUS
173 NTAPI
174 MiGetOnePage(PMMSUPPORT AddressSpace,
175 PMEMORY_AREA MemoryArea,
176 PMM_REQUIRED_RESOURCES RequiredResources);
177
178 NTSTATUS
179 NTAPI
180 MiSwapInPage(PMMSUPPORT AddressSpace,
181 PMEMORY_AREA MemoryArea,
182 PMM_REQUIRED_RESOURCES RequiredResources);
183
184 NTSTATUS
185 NTAPI
186 MiWriteSwapPage(PMMSUPPORT AddressSpace,
187 PMEMORY_AREA MemoryArea,
188 PMM_REQUIRED_RESOURCES Resources);
189
190 NTSTATUS
191 NTAPI
192 MiWriteFilePage(PMMSUPPORT AddressSpace,
193 PMEMORY_AREA MemoryArea,
194 PMM_REQUIRED_RESOURCES Resources);
195
196 VOID
197 NTAPI
198 MiFreeSegmentPage(PMM_SECTION_SEGMENT Segment,
199 PLARGE_INTEGER FileOffset);
200
201 _Success_(1)
202 _When_(return==STATUS_MORE_PROCESSING_REQUIRED, _At_(Required->DoAcquisition, _Post_notnull_))
203 NTSTATUS
204 NTAPI
205 MiCowCacheSectionPage (
206 _In_ PMMSUPPORT AddressSpace,
207 _In_ PMEMORY_AREA MemoryArea,
208 _In_ PVOID Address,
209 _In_ BOOLEAN Locked,
210 _Inout_ PMM_REQUIRED_RESOURCES Required);
211
212 VOID
213 MmPageOutDeleteMapping(PVOID Context,
214 PEPROCESS Process,
215 PVOID Address);
216
217 VOID
218 MmFreeCacheSectionPage(PVOID Context,
219 MEMORY_AREA* MemoryArea,
220 PVOID Address,
221 PFN_NUMBER Page,
222 SWAPENTRY SwapEntry,
223 BOOLEAN Dirty);
224
225 NTSTATUS
226 NTAPI
227 _MiFlushMappedSection(PVOID BaseAddress,
228 PLARGE_INTEGER BaseOffset,
229 PLARGE_INTEGER FileSize,
230 BOOLEAN Dirty,
231 const char *File,
232 int Line);
233
234 #define MiFlushMappedSection(A,O,S,D) _MiFlushMappedSection(A,O,S,D,__FILE__,__LINE__)
235
236 VOID
237 NTAPI
238 MmFinalizeSegment(PMM_SECTION_SEGMENT Segment);
239
240 VOID
241 NTAPI
242 MmFreeSectionSegments(PFILE_OBJECT FileObject);
243
244 NTSTATUS
245 NTAPI
246 MmMapCacheViewInSystemSpaceAtOffset(IN PMM_SECTION_SEGMENT Segment,
247 OUT PVOID* MappedBase,
248 IN PLARGE_INTEGER ViewOffset,
249 IN OUT PULONG ViewSize);
250
251 NTSTATUS
252 NTAPI
253 _MiMapViewOfSegment(PMMSUPPORT AddressSpace,
254 PMM_SECTION_SEGMENT Segment,
255 PVOID* BaseAddress,
256 SIZE_T ViewSize,
257 ULONG Protect,
258 PLARGE_INTEGER ViewOffset,
259 ULONG AllocationType,
260 const char *file,
261 int line);
262
263 #define MiMapViewOfSegment(AddressSpace,Segment,BaseAddress,ViewSize,Protect,ViewOffset,AllocationType) \
264 _MiMapViewOfSegment(AddressSpace,Segment,BaseAddress,ViewSize,Protect,ViewOffset,AllocationType,__FILE__,__LINE__)
265
266 NTSTATUS
267 NTAPI
268 MmUnmapViewOfCacheSegment(PMMSUPPORT AddressSpace,
269 PVOID BaseAddress);
270
271 NTSTATUS
272 NTAPI
273 MmUnmapCacheViewInSystemSpace(PVOID Address);
274
275 _Success_(1)
276 _When_(return==STATUS_MORE_PROCESSING_REQUIRED, _At_(Required->DoAcquisition, _Post_notnull_))
277 NTSTATUS
278 NTAPI
279 MmNotPresentFaultCachePage (
280 _In_ PMMSUPPORT AddressSpace,
281 _In_ MEMORY_AREA* MemoryArea,
282 _In_ PVOID Address,
283 _In_ BOOLEAN Locked,
284 _Inout_ PMM_REQUIRED_RESOURCES Required);
285
286 NTSTATUS
287 NTAPI
288 MmPageOutPageFileView(PMMSUPPORT AddressSpace,
289 PMEMORY_AREA MemoryArea,
290 PVOID Address,
291 PMM_REQUIRED_RESOURCES Required);
292
293 FORCEINLINE
294 BOOLEAN
_MmTryToLockAddressSpace(IN PMMSUPPORT AddressSpace,const char * file,int line)295 _MmTryToLockAddressSpace(IN PMMSUPPORT AddressSpace,
296 const char *file,
297 int line)
298 {
299 BOOLEAN Result = KeTryToAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, Vm)->AddressCreationLock);
300 //DbgPrint("(%s:%d) Try Lock Address Space %x -> %s\n", file, line, AddressSpace, Result ? "true" : "false");
301 return Result;
302 }
303
304 #define MmTryToLockAddressSpace(x) _MmTryToLockAddressSpace(x,__FILE__,__LINE__)
305
306 NTSTATUS
307 NTAPI
308 MiWidenSegment(PMMSUPPORT AddressSpace,
309 PMEMORY_AREA MemoryArea,
310 PMM_REQUIRED_RESOURCES RequiredResources);
311
312 NTSTATUS
313 NTAPI
314 MiSwapInSectionPage(PMMSUPPORT AddressSpace,
315 PMEMORY_AREA MemoryArea,
316 PMM_REQUIRED_RESOURCES RequiredResources);
317
318 NTSTATUS
319 NTAPI
320 MmExtendCacheSection(PSECTION Section,
321 PLARGE_INTEGER NewSize,
322 BOOLEAN ExtendFile);
323
324 NTSTATUS
325 NTAPI
326 _MiFlushMappedSection(PVOID BaseAddress,
327 PLARGE_INTEGER BaseOffset,
328 PLARGE_INTEGER FileSize,
329 BOOLEAN Dirty,
330 const char *File,
331 int Line);
332
333 #define MiFlushMappedSection(A,O,S,D) _MiFlushMappedSection(A,O,S,D,__FILE__,__LINE__)
334
335 PVOID
336 NTAPI
337 MmGetSegmentRmap(PFN_NUMBER Page,
338 PULONG RawOffset);
339
340 NTSTATUS
341 NTAPI
342 MmNotPresentFaultCacheSection(KPROCESSOR_MODE Mode,
343 ULONG_PTR Address,
344 BOOLEAN FromMdl);
345
346 ULONG
347 NTAPI
348 MiCacheEvictPages(PMM_SECTION_SEGMENT Segment,
349 ULONG Target);
350
351 NTSTATUS
352 MiRosTrimCache(ULONG Target,
353 ULONG Priority,
354 PULONG NrFreed);
355