The system never considered "ReservedPages" as any different from "SystemPages",...
[reactos.git] / reactos / ntoskrnl / include / internal / mm.h
1 #ifndef __INCLUDE_INTERNAL_MM_H
2 #define __INCLUDE_INTERNAL_MM_H
3
4 #include <internal/arch/mm.h>
5
6 /* TYPES *********************************************************************/
7
8 struct _EPROCESS;
9
10 extern ULONG MiFreeSwapPages;
11 extern ULONG MiUsedSwapPages;
12 extern ULONG MmPagedPoolSize;
13 extern ULONG MmTotalPagedPoolQuota;
14 extern ULONG MmTotalNonPagedPoolQuota;
15 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress;
16 extern ULONG MmNumberOfPhysicalPages;
17
18 extern PVOID MmPagedPoolBase;
19 extern ULONG MmPagedPoolSize;
20
21 struct _KTRAP_FRAME;
22 struct _EPROCESS;
23 struct _MM_RMAP_ENTRY;
24 struct _MM_PAGEOP;
25 typedef ULONG SWAPENTRY;
26 typedef ULONG PFN_TYPE, *PPFN_TYPE;
27
28 #define MEMORY_AREA_INVALID (0)
29 #define MEMORY_AREA_SECTION_VIEW (1)
30 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
31 #define MEMORY_AREA_NO_CACHE (3)
32 #define MEMORY_AREA_IO_MAPPING (4)
33 #define MEMORY_AREA_SYSTEM (5)
34 #define MEMORY_AREA_MDL_MAPPING (7)
35 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
36 #define MEMORY_AREA_CACHE_SEGMENT (9)
37 #define MEMORY_AREA_SHARED_DATA (10)
38 #define MEMORY_AREA_KERNEL_STACK (11)
39 #define MEMORY_AREA_PAGED_POOL (12)
40 #define MEMORY_AREA_NO_ACCESS (13)
41 #define MEMORY_AREA_PEB_OR_TEB (14)
42
43 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
44
45 #define MM_CORE_DUMP_TYPE_NONE (0x0)
46 #define MM_CORE_DUMP_TYPE_MINIMAL (0x1)
47 #define MM_CORE_DUMP_TYPE_FULL (0x2)
48
49 #define MM_PAGEOP_PAGEIN (1)
50 #define MM_PAGEOP_PAGEOUT (2)
51 #define MM_PAGEOP_PAGESYNCH (3)
52 #define MM_PAGEOP_ACCESSFAULT (4)
53
54 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
55 ((x) / (4*1024*1024))
56
57 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
58 ((((x)) % (4*1024*1024)) / (4*1024))
59
60 #define NR_SECTION_PAGE_TABLES 1024
61 #define NR_SECTION_PAGE_ENTRIES 1024
62
63 #define TEB_BASE 0x7FFDE000
64
65 /* Although Microsoft says this isn't hardcoded anymore,
66 they won't be able to change it. Stuff depends on it */
67 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
68
69 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
70
71 /*
72 * Additional flags for protection attributes
73 */
74 #define PAGE_WRITETHROUGH (1024)
75 #define PAGE_SYSTEM (2048)
76
77 #define SEC_PHYSICALMEMORY (0x80000000)
78
79 #define MM_PAGEFILE_SEGMENT (0x1)
80 #define MM_DATAFILE_SEGMENT (0x2)
81
82 #define MC_CACHE (0)
83 #define MC_USER (1)
84 #define MC_PPOOL (2)
85 #define MC_NPPOOL (3)
86 #define MC_MAXIMUM (4)
87
88 #define PAGED_POOL_MASK 1
89 #define MUST_SUCCEED_POOL_MASK 2
90 #define CACHE_ALIGNED_POOL_MASK 4
91 #define QUOTA_POOL_MASK 8
92 #define SESSION_POOL_MASK 32
93 #define VERIFIER_POOL_MASK 64
94
95 #define MM_PAGED_POOL_SIZE (100*1024*1024)
96 #define MM_NONPAGED_POOL_SIZE (100*1024*1024)
97
98 /*
99 * Paged and non-paged pools are 8-byte aligned
100 */
101 #define MM_POOL_ALIGNMENT 8
102
103 /*
104 * Maximum size of the kmalloc area (this is totally arbitary)
105 */
106 #define MM_KERNEL_MAP_SIZE (16*1024*1024)
107 #define MM_KERNEL_MAP_BASE (0xf0c00000)
108
109 /*
110 * FIXME - different architectures have different cache line sizes...
111 */
112 #define MM_CACHE_LINE_SIZE 32
113
114 #define MM_ROUND_UP(x,s) \
115 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
116
117 #define MM_ROUND_DOWN(x,s) \
118 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
119
120 #define PAGE_FLAGS_VALID_FROM_USER_MODE \
121 (PAGE_READONLY | \
122 PAGE_READWRITE | \
123 PAGE_WRITECOPY | \
124 PAGE_EXECUTE | \
125 PAGE_EXECUTE_READ | \
126 PAGE_EXECUTE_READWRITE | \
127 PAGE_EXECUTE_WRITECOPY | \
128 PAGE_GUARD | \
129 PAGE_NOACCESS | \
130 PAGE_NOCACHE)
131
132 #define PAGE_IS_READABLE \
133 (PAGE_READONLY | \
134 PAGE_READWRITE | \
135 PAGE_WRITECOPY | \
136 PAGE_EXECUTE_READ | \
137 PAGE_EXECUTE_READWRITE | \
138 PAGE_EXECUTE_WRITECOPY)
139
140 #define PAGE_IS_WRITABLE \
141 (PAGE_READWRITE | \
142 PAGE_WRITECOPY | \
143 PAGE_EXECUTE_READWRITE | \
144 PAGE_EXECUTE_WRITECOPY)
145
146 #define PAGE_IS_EXECUTABLE \
147 (PAGE_EXECUTE | \
148 PAGE_EXECUTE_READ | \
149 PAGE_EXECUTE_READWRITE | \
150 PAGE_EXECUTE_WRITECOPY)
151
152 #define PAGE_IS_WRITECOPY \
153 (PAGE_WRITECOPY | \
154 PAGE_EXECUTE_WRITECOPY)
155
156 typedef struct
157 {
158 ULONG Entry[NR_SECTION_PAGE_ENTRIES];
159 } SECTION_PAGE_TABLE, *PSECTION_PAGE_TABLE;
160
161 typedef struct
162 {
163 PSECTION_PAGE_TABLE PageTables[NR_SECTION_PAGE_TABLES];
164 } SECTION_PAGE_DIRECTORY, *PSECTION_PAGE_DIRECTORY;
165
166 typedef struct _MM_SECTION_SEGMENT
167 {
168 LONG FileOffset; /* start offset into the file for image sections */
169 ULONG_PTR VirtualAddress; /* dtart offset into the address range for image sections */
170 ULONG RawLength; /* length of the segment which is part of the mapped file */
171 ULONG Length; /* absolute length of the segment */
172 ULONG Protection;
173 FAST_MUTEX Lock; /* lock which protects the page directory */
174 ULONG ReferenceCount;
175 SECTION_PAGE_DIRECTORY PageDirectory;
176 ULONG Flags;
177 ULONG Characteristics;
178 BOOLEAN WriteCopy;
179 } MM_SECTION_SEGMENT, *PMM_SECTION_SEGMENT;
180
181 typedef struct _MM_IMAGE_SECTION_OBJECT
182 {
183 ULONG_PTR ImageBase;
184 ULONG_PTR StackReserve;
185 ULONG_PTR StackCommit;
186 ULONG_PTR EntryPoint;
187 USHORT Subsystem;
188 USHORT ImageCharacteristics;
189 USHORT MinorSubsystemVersion;
190 USHORT MajorSubsystemVersion;
191 USHORT Machine;
192 BOOLEAN Executable;
193 ULONG NrSegments;
194 ULONG ImageSize;
195 PMM_SECTION_SEGMENT Segments;
196 } MM_IMAGE_SECTION_OBJECT, *PMM_IMAGE_SECTION_OBJECT;
197
198 typedef struct _ROS_SECTION_OBJECT
199 {
200 CSHORT Type;
201 CSHORT Size;
202 LARGE_INTEGER MaximumSize;
203 ULONG SectionPageProtection;
204 ULONG AllocationAttributes;
205 PFILE_OBJECT FileObject;
206 union
207 {
208 PMM_IMAGE_SECTION_OBJECT ImageSection;
209 PMM_SECTION_SEGMENT Segment;
210 };
211 } ROS_SECTION_OBJECT, *PROS_SECTION_OBJECT;
212
213 typedef struct _MEMORY_AREA
214 {
215 PVOID StartingAddress;
216 PVOID EndingAddress;
217 struct _MEMORY_AREA *Parent;
218 struct _MEMORY_AREA *LeftChild;
219 struct _MEMORY_AREA *RightChild;
220 ULONG Type;
221 ULONG Protect;
222 ULONG Flags;
223 BOOLEAN DeleteInProgress;
224 ULONG PageOpCount;
225 union
226 {
227 struct
228 {
229 ROS_SECTION_OBJECT* Section;
230 ULONG ViewOffset;
231 PMM_SECTION_SEGMENT Segment;
232 BOOLEAN WriteCopyView;
233 LIST_ENTRY RegionListHead;
234 } SectionData;
235 struct
236 {
237 LIST_ENTRY RegionListHead;
238 } VirtualMemoryData;
239 } Data;
240 } MEMORY_AREA, *PMEMORY_AREA;
241
242 typedef struct _MADDRESS_SPACE
243 {
244 PMEMORY_AREA MemoryAreaRoot;
245 PVOID LowestAddress;
246 struct _EPROCESS* Process;
247 PUSHORT PageTableRefCountTable;
248 ULONG PageTableRefCountTableSize;
249 } MADDRESS_SPACE, *PMADDRESS_SPACE;
250
251 typedef struct
252 {
253 ULONG NrTotalPages;
254 ULONG NrSystemPages;
255 ULONG NrUserPages;
256 ULONG NrFreePages;
257 ULONG NrDirtyPages;
258 ULONG NrLockedPages;
259 ULONG PagingRequestsInLastMinute;
260 ULONG PagingRequestsInLastFiveMinutes;
261 ULONG PagingRequestsInLastFifteenMinutes;
262 } MM_STATS;
263
264 extern MM_STATS MmStats;
265
266 typedef struct _MM_PAGEOP
267 {
268 /* Type of operation. */
269 ULONG OpType;
270 /* Number of threads interested in this operation. */
271 ULONG ReferenceCount;
272 /* Event that will be set when the operation is completed. */
273 KEVENT CompletionEvent;
274 /* Status of the operation once it is completed. */
275 NTSTATUS Status;
276 /* TRUE if the operation was abandoned. */
277 BOOLEAN Abandoned;
278 /* The memory area to be affected by the operation. */
279 PMEMORY_AREA MArea;
280 ULONG Hash;
281 struct _MM_PAGEOP* Next;
282 struct _ETHREAD* Thread;
283 /*
284 * These fields are used to identify the operation if it is against a
285 * virtual memory area.
286 */
287 HANDLE Pid;
288 PVOID Address;
289 /*
290 * These fields are used to identify the operation if it is against a
291 * section mapping.
292 */
293 PMM_SECTION_SEGMENT Segment;
294 ULONG Offset;
295 } MM_PAGEOP, *PMM_PAGEOP;
296
297 typedef struct _MM_MEMORY_CONSUMER
298 {
299 ULONG PagesUsed;
300 ULONG PagesTarget;
301 NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed);
302 } MM_MEMORY_CONSUMER, *PMM_MEMORY_CONSUMER;
303
304 typedef struct _MM_REGION
305 {
306 ULONG Type;
307 ULONG Protect;
308 ULONG Length;
309 LIST_ENTRY RegionListEntry;
310 } MM_REGION, *PMM_REGION;
311
312 extern MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM];
313
314 typedef VOID
315 (*PMM_ALTER_REGION_FUNC)(
316 PMADDRESS_SPACE AddressSpace,
317 PVOID BaseAddress,
318 ULONG Length,
319 ULONG OldType,
320 ULONG OldProtect,
321 ULONG NewType,
322 ULONG NewProtect
323 );
324
325 typedef VOID
326 (*PMM_FREE_PAGE_FUNC)(
327 PVOID Context,
328 PMEMORY_AREA MemoryArea,
329 PVOID Address,
330 PFN_TYPE Page,
331 SWAPENTRY SwapEntry,
332 BOOLEAN Dirty
333 );
334
335 /* aspace.c ******************************************************************/
336
337 VOID
338 NTAPI
339 MmLockAddressSpace(PMADDRESS_SPACE AddressSpace);
340
341 VOID
342 NTAPI
343 MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace);
344
345 VOID
346 NTAPI
347 MmInitializeKernelAddressSpace(VOID);
348
349 PMADDRESS_SPACE
350 NTAPI
351 MmGetCurrentAddressSpace(VOID);
352
353 PMADDRESS_SPACE
354 NTAPI
355 MmGetKernelAddressSpace(VOID);
356
357 NTSTATUS
358 NTAPI
359 MmInitializeAddressSpace(
360 struct _EPROCESS* Process,
361 PMADDRESS_SPACE AddressSpace);
362
363 NTSTATUS
364 NTAPI
365 MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace);
366
367 /* marea.c *******************************************************************/
368
369 NTSTATUS
370 NTAPI
371 MmInitMemoryAreas(VOID);
372
373 NTSTATUS
374 NTAPI
375 MmCreateMemoryArea(
376 PMADDRESS_SPACE AddressSpace,
377 ULONG Type,
378 PVOID *BaseAddress,
379 ULONG_PTR Length,
380 ULONG Protection,
381 PMEMORY_AREA *Result,
382 BOOLEAN FixedAddress,
383 ULONG AllocationFlags,
384 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
385 );
386
387 PMEMORY_AREA
388 NTAPI
389 MmLocateMemoryAreaByAddress(
390 PMADDRESS_SPACE AddressSpace,
391 PVOID Address
392 );
393
394 ULONG_PTR
395 NTAPI
396 MmFindGapAtAddress(
397 PMADDRESS_SPACE AddressSpace,
398 PVOID Address
399 );
400
401 NTSTATUS
402 NTAPI
403 MmFreeMemoryArea(
404 PMADDRESS_SPACE AddressSpace,
405 PMEMORY_AREA MemoryArea,
406 PMM_FREE_PAGE_FUNC FreePage,
407 PVOID FreePageContext
408 );
409
410 NTSTATUS
411 NTAPI
412 MmFreeMemoryAreaByPtr(
413 PMADDRESS_SPACE AddressSpace,
414 PVOID BaseAddress,
415 PMM_FREE_PAGE_FUNC FreePage,
416 PVOID FreePageContext
417 );
418
419 VOID
420 NTAPI
421 MmDumpMemoryAreas(PMADDRESS_SPACE AddressSpace);
422
423 PMEMORY_AREA
424 NTAPI
425 MmLocateMemoryAreaByRegion(
426 PMADDRESS_SPACE AddressSpace,
427 PVOID Address,
428 ULONG_PTR Length
429 );
430
431 PVOID
432 NTAPI
433 MmFindGap(
434 PMADDRESS_SPACE AddressSpace,
435 ULONG_PTR Length,
436 ULONG_PTR Granularity,
437 BOOLEAN TopDown
438 );
439
440 VOID
441 NTAPI
442 MmReleaseMemoryAreaIfDecommitted(
443 struct _EPROCESS *Process,
444 PMADDRESS_SPACE AddressSpace,
445 PVOID BaseAddress
446 );
447
448 /* npool.c *******************************************************************/
449
450 VOID
451 NTAPI
452 MiDebugDumpNonPagedPool(BOOLEAN NewOnly);
453
454 VOID
455 NTAPI
456 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly);
457
458 VOID
459 NTAPI
460 MiInitializeNonPagedPool(VOID);
461
462 PVOID
463 NTAPI
464 MmGetMdlPageAddress(
465 PMDL Mdl,
466 PVOID Offset
467 );
468
469 /* pool.c *******************************************************************/
470
471 PVOID
472 NTAPI
473 ExAllocateNonPagedPoolWithTag(
474 POOL_TYPE type,
475 ULONG size,
476 ULONG Tag,
477 PVOID Caller
478 );
479
480 PVOID
481 NTAPI
482 ExAllocatePagedPoolWithTag(
483 POOL_TYPE Type,
484 ULONG size,
485 ULONG Tag
486 );
487
488 VOID
489 NTAPI
490 ExFreeNonPagedPool(PVOID block);
491
492 VOID
493 NTAPI
494 ExFreePagedPool(IN PVOID Block);
495
496 VOID
497 NTAPI
498 MmInitializePagedPool(VOID);
499
500 PVOID
501 NTAPI
502 MiAllocateSpecialPool(
503 IN POOL_TYPE PoolType,
504 IN SIZE_T NumberOfBytes,
505 IN ULONG Tag,
506 IN ULONG Underrun
507 );
508
509 BOOLEAN
510 NTAPI
511 MiRaisePoolQuota(
512 IN POOL_TYPE PoolType,
513 IN ULONG CurrentMaxQuota,
514 OUT PULONG NewMaxQuota
515 );
516
517 /* mdl.c *********************************************************************/
518
519 VOID
520 NTAPI
521 MmBuildMdlFromPages(
522 PMDL Mdl,
523 PULONG Pages
524 );
525
526 /* mminit.c ******************************************************************/
527
528 VOID
529 NTAPI
530 MiShutdownMemoryManager(VOID);
531
532 VOID
533 NTAPI
534 MmInit1(
535 ULONG_PTR FirstKernelPhysAddress,
536 ULONG_PTR LastKernelPhysAddress,
537 ULONG_PTR LastKernelAddress,
538 PADDRESS_RANGE BIOSMemoryMap,
539 ULONG AddressRangeCount,
540 ULONG MaxMemInMeg
541 );
542
543 BOOLEAN
544 NTAPI
545 MmInitSystem(IN ULONG Phase,
546 IN PLOADER_PARAMETER_BLOCK LoaderBlock);
547
548 VOID
549 NTAPI
550 MiFreeInitMemory(VOID);
551
552 VOID
553 NTAPI
554 MmInitializeMdlImplementation(VOID);
555
556 /* pagefile.c ****************************************************************/
557
558 SWAPENTRY
559 NTAPI
560 MmAllocSwapPage(VOID);
561
562 VOID
563 NTAPI
564 MmDereserveSwapPages(ULONG Nr);
565
566 VOID
567 NTAPI
568 MmFreeSwapPage(SWAPENTRY Entry);
569
570 VOID
571 NTAPI
572 MmInitPagingFile(VOID);
573
574 NTSTATUS
575 NTAPI
576 MmReadFromSwapPage(
577 SWAPENTRY SwapEntry,
578 PFN_TYPE Page
579 );
580
581 BOOLEAN
582 NTAPI
583 MmReserveSwapPages(ULONG Nr);
584
585 NTSTATUS
586 NTAPI
587 MmWriteToSwapPage(
588 SWAPENTRY SwapEntry,
589 PFN_TYPE Page
590 );
591
592 NTSTATUS
593 NTAPI
594 MmDumpToPagingFile(
595 ULONG BugCode,
596 ULONG BugCodeParameter1,
597 ULONG BugCodeParameter2,
598 ULONG BugCodeParameter3,
599 ULONG BugCodeParameter4,
600 struct _KTRAP_FRAME* TrapFrame
601 );
602
603 BOOLEAN
604 NTAPI
605 MmIsAvailableSwapPage(VOID);
606
607 VOID
608 NTAPI
609 MmShowOutOfSpaceMessagePagingFile(VOID);
610
611 /* process.c ****************************************************************/
612
613 NTSTATUS
614 NTAPI
615 MmInitializeProcessAddressSpace(
616 IN PEPROCESS Process,
617 IN PEPROCESS Clone OPTIONAL,
618 IN PVOID Section OPTIONAL,
619 IN OUT PULONG Flags,
620 IN POBJECT_NAME_INFORMATION *AuditName OPTIONAL
621 );
622
623 NTSTATUS
624 NTAPI
625 MmCreatePeb(struct _EPROCESS *Process);
626
627 PTEB
628 NTAPI
629 MmCreateTeb(
630 struct _EPROCESS *Process,
631 PCLIENT_ID ClientId,
632 PINITIAL_TEB InitialTeb
633 );
634
635 VOID
636 NTAPI
637 MmDeleteTeb(
638 struct _EPROCESS *Process,
639 PTEB Teb
640 );
641
642 VOID
643 NTAPI
644 MmCleanProcessAddressSpace(IN PEPROCESS Process);
645
646 NTSTATUS
647 NTAPI
648 MmDeleteProcessAddressSpace(IN PEPROCESS Process);
649
650 ULONG
651 NTAPI
652 MmGetSessionLocaleId(VOID);
653
654 NTSTATUS
655 NTAPI
656 MmSetMemoryPriorityProcess(
657 IN PEPROCESS Process,
658 IN UCHAR MemoryPriority
659 );
660
661 /* i386/pfault.c *************************************************************/
662
663 NTSTATUS
664 NTAPI
665 MmPageFault(
666 ULONG Cs,
667 PULONG Eip,
668 PULONG Eax,
669 ULONG Cr2,
670 ULONG ErrorCode
671 );
672
673 /* mm.c **********************************************************************/
674
675 NTSTATUS
676 NTAPI
677 MmAccessFault(
678 IN BOOLEAN StoreInstruction,
679 IN PVOID Address,
680 IN KPROCESSOR_MODE Mode,
681 IN PVOID TrapInformation
682 );
683
684 /* anonmem.c *****************************************************************/
685
686 NTSTATUS
687 NTAPI
688 MmNotPresentFaultVirtualMemory(
689 PMADDRESS_SPACE AddressSpace,
690 MEMORY_AREA* MemoryArea,
691 PVOID Address,
692 BOOLEAN Locked
693 );
694
695 NTSTATUS
696 NTAPI
697 MmPageOutVirtualMemory(
698 PMADDRESS_SPACE AddressSpace,
699 PMEMORY_AREA MemoryArea,
700 PVOID Address,
701 struct _MM_PAGEOP* PageOp
702 );
703
704 NTSTATUS
705 NTAPI
706 MmQueryAnonMem(
707 PMEMORY_AREA MemoryArea,
708 PVOID Address,
709 PMEMORY_BASIC_INFORMATION Info,
710 PULONG ResultLength
711 );
712
713 VOID
714 NTAPI
715 MmFreeVirtualMemory(
716 struct _EPROCESS* Process,
717 PMEMORY_AREA MemoryArea
718 );
719
720 NTSTATUS
721 NTAPI
722 MmProtectAnonMem(
723 PMADDRESS_SPACE AddressSpace,
724 PMEMORY_AREA MemoryArea,
725 PVOID BaseAddress,
726 ULONG Length,
727 ULONG Protect,
728 PULONG OldProtect
729 );
730
731 NTSTATUS
732 NTAPI
733 MmWritePageVirtualMemory(
734 PMADDRESS_SPACE AddressSpace,
735 PMEMORY_AREA MArea,
736 PVOID Address,
737 PMM_PAGEOP PageOp
738 );
739
740 /* kmap.c ********************************************************************/
741
742 PVOID
743 NTAPI
744 ExAllocatePage(VOID);
745
746 VOID
747 NTAPI
748 ExUnmapPage(PVOID Addr);
749
750 PVOID
751 NTAPI
752 ExAllocatePageWithPhysPage(PFN_TYPE Page);
753
754 NTSTATUS
755 NTAPI
756 MiCopyFromUserPage(
757 PFN_TYPE Page,
758 PVOID SourceAddress
759 );
760
761 NTSTATUS
762 NTAPI
763 MiZeroPage(PFN_TYPE Page);
764
765 /* memsafe.s *****************************************************************/
766
767 PVOID
768 FASTCALL
769 MmSafeReadPtr(PVOID Source);
770
771 /* pageop.c ******************************************************************/
772
773 VOID
774 NTAPI
775 MmReleasePageOp(PMM_PAGEOP PageOp);
776
777 PMM_PAGEOP
778 NTAPI
779 MmGetPageOp(
780 PMEMORY_AREA MArea,
781 HANDLE Pid,
782 PVOID Address,
783 PMM_SECTION_SEGMENT Segment,
784 ULONG Offset,
785 ULONG OpType,
786 BOOLEAN First
787 );
788
789 PMM_PAGEOP
790 NTAPI
791 MmCheckForPageOp(
792 PMEMORY_AREA MArea,
793 HANDLE Pid,
794 PVOID Address,
795 PMM_SECTION_SEGMENT Segment,
796 ULONG Offset
797 );
798
799 VOID
800 NTAPI
801 MmInitializePageOp(VOID);
802
803 /* process.c *****************************************************************/
804
805 PVOID
806 NTAPI
807 MmCreateKernelStack(BOOLEAN GuiStack, UCHAR Node);
808
809 VOID
810 NTAPI
811 MmDeleteKernelStack(PVOID Stack,
812 BOOLEAN GuiStack);
813
814 /* balace.c ******************************************************************/
815
816 VOID
817 NTAPI
818 MmInitializeMemoryConsumer(
819 ULONG Consumer,
820 NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed)
821 );
822
823 VOID
824 NTAPI
825 MmInitializeBalancer(
826 ULONG NrAvailablePages,
827 ULONG NrSystemPages
828 );
829
830 NTSTATUS
831 NTAPI
832 MmReleasePageMemoryConsumer(
833 ULONG Consumer,
834 PFN_TYPE Page
835 );
836
837 NTSTATUS
838 NTAPI
839 MmRequestPageMemoryConsumer(
840 ULONG Consumer,
841 BOOLEAN MyWait,
842 PPFN_TYPE AllocatedPage
843 );
844
845 VOID
846 NTAPI
847 MiInitBalancerThread(VOID);
848
849 VOID
850 NTAPI
851 MmRebalanceMemoryConsumers(VOID);
852
853 /* rmap.c **************************************************************/
854
855 VOID
856 NTAPI
857 MmSetRmapListHeadPage(
858 PFN_TYPE Page,
859 struct _MM_RMAP_ENTRY* ListHead
860 );
861
862 struct _MM_RMAP_ENTRY*
863 NTAPI
864 MmGetRmapListHeadPage(PFN_TYPE Page);
865
866 VOID
867 NTAPI
868 MmInsertRmap(
869 PFN_TYPE Page,
870 struct _EPROCESS *Process,
871 PVOID Address
872 );
873
874 VOID
875 NTAPI
876 MmDeleteAllRmaps(
877 PFN_TYPE Page,
878 PVOID Context,
879 VOID (*DeleteMapping)(PVOID Context, struct _EPROCESS *Process, PVOID Address)
880 );
881
882 VOID
883 NTAPI
884 MmDeleteRmap(
885 PFN_TYPE Page,
886 struct _EPROCESS *Process,
887 PVOID Address
888 );
889
890 VOID
891 NTAPI
892 MmInitializeRmapList(VOID);
893
894 VOID
895 NTAPI
896 MmSetCleanAllRmaps(PFN_TYPE Page);
897
898 VOID
899 NTAPI
900 MmSetDirtyAllRmaps(PFN_TYPE Page);
901
902 BOOLEAN
903 NTAPI
904 MmIsDirtyPageRmap(PFN_TYPE Page);
905
906 NTSTATUS
907 NTAPI
908 MmWritePagePhysicalAddress(PFN_TYPE Page);
909
910 NTSTATUS
911 NTAPI
912 MmPageOutPhysicalAddress(PFN_TYPE Page);
913
914 /* freelist.c **********************************************************/
915
916 PFN_TYPE
917 NTAPI
918 MmGetLRUNextUserPage(PFN_TYPE PreviousPage);
919
920 PFN_TYPE
921 NTAPI
922 MmGetLRUFirstUserPage(VOID);
923
924 VOID
925 NTAPI
926 MmSetLRULastPage(PFN_TYPE Page);
927
928 VOID
929 NTAPI
930 MmLockPage(PFN_TYPE Page);
931
932 VOID
933 NTAPI
934 MmLockPageUnsafe(PFN_TYPE Page);
935
936 VOID
937 NTAPI
938 MmUnlockPage(PFN_TYPE Page);
939
940 ULONG
941 NTAPI
942 MmGetLockCountPage(PFN_TYPE Page);
943
944 PVOID
945 NTAPI
946 MmInitializePageList(
947 ULONG_PTR FirstPhysKernelAddress,
948 ULONG_PTR LastPhysKernelAddress,
949 ULONG MemorySizeInPages,
950 ULONG_PTR LastKernelBase,
951 PADDRESS_RANGE BIOSMemoryMap,
952 ULONG AddressRangeCount
953 );
954
955 PFN_TYPE
956 NTAPI
957 MmGetContinuousPages(
958 ULONG NumberOfBytes,
959 PHYSICAL_ADDRESS LowestAcceptableAddress,
960 PHYSICAL_ADDRESS HighestAcceptableAddress,
961 PHYSICAL_ADDRESS BoundaryAddressMultiple
962 );
963
964 NTSTATUS
965 NTAPI
966 MmZeroPageThreadMain(
967 PVOID Context
968 );
969
970 /* i386/page.c *********************************************************/
971
972 PVOID
973 NTAPI
974 MmCreateHyperspaceMapping(PFN_TYPE Page);
975
976 PFN_TYPE
977 NTAPI
978 MmChangeHyperspaceMapping(
979 PVOID Address,
980 PFN_TYPE Page
981 );
982
983 PFN_TYPE
984 NTAPI
985 MmDeleteHyperspaceMapping(PVOID Address);
986
987 NTSTATUS
988 NTAPI
989 MmCreateVirtualMappingForKernel(
990 PVOID Address,
991 ULONG flProtect,
992 PPFN_TYPE Pages,
993 ULONG PageCount
994 );
995
996 NTSTATUS
997 NTAPI
998 MmCommitPagedPoolAddress(
999 PVOID Address,
1000 BOOLEAN Locked
1001 );
1002
1003 NTSTATUS
1004 NTAPI
1005 MmCreateVirtualMapping(
1006 struct _EPROCESS* Process,
1007 PVOID Address,
1008 ULONG flProtect,
1009 PPFN_TYPE Pages,
1010 ULONG PageCount
1011 );
1012
1013 NTSTATUS
1014 NTAPI
1015 MmCreateVirtualMappingUnsafe(
1016 struct _EPROCESS* Process,
1017 PVOID Address,
1018 ULONG flProtect,
1019 PPFN_TYPE Pages,
1020 ULONG PageCount
1021 );
1022
1023 ULONG
1024 NTAPI
1025 MmGetPageProtect(
1026 struct _EPROCESS* Process,
1027 PVOID Address);
1028
1029 VOID
1030 NTAPI
1031 MmSetPageProtect(
1032 struct _EPROCESS* Process,
1033 PVOID Address,
1034 ULONG flProtect
1035 );
1036
1037 BOOLEAN
1038 NTAPI
1039 MmIsPagePresent(
1040 struct _EPROCESS* Process,
1041 PVOID Address
1042 );
1043
1044 VOID
1045 NTAPI
1046 MmInitGlobalKernelPageDirectory(VOID);
1047
1048 VOID
1049 NTAPI
1050 MmDisableVirtualMapping(
1051 struct _EPROCESS *Process,
1052 PVOID Address,
1053 BOOLEAN* WasDirty,
1054 PPFN_TYPE Page
1055 );
1056
1057 VOID
1058 NTAPI
1059 MmEnableVirtualMapping(
1060 struct _EPROCESS *Process,
1061 PVOID Address
1062 );
1063
1064 VOID
1065 NTAPI
1066 MmRawDeleteVirtualMapping(PVOID Address);
1067
1068 VOID
1069 NTAPI
1070 MmDeletePageFileMapping(
1071 struct _EPROCESS *Process,
1072 PVOID Address,
1073 SWAPENTRY* SwapEntry
1074 );
1075
1076 NTSTATUS
1077 NTAPI
1078 MmCreatePageFileMapping(
1079 struct _EPROCESS *Process,
1080 PVOID Address,
1081 SWAPENTRY SwapEntry
1082 );
1083
1084 BOOLEAN
1085 NTAPI
1086 MmIsPageSwapEntry(
1087 struct _EPROCESS *Process,
1088 PVOID Address
1089 );
1090
1091 VOID
1092 NTAPI
1093 MmTransferOwnershipPage(
1094 PFN_TYPE Page,
1095 ULONG NewConsumer
1096 );
1097
1098 VOID
1099 NTAPI
1100 MmSetDirtyPage(
1101 struct _EPROCESS *Process,
1102 PVOID Address
1103 );
1104
1105 PFN_TYPE
1106 NTAPI
1107 MmAllocPage(
1108 ULONG Consumer,
1109 SWAPENTRY SavedSwapEntry
1110 );
1111
1112 LONG
1113 NTAPI
1114 MmAllocPagesSpecifyRange(
1115 ULONG Consumer,
1116 PHYSICAL_ADDRESS LowestAddress,
1117 PHYSICAL_ADDRESS HighestAddress,
1118 ULONG NumberOfPages,
1119 PPFN_TYPE Pages
1120 );
1121
1122 VOID
1123 NTAPI
1124 MmDereferencePage(PFN_TYPE Page);
1125
1126 VOID
1127 NTAPI
1128 MmReferencePage(PFN_TYPE Page);
1129
1130 VOID
1131 NTAPI
1132 MmReferencePageUnsafe(PFN_TYPE Page);
1133
1134 BOOLEAN
1135 NTAPI
1136 MmIsAccessedAndResetAccessPage(
1137 struct _EPROCESS *Process,
1138 PVOID Address
1139 );
1140
1141 ULONG
1142 NTAPI
1143 MmGetReferenceCountPage(PFN_TYPE Page);
1144
1145 BOOLEAN
1146 NTAPI
1147 MmIsPageInUse(PFN_TYPE Page);
1148
1149 VOID
1150 NTAPI
1151 MmSetFlagsPage(
1152 PFN_TYPE Page,
1153 ULONG Flags);
1154
1155 ULONG
1156 NTAPI
1157 MmGetFlagsPage(PFN_TYPE Page);
1158
1159 VOID
1160 NTAPI
1161 MmSetSavedSwapEntryPage(
1162 PFN_TYPE Page,
1163 SWAPENTRY SavedSwapEntry);
1164
1165 SWAPENTRY
1166 NTAPI
1167 MmGetSavedSwapEntryPage(PFN_TYPE Page);
1168
1169 VOID
1170 NTAPI
1171 MmSetCleanPage(
1172 struct _EPROCESS *Process,
1173 PVOID Address
1174 );
1175
1176 NTSTATUS
1177 NTAPI
1178 MmCreatePageTable(PVOID PAddress);
1179
1180 VOID
1181 NTAPI
1182 MmDeletePageTable(
1183 struct _EPROCESS *Process,
1184 PVOID Address
1185 );
1186
1187 PFN_TYPE
1188 NTAPI
1189 MmGetPfnForProcess(
1190 struct _EPROCESS *Process,
1191 PVOID Address
1192 );
1193
1194 BOOLEAN
1195 NTAPI
1196 MmCreateProcessAddressSpace(
1197 IN ULONG MinWs,
1198 IN PEPROCESS Dest,
1199 IN PLARGE_INTEGER DirectoryTableBase
1200 );
1201
1202 NTSTATUS
1203 NTAPI
1204 MmInitializeHandBuiltProcess(
1205 IN PEPROCESS Process,
1206 IN PLARGE_INTEGER DirectoryTableBase
1207 );
1208
1209
1210 NTSTATUS
1211 NTAPI
1212 MmInitializeHandBuiltProcess2(
1213 IN PEPROCESS Process
1214 );
1215
1216 NTSTATUS
1217 NTAPI
1218 MmReleaseMmInfo(struct _EPROCESS *Process);
1219
1220 NTSTATUS
1221 NTAPI
1222 Mmi386ReleaseMmInfo(struct _EPROCESS *Process);
1223
1224 VOID
1225 NTAPI
1226 MmDeleteVirtualMapping(
1227 struct _EPROCESS *Process,
1228 PVOID Address,
1229 BOOLEAN FreePage,
1230 BOOLEAN* WasDirty,
1231 PPFN_TYPE Page
1232 );
1233
1234 BOOLEAN
1235 NTAPI
1236 MmIsDirtyPage(
1237 struct _EPROCESS *Process,
1238 PVOID Address
1239 );
1240
1241 VOID
1242 NTAPI
1243 MmMarkPageMapped(PFN_TYPE Page);
1244
1245 VOID
1246 NTAPI
1247 MmMarkPageUnmapped(PFN_TYPE Page);
1248
1249 VOID
1250 NTAPI
1251 MmUpdatePageDir(
1252 struct _EPROCESS *Process,
1253 PVOID Address,
1254 ULONG Size
1255 );
1256
1257 VOID
1258 NTAPI
1259 MiInitPageDirectoryMap(VOID);
1260
1261 ULONG
1262 NTAPI
1263 MiGetUserPageDirectoryCount(VOID);
1264
1265 /* wset.c ********************************************************************/
1266
1267 NTSTATUS
1268 MmTrimUserMemory(
1269 ULONG Target,
1270 ULONG Priority,
1271 PULONG NrFreedPages
1272 );
1273
1274 /* region.c ************************************************************/
1275
1276 NTSTATUS
1277 NTAPI
1278 MmAlterRegion(
1279 PMADDRESS_SPACE AddressSpace,
1280 PVOID BaseAddress,
1281 PLIST_ENTRY RegionListHead,
1282 PVOID StartAddress,
1283 ULONG Length,
1284 ULONG NewType,
1285 ULONG NewProtect,
1286 PMM_ALTER_REGION_FUNC AlterFunc
1287 );
1288
1289 VOID
1290 NTAPI
1291 MmInitializeRegion(
1292 PLIST_ENTRY RegionListHead,
1293 SIZE_T Length,
1294 ULONG Type,
1295 ULONG Protect
1296 );
1297
1298 PMM_REGION
1299 NTAPI
1300 MmFindRegion(
1301 PVOID BaseAddress,
1302 PLIST_ENTRY RegionListHead,
1303 PVOID Address,
1304 PVOID* RegionBaseAddress
1305 );
1306
1307 /* section.c *****************************************************************/
1308
1309 PFILE_OBJECT
1310 NTAPI
1311 MmGetFileObjectForSection(
1312 IN PROS_SECTION_OBJECT Section
1313 );
1314 NTSTATUS
1315 NTAPI
1316 MmGetFileNameForAddress(
1317 IN PVOID Address,
1318 OUT PUNICODE_STRING ModuleName
1319 );
1320
1321 NTSTATUS
1322 NTAPI
1323 MmGetFileNameForSection(
1324 IN PROS_SECTION_OBJECT Section,
1325 OUT POBJECT_NAME_INFORMATION *ModuleName
1326 );
1327
1328 PVOID
1329 NTAPI
1330 MmAllocateSection(
1331 IN ULONG Length,
1332 PVOID BaseAddress
1333 );
1334
1335 NTSTATUS
1336 NTAPI
1337 MmQuerySectionView(
1338 PMEMORY_AREA MemoryArea,
1339 PVOID Address,
1340 PMEMORY_BASIC_INFORMATION Info,
1341 PULONG ResultLength
1342 );
1343
1344 NTSTATUS
1345 NTAPI
1346 MmProtectSectionView(
1347 PMADDRESS_SPACE AddressSpace,
1348 PMEMORY_AREA MemoryArea,
1349 PVOID BaseAddress,
1350 ULONG Length,
1351 ULONG Protect,
1352 PULONG OldProtect
1353 );
1354
1355 NTSTATUS
1356 NTAPI
1357 MmWritePageSectionView(
1358 PMADDRESS_SPACE AddressSpace,
1359 PMEMORY_AREA MArea,
1360 PVOID Address,
1361 PMM_PAGEOP PageOp
1362 );
1363
1364 NTSTATUS
1365 NTAPI
1366 MmInitSectionImplementation(VOID);
1367
1368 NTSTATUS
1369 NTAPI
1370 MmNotPresentFaultSectionView(
1371 PMADDRESS_SPACE AddressSpace,
1372 MEMORY_AREA* MemoryArea,
1373 PVOID Address,
1374 BOOLEAN Locked
1375 );
1376
1377 NTSTATUS
1378 NTAPI
1379 MmPageOutSectionView(
1380 PMADDRESS_SPACE AddressSpace,
1381 PMEMORY_AREA MemoryArea,
1382 PVOID Address,
1383 struct _MM_PAGEOP *PageOp
1384 );
1385
1386 NTSTATUS
1387 NTAPI
1388 MmCreatePhysicalMemorySection(VOID);
1389
1390 NTSTATUS
1391 NTAPI
1392 MmAccessFaultSectionView(
1393 PMADDRESS_SPACE AddressSpace,
1394 MEMORY_AREA* MemoryArea,
1395 PVOID Address,
1396 BOOLEAN Locked
1397 );
1398
1399 VOID
1400 NTAPI
1401 MmFreeSectionSegments(PFILE_OBJECT FileObject);
1402
1403 /* mpw.c *********************************************************************/
1404
1405 NTSTATUS
1406 NTAPI
1407 MmInitMpwThread(VOID);
1408
1409 NTSTATUS
1410 NTAPI
1411 MmInitBsmThread(VOID);
1412
1413 /* pager.c *******************************************************************/
1414
1415 BOOLEAN
1416 NTAPI
1417 MiIsPagerThread(VOID);
1418
1419 VOID
1420 NTAPI
1421 MiStartPagerThread(VOID);
1422
1423 VOID
1424 NTAPI
1425 MiStopPagerThread(VOID);
1426
1427 NTSTATUS
1428 FASTCALL
1429 MiQueryVirtualMemory(
1430 IN HANDLE ProcessHandle,
1431 IN PVOID Address,
1432 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass,
1433 OUT PVOID VirtualMemoryInformation,
1434 IN ULONG Length,
1435 OUT PULONG ResultLength
1436 );
1437
1438 /* sysldr.c ******************************************************************/
1439
1440 VOID
1441 NTAPI
1442 MiReloadBootLoadedDrivers(
1443 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1444 );
1445
1446 BOOLEAN
1447 NTAPI
1448 MiInitializeLoadedModuleList(
1449 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1450 );
1451
1452 NTSTATUS
1453 NTAPI
1454 MmLoadSystemImage(
1455 IN PUNICODE_STRING FileName,
1456 IN PUNICODE_STRING NamePrefix OPTIONAL,
1457 IN PUNICODE_STRING LoadedName OPTIONAL,
1458 IN ULONG Flags,
1459 OUT PVOID *ModuleObject,
1460 OUT PVOID *ImageBaseAddress
1461 );
1462
1463 NTSTATUS
1464 NTAPI
1465 MmUnloadSystemImage(
1466 IN PVOID ImageHandle
1467 );
1468
1469 NTSTATUS
1470 NTAPI
1471 MmCheckSystemImage(
1472 IN HANDLE ImageHandle,
1473 IN BOOLEAN PurgeSection
1474 );
1475
1476 FORCEINLINE
1477 VOID
1478 NTAPI
1479 MiSyncThreadProcessViews(IN PVOID Process,
1480 IN PVOID Address,
1481 IN ULONG Size)
1482 {
1483 MmUpdatePageDir((PEPROCESS)Process, Address, Size);
1484 }
1485
1486 #endif