- Massive re-write of some parts of Ps, based on a patch I wrote almost a year ago...
[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
17 extern PVOID MmPagedPoolBase;
18 extern ULONG MmPagedPoolSize;
19
20 struct _KTRAP_FRAME;
21 struct _EPROCESS;
22 struct _MM_RMAP_ENTRY;
23 struct _MM_PAGEOP;
24 typedef ULONG SWAPENTRY;
25 typedef ULONG PFN_TYPE, *PPFN_TYPE;
26
27 #define MEMORY_AREA_INVALID (0)
28 #define MEMORY_AREA_SECTION_VIEW (1)
29 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
30 #define MEMORY_AREA_NO_CACHE (3)
31 #define MEMORY_AREA_IO_MAPPING (4)
32 #define MEMORY_AREA_SYSTEM (5)
33 #define MEMORY_AREA_MDL_MAPPING (7)
34 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
35 #define MEMORY_AREA_CACHE_SEGMENT (9)
36 #define MEMORY_AREA_SHARED_DATA (10)
37 #define MEMORY_AREA_KERNEL_STACK (11)
38 #define MEMORY_AREA_PAGED_POOL (12)
39 #define MEMORY_AREA_NO_ACCESS (13)
40 #define MEMORY_AREA_PEB_OR_TEB (14)
41
42 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
43
44 #define MM_CORE_DUMP_TYPE_NONE (0x0)
45 #define MM_CORE_DUMP_TYPE_MINIMAL (0x1)
46 #define MM_CORE_DUMP_TYPE_FULL (0x2)
47
48 #define MM_PAGEOP_PAGEIN (1)
49 #define MM_PAGEOP_PAGEOUT (2)
50 #define MM_PAGEOP_PAGESYNCH (3)
51 #define MM_PAGEOP_ACCESSFAULT (4)
52
53 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
54 ((x) / (4*1024*1024))
55
56 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
57 ((((x)) % (4*1024*1024)) / (4*1024))
58
59 #define NR_SECTION_PAGE_TABLES 1024
60 #define NR_SECTION_PAGE_ENTRIES 1024
61
62 #define TEB_BASE 0x7FFDE000
63 #define KPCR_BASE 0xFF000000
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 LONGLONG FileOffset;
169 ULONG_PTR VirtualAddress;
170 ULONG RawLength;
171 ULONG Length;
172 ULONG Protection;
173 FAST_MUTEX Lock;
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 ULONG Subsystem;
188 ULONG ImageCharacteristics;
189 USHORT MinorSubsystemVersion;
190 USHORT MajorSubsystemVersion;
191 USHORT Machine;
192 BOOLEAN Executable;
193 ULONG NrSegments;
194 PMM_SECTION_SEGMENT Segments;
195 } MM_IMAGE_SECTION_OBJECT, *PMM_IMAGE_SECTION_OBJECT;
196
197 typedef struct _ROS_SECTION_OBJECT
198 {
199 CSHORT Type;
200 CSHORT Size;
201 LARGE_INTEGER MaximumSize;
202 ULONG SectionPageProtection;
203 ULONG AllocationAttributes;
204 PFILE_OBJECT FileObject;
205 union
206 {
207 PMM_IMAGE_SECTION_OBJECT ImageSection;
208 PMM_SECTION_SEGMENT Segment;
209 };
210 } ROS_SECTION_OBJECT, *PROS_SECTION_OBJECT;
211
212 typedef struct _MEMORY_AREA
213 {
214 PVOID StartingAddress;
215 PVOID EndingAddress;
216 struct _MEMORY_AREA *Parent;
217 struct _MEMORY_AREA *LeftChild;
218 struct _MEMORY_AREA *RightChild;
219 ULONG Type;
220 ULONG Protect;
221 ULONG Flags;
222 BOOLEAN DeleteInProgress;
223 ULONG PageOpCount;
224 union
225 {
226 struct
227 {
228 ROS_SECTION_OBJECT* Section;
229 ULONG ViewOffset;
230 PMM_SECTION_SEGMENT Segment;
231 BOOLEAN WriteCopyView;
232 LIST_ENTRY RegionListHead;
233 } SectionData;
234 struct
235 {
236 LIST_ENTRY RegionListHead;
237 } VirtualMemoryData;
238 } Data;
239 } MEMORY_AREA, *PMEMORY_AREA;
240
241 typedef struct _MADDRESS_SPACE
242 {
243 PMEMORY_AREA MemoryAreaRoot;
244 PVOID LowestAddress;
245 struct _EPROCESS* Process;
246 PUSHORT PageTableRefCountTable;
247 ULONG PageTableRefCountTableSize;
248 } MADDRESS_SPACE, *PMADDRESS_SPACE;
249
250 typedef struct
251 {
252 ULONG NrTotalPages;
253 ULONG NrSystemPages;
254 ULONG NrReservedPages;
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
336 /* FUNCTIONS */
337
338 /* aspace.c ******************************************************************/
339
340 VOID
341 NTAPI
342 MmLockAddressSpace(PMADDRESS_SPACE AddressSpace);
343
344 VOID
345 NTAPI
346 MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace);
347
348 VOID
349 NTAPI
350 MmInitializeKernelAddressSpace(VOID);
351
352 PMADDRESS_SPACE
353 NTAPI
354 MmGetCurrentAddressSpace(VOID);
355
356 PMADDRESS_SPACE
357 NTAPI
358 MmGetKernelAddressSpace(VOID);
359
360 NTSTATUS
361 NTAPI
362 MmInitializeAddressSpace(
363 struct _EPROCESS* Process,
364 PMADDRESS_SPACE AddressSpace);
365
366 NTSTATUS
367 NTAPI
368 MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace);
369
370 /* marea.c *******************************************************************/
371
372 NTSTATUS
373 NTAPI
374 MmInitMemoryAreas(VOID);
375
376 NTSTATUS
377 STDCALL
378 MmCreateMemoryArea(
379 PMADDRESS_SPACE AddressSpace,
380 ULONG Type,
381 PVOID *BaseAddress,
382 ULONG_PTR Length,
383 ULONG Protection,
384 PMEMORY_AREA *Result,
385 BOOLEAN FixedAddress,
386 ULONG AllocationFlags,
387 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
388 );
389
390 PMEMORY_AREA
391 STDCALL
392 MmLocateMemoryAreaByAddress(
393 PMADDRESS_SPACE AddressSpace,
394 PVOID Address
395 );
396
397 ULONG_PTR
398 STDCALL
399 MmFindGapAtAddress(
400 PMADDRESS_SPACE AddressSpace,
401 PVOID Address
402 );
403
404 NTSTATUS
405 STDCALL
406 MmFreeMemoryArea(
407 PMADDRESS_SPACE AddressSpace,
408 PMEMORY_AREA MemoryArea,
409 PMM_FREE_PAGE_FUNC FreePage,
410 PVOID FreePageContext
411 );
412
413 NTSTATUS
414 STDCALL
415 MmFreeMemoryAreaByPtr(
416 PMADDRESS_SPACE AddressSpace,
417 PVOID BaseAddress,
418 PMM_FREE_PAGE_FUNC FreePage,
419 PVOID FreePageContext
420 );
421
422 VOID
423 STDCALL
424 MmDumpMemoryAreas(PMADDRESS_SPACE AddressSpace);
425
426 PMEMORY_AREA
427 STDCALL
428 MmLocateMemoryAreaByRegion(
429 PMADDRESS_SPACE AddressSpace,
430 PVOID Address,
431 ULONG_PTR Length
432 );
433
434 PVOID
435 STDCALL
436 MmFindGap(
437 PMADDRESS_SPACE AddressSpace,
438 ULONG_PTR Length,
439 ULONG_PTR Granularity,
440 BOOLEAN TopDown
441 );
442
443 VOID
444 STDCALL
445 MmReleaseMemoryAreaIfDecommitted(
446 struct _EPROCESS *Process,
447 PMADDRESS_SPACE AddressSpace,
448 PVOID BaseAddress
449 );
450
451 /* npool.c *******************************************************************/
452
453 VOID
454 NTAPI
455 MiDebugDumpNonPagedPool(BOOLEAN NewOnly);
456
457 VOID
458 NTAPI
459 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly);
460
461 VOID
462 NTAPI
463 MiInitializeNonPagedPool(VOID);
464
465 PVOID
466 NTAPI
467 MmGetMdlPageAddress(
468 PMDL Mdl,
469 PVOID Offset
470 );
471
472 /* pool.c *******************************************************************/
473
474 PVOID
475 STDCALL
476 ExAllocateNonPagedPoolWithTag(
477 POOL_TYPE type,
478 ULONG size,
479 ULONG Tag,
480 PVOID Caller
481 );
482
483 PVOID
484 STDCALL
485 ExAllocatePagedPoolWithTag(
486 POOL_TYPE Type,
487 ULONG size,
488 ULONG Tag
489 );
490
491 VOID
492 STDCALL
493 ExFreeNonPagedPool(PVOID block);
494
495 VOID
496 STDCALL
497 ExFreePagedPool(IN PVOID Block);
498
499 VOID
500 NTAPI
501 MmInitializePagedPool(VOID);
502
503 PVOID
504 STDCALL
505 MiAllocateSpecialPool(
506 IN POOL_TYPE PoolType,
507 IN SIZE_T NumberOfBytes,
508 IN ULONG Tag,
509 IN ULONG Underrun
510 );
511
512 BOOLEAN
513 STDCALL
514 MiRaisePoolQuota(
515 IN POOL_TYPE PoolType,
516 IN ULONG CurrentMaxQuota,
517 OUT PULONG NewMaxQuota
518 );
519
520 /* mdl.c *********************************************************************/
521
522 VOID
523 NTAPI
524 MmBuildMdlFromPages(
525 PMDL Mdl,
526 PULONG Pages
527 );
528
529 /* mminit.c ******************************************************************/
530
531 VOID
532 NTAPI
533 MiShutdownMemoryManager(VOID);
534
535 VOID
536 NTAPI
537 MmInit1(
538 ULONG_PTR FirstKernelPhysAddress,
539 ULONG_PTR LastKernelPhysAddress,
540 ULONG_PTR LastKernelAddress,
541 PADDRESS_RANGE BIOSMemoryMap,
542 ULONG AddressRangeCount,
543 ULONG MaxMemInMeg
544 );
545
546 VOID
547 NTAPI
548 MmInit2(VOID);
549
550 VOID
551 NTAPI
552 MmInit3(VOID);
553
554 VOID
555 NTAPI
556 MiFreeInitMemory(VOID);
557
558 VOID
559 NTAPI
560 MmInitializeMdlImplementation(VOID);
561
562 /* pagefile.c ****************************************************************/
563
564 SWAPENTRY
565 NTAPI
566 MmAllocSwapPage(VOID);
567
568 VOID
569 NTAPI
570 MmDereserveSwapPages(ULONG Nr);
571
572 VOID
573 NTAPI
574 MmFreeSwapPage(SWAPENTRY Entry);
575
576 VOID
577 NTAPI
578 MmInitPagingFile(VOID);
579
580 NTSTATUS
581 NTAPI
582 MmReadFromSwapPage(
583 SWAPENTRY SwapEntry,
584 PFN_TYPE Page
585 );
586
587 BOOLEAN
588 NTAPI
589 MmReserveSwapPages(ULONG Nr);
590
591 NTSTATUS
592 NTAPI
593 MmWriteToSwapPage(
594 SWAPENTRY SwapEntry,
595 PFN_TYPE Page
596 );
597
598 NTSTATUS
599 STDCALL
600 MmDumpToPagingFile(
601 ULONG BugCode,
602 ULONG BugCodeParameter1,
603 ULONG BugCodeParameter2,
604 ULONG BugCodeParameter3,
605 ULONG BugCodeParameter4,
606 struct _KTRAP_FRAME* TrapFrame
607 );
608
609 BOOLEAN
610 NTAPI
611 MmIsAvailableSwapPage(VOID);
612
613 VOID
614 NTAPI
615 MmShowOutOfSpaceMessagePagingFile(VOID);
616
617 /* process.c ****************************************************************/
618
619 NTSTATUS
620 STDCALL
621 MmCreateProcessAddressSpace(
622 IN PEPROCESS Process,
623 IN PROS_SECTION_OBJECT Section OPTIONAL
624 );
625
626 NTSTATUS
627 STDCALL
628 MmCreatePeb(struct _EPROCESS *Process);
629
630 PTEB
631 STDCALL
632 MmCreateTeb(
633 struct _EPROCESS *Process,
634 PCLIENT_ID ClientId,
635 PINITIAL_TEB InitialTeb
636 );
637
638 VOID
639 STDCALL
640 MmDeleteTeb(
641 struct _EPROCESS *Process,
642 PTEB Teb
643 );
644
645 VOID
646 NTAPI
647 MmCleanProcessAddressSpace(IN PEPROCESS Process);
648
649 NTSTATUS
650 NTAPI
651 MmDeleteProcessAddressSpace(IN PEPROCESS Process);
652
653 ULONG
654 NTAPI
655 MmGetSessionLocaleId(VOID);
656
657 /* i386/pfault.c *************************************************************/
658
659 NTSTATUS
660 NTAPI
661 MmPageFault(
662 ULONG Cs,
663 PULONG Eip,
664 PULONG Eax,
665 ULONG Cr2,
666 ULONG ErrorCode
667 );
668
669 /* mm.c **********************************************************************/
670
671 NTSTATUS
672 NTAPI
673 MmAccessFault(
674 KPROCESSOR_MODE Mode,
675 ULONG_PTR Address,
676 BOOLEAN FromMdl
677 );
678
679 NTSTATUS
680 NTAPI
681 MmNotPresentFault(
682 KPROCESSOR_MODE Mode,
683 ULONG_PTR Address,
684 BOOLEAN FromMdl
685 );
686
687 /* anonmem.c *****************************************************************/
688
689 NTSTATUS
690 NTAPI
691 MmNotPresentFaultVirtualMemory(
692 PMADDRESS_SPACE AddressSpace,
693 MEMORY_AREA* MemoryArea,
694 PVOID Address,
695 BOOLEAN Locked
696 );
697
698 NTSTATUS
699 NTAPI
700 MmPageOutVirtualMemory(
701 PMADDRESS_SPACE AddressSpace,
702 PMEMORY_AREA MemoryArea,
703 PVOID Address,
704 struct _MM_PAGEOP* PageOp
705 );
706
707 NTSTATUS
708 STDCALL
709 MmQueryAnonMem(
710 PMEMORY_AREA MemoryArea,
711 PVOID Address,
712 PMEMORY_BASIC_INFORMATION Info,
713 PULONG ResultLength
714 );
715
716 VOID
717 NTAPI
718 MmFreeVirtualMemory(
719 struct _EPROCESS* Process,
720 PMEMORY_AREA MemoryArea
721 );
722
723 NTSTATUS
724 NTAPI
725 MmProtectAnonMem(
726 PMADDRESS_SPACE AddressSpace,
727 PMEMORY_AREA MemoryArea,
728 PVOID BaseAddress,
729 ULONG Length,
730 ULONG Protect,
731 PULONG OldProtect
732 );
733
734 NTSTATUS
735 NTAPI
736 MmWritePageVirtualMemory(
737 PMADDRESS_SPACE AddressSpace,
738 PMEMORY_AREA MArea,
739 PVOID Address,
740 PMM_PAGEOP PageOp
741 );
742
743 /* kmap.c ********************************************************************/
744
745 PVOID
746 NTAPI
747 ExAllocatePage(VOID);
748
749 VOID
750 NTAPI
751 ExUnmapPage(PVOID Addr);
752
753 PVOID
754 NTAPI
755 ExAllocatePageWithPhysPage(PFN_TYPE Page);
756
757 NTSTATUS
758 NTAPI
759 MiCopyFromUserPage(
760 PFN_TYPE Page,
761 PVOID SourceAddress
762 );
763
764 NTSTATUS
765 NTAPI
766 MiZeroPage(PFN_TYPE Page);
767
768 /* memsafe.s *****************************************************************/
769
770 PVOID
771 FASTCALL
772 MmSafeReadPtr(PVOID Source);
773
774 /* pageop.c ******************************************************************/
775
776 VOID
777 NTAPI
778 MmReleasePageOp(PMM_PAGEOP PageOp);
779
780 PMM_PAGEOP
781 NTAPI
782 MmGetPageOp(
783 PMEMORY_AREA MArea,
784 HANDLE Pid,
785 PVOID Address,
786 PMM_SECTION_SEGMENT Segment,
787 ULONG Offset,
788 ULONG OpType,
789 BOOLEAN First
790 );
791
792 PMM_PAGEOP
793 NTAPI
794 MmCheckForPageOp(
795 PMEMORY_AREA MArea,
796 HANDLE Pid,
797 PVOID Address,
798 PMM_SECTION_SEGMENT Segment,
799 ULONG Offset
800 );
801
802 VOID
803 NTAPI
804 MmInitializePageOp(VOID);
805
806 /* process.c *****************************************************************/
807
808 PVOID
809 STDCALL
810 MmCreateKernelStack(BOOLEAN GuiStack);
811
812 VOID
813 STDCALL
814 MmDeleteKernelStack(PVOID Stack,
815 BOOLEAN GuiStack);
816
817 /* balace.c ******************************************************************/
818
819 VOID
820 NTAPI
821 MmInitializeMemoryConsumer(
822 ULONG Consumer,
823 NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed)
824 );
825
826 VOID
827 NTAPI
828 MmInitializeBalancer(
829 ULONG NrAvailablePages,
830 ULONG NrSystemPages
831 );
832
833 NTSTATUS
834 NTAPI
835 MmReleasePageMemoryConsumer(
836 ULONG Consumer,
837 PFN_TYPE Page
838 );
839
840 NTSTATUS
841 NTAPI
842 MmRequestPageMemoryConsumer(
843 ULONG Consumer,
844 BOOLEAN MyWait,
845 PPFN_TYPE AllocatedPage
846 );
847
848 VOID
849 NTAPI
850 MiInitBalancerThread(VOID);
851
852 VOID
853 NTAPI
854 MmRebalanceMemoryConsumers(VOID);
855
856 /* rmap.c **************************************************************/
857
858 VOID
859 NTAPI
860 MmSetRmapListHeadPage(
861 PFN_TYPE Page,
862 struct _MM_RMAP_ENTRY* ListHead
863 );
864
865 struct _MM_RMAP_ENTRY*
866 NTAPI
867 MmGetRmapListHeadPage(PFN_TYPE Page);
868
869 VOID
870 NTAPI
871 MmInsertRmap(
872 PFN_TYPE Page,
873 struct _EPROCESS *Process,
874 PVOID Address
875 );
876
877 VOID
878 NTAPI
879 MmDeleteAllRmaps(
880 PFN_TYPE Page,
881 PVOID Context,
882 VOID (*DeleteMapping)(PVOID Context, struct _EPROCESS *Process, PVOID Address)
883 );
884
885 VOID
886 NTAPI
887 MmDeleteRmap(
888 PFN_TYPE Page,
889 struct _EPROCESS *Process,
890 PVOID Address
891 );
892
893 VOID
894 NTAPI
895 MmInitializeRmapList(VOID);
896
897 VOID
898 NTAPI
899 MmSetCleanAllRmaps(PFN_TYPE Page);
900
901 VOID
902 NTAPI
903 MmSetDirtyAllRmaps(PFN_TYPE Page);
904
905 BOOLEAN
906 NTAPI
907 MmIsDirtyPageRmap(PFN_TYPE Page);
908
909 NTSTATUS
910 NTAPI
911 MmWritePagePhysicalAddress(PFN_TYPE Page);
912
913 NTSTATUS
914 NTAPI
915 MmPageOutPhysicalAddress(PFN_TYPE Page);
916
917 /* freelist.c **********************************************************/
918
919 PFN_TYPE
920 NTAPI
921 MmGetLRUNextUserPage(PFN_TYPE PreviousPage);
922
923 PFN_TYPE
924 NTAPI
925 MmGetLRUFirstUserPage(VOID);
926
927 VOID
928 NTAPI
929 MmSetLRULastPage(PFN_TYPE Page);
930
931 VOID
932 NTAPI
933 MmLockPage(PFN_TYPE Page);
934
935 VOID
936 NTAPI
937 MmLockPageUnsafe(PFN_TYPE Page);
938
939 VOID
940 NTAPI
941 MmUnlockPage(PFN_TYPE Page);
942
943 ULONG
944 NTAPI
945 MmGetLockCountPage(PFN_TYPE Page);
946
947 PVOID
948 NTAPI
949 MmInitializePageList(
950 ULONG_PTR FirstPhysKernelAddress,
951 ULONG_PTR LastPhysKernelAddress,
952 ULONG MemorySizeInPages,
953 ULONG_PTR LastKernelBase,
954 PADDRESS_RANGE BIOSMemoryMap,
955 ULONG AddressRangeCount
956 );
957
958 PFN_TYPE
959 NTAPI
960 MmGetContinuousPages(
961 ULONG NumberOfBytes,
962 PHYSICAL_ADDRESS LowestAcceptableAddress,
963 PHYSICAL_ADDRESS HighestAcceptableAddress,
964 PHYSICAL_ADDRESS BoundaryAddressMultiple
965 );
966
967 NTSTATUS
968 NTAPI
969 MmInitZeroPageThread(VOID);
970
971 /* i386/page.c *********************************************************/
972
973 PVOID
974 NTAPI
975 MmCreateHyperspaceMapping(PFN_TYPE Page);
976
977 PFN_TYPE
978 NTAPI
979 MmChangeHyperspaceMapping(
980 PVOID Address,
981 PFN_TYPE Page
982 );
983
984 PFN_TYPE
985 NTAPI
986 MmDeleteHyperspaceMapping(PVOID Address);
987
988 NTSTATUS
989 NTAPI
990 MmCreateVirtualMappingForKernel(
991 PVOID Address,
992 ULONG flProtect,
993 PPFN_TYPE Pages,
994 ULONG PageCount
995 );
996
997 NTSTATUS
998 NTAPI
999 MmCommitPagedPoolAddress(
1000 PVOID Address,
1001 BOOLEAN Locked
1002 );
1003
1004 NTSTATUS
1005 NTAPI
1006 MmCreateVirtualMapping(
1007 struct _EPROCESS* Process,
1008 PVOID Address,
1009 ULONG flProtect,
1010 PPFN_TYPE Pages,
1011 ULONG PageCount
1012 );
1013
1014 NTSTATUS
1015 NTAPI
1016 MmCreateVirtualMappingUnsafe(
1017 struct _EPROCESS* Process,
1018 PVOID Address,
1019 ULONG flProtect,
1020 PPFN_TYPE Pages,
1021 ULONG PageCount
1022 );
1023
1024 ULONG
1025 NTAPI
1026 MmGetPageProtect(
1027 struct _EPROCESS* Process,
1028 PVOID Address);
1029
1030 VOID
1031 NTAPI
1032 MmSetPageProtect(
1033 struct _EPROCESS* Process,
1034 PVOID Address,
1035 ULONG flProtect
1036 );
1037
1038 BOOLEAN
1039 NTAPI
1040 MmIsPagePresent(
1041 struct _EPROCESS* Process,
1042 PVOID Address
1043 );
1044
1045 VOID
1046 NTAPI
1047 MmInitGlobalKernelPageDirectory(VOID);
1048
1049 VOID
1050 NTAPI
1051 MmDisableVirtualMapping(
1052 struct _EPROCESS *Process,
1053 PVOID Address,
1054 BOOLEAN* WasDirty,
1055 PPFN_TYPE Page
1056 );
1057
1058 VOID
1059 NTAPI
1060 MmEnableVirtualMapping(
1061 struct _EPROCESS *Process,
1062 PVOID Address
1063 );
1064
1065 VOID
1066 NTAPI
1067 MmRawDeleteVirtualMapping(PVOID Address);
1068
1069 VOID
1070 NTAPI
1071 MmDeletePageFileMapping(
1072 struct _EPROCESS *Process,
1073 PVOID Address,
1074 SWAPENTRY* SwapEntry
1075 );
1076
1077 NTSTATUS
1078 NTAPI
1079 MmCreatePageFileMapping(
1080 struct _EPROCESS *Process,
1081 PVOID Address,
1082 SWAPENTRY SwapEntry
1083 );
1084
1085 BOOLEAN
1086 NTAPI
1087 MmIsPageSwapEntry(
1088 struct _EPROCESS *Process,
1089 PVOID Address
1090 );
1091
1092 VOID
1093 NTAPI
1094 MmTransferOwnershipPage(
1095 PFN_TYPE Page,
1096 ULONG NewConsumer
1097 );
1098
1099 VOID
1100 NTAPI
1101 MmSetDirtyPage(
1102 struct _EPROCESS *Process,
1103 PVOID Address
1104 );
1105
1106 PFN_TYPE
1107 NTAPI
1108 MmAllocPage(
1109 ULONG Consumer,
1110 SWAPENTRY SavedSwapEntry
1111 );
1112
1113 LONG
1114 NTAPI
1115 MmAllocPagesSpecifyRange(
1116 ULONG Consumer,
1117 PHYSICAL_ADDRESS LowestAddress,
1118 PHYSICAL_ADDRESS HighestAddress,
1119 ULONG NumberOfPages,
1120 PPFN_TYPE Pages
1121 );
1122
1123 VOID
1124 NTAPI
1125 MmDereferencePage(PFN_TYPE Page);
1126
1127 VOID
1128 NTAPI
1129 MmReferencePage(PFN_TYPE Page);
1130
1131 VOID
1132 NTAPI
1133 MmReferencePageUnsafe(PFN_TYPE Page);
1134
1135 BOOLEAN
1136 NTAPI
1137 MmIsAccessedAndResetAccessPage(
1138 struct _EPROCESS *Process,
1139 PVOID Address
1140 );
1141
1142 ULONG
1143 NTAPI
1144 MmGetReferenceCountPage(PFN_TYPE Page);
1145
1146 BOOLEAN
1147 NTAPI
1148 MmIsUsablePage(PFN_TYPE Page);
1149
1150 VOID
1151 NTAPI
1152 MmSetFlagsPage(
1153 PFN_TYPE Page,
1154 ULONG Flags);
1155
1156 ULONG
1157 NTAPI
1158 MmGetFlagsPage(PFN_TYPE Page);
1159
1160 VOID
1161 NTAPI
1162 MmSetSavedSwapEntryPage(
1163 PFN_TYPE Page,
1164 SWAPENTRY SavedSwapEntry);
1165
1166 SWAPENTRY
1167 NTAPI
1168 MmGetSavedSwapEntryPage(PFN_TYPE Page);
1169
1170 VOID
1171 NTAPI
1172 MmSetCleanPage(
1173 struct _EPROCESS *Process,
1174 PVOID Address
1175 );
1176
1177 NTSTATUS
1178 NTAPI
1179 MmCreatePageTable(PVOID PAddress);
1180
1181 VOID
1182 NTAPI
1183 MmDeletePageTable(
1184 struct _EPROCESS *Process,
1185 PVOID Address
1186 );
1187
1188 PFN_TYPE
1189 NTAPI
1190 MmGetPfnForProcess(
1191 struct _EPROCESS *Process,
1192 PVOID Address
1193 );
1194
1195 NTSTATUS
1196 STDCALL
1197 MmCopyMmInfo(
1198 struct _EPROCESS *Src,
1199 struct _EPROCESS *Dest,
1200 PPHYSICAL_ADDRESS DirectoryTableBase
1201 );
1202
1203 NTSTATUS
1204 NTAPI
1205 MmReleaseMmInfo(struct _EPROCESS *Process);
1206
1207 NTSTATUS
1208 NTAPI
1209 Mmi386ReleaseMmInfo(struct _EPROCESS *Process);
1210
1211 VOID
1212 NTAPI
1213 MmDeleteVirtualMapping(
1214 struct _EPROCESS *Process,
1215 PVOID Address,
1216 BOOLEAN FreePage,
1217 BOOLEAN* WasDirty,
1218 PPFN_TYPE Page
1219 );
1220
1221 BOOLEAN
1222 NTAPI
1223 MmIsDirtyPage(
1224 struct _EPROCESS *Process,
1225 PVOID Address
1226 );
1227
1228 VOID
1229 NTAPI
1230 MmMarkPageMapped(PFN_TYPE Page);
1231
1232 VOID
1233 NTAPI
1234 MmMarkPageUnmapped(PFN_TYPE Page);
1235
1236 VOID
1237 NTAPI
1238 MmUpdatePageDir(
1239 struct _EPROCESS *Process,
1240 PVOID Address,
1241 ULONG Size
1242 );
1243
1244 VOID
1245 NTAPI
1246 MiInitPageDirectoryMap(VOID);
1247
1248 ULONG
1249 NTAPI
1250 MiGetUserPageDirectoryCount(VOID);
1251
1252 /* wset.c ********************************************************************/
1253
1254 NTSTATUS
1255 MmTrimUserMemory(
1256 ULONG Target,
1257 ULONG Priority,
1258 PULONG NrFreedPages
1259 );
1260
1261 /* region.c ************************************************************/
1262
1263 NTSTATUS
1264 NTAPI
1265 MmAlterRegion(
1266 PMADDRESS_SPACE AddressSpace,
1267 PVOID BaseAddress,
1268 PLIST_ENTRY RegionListHead,
1269 PVOID StartAddress,
1270 ULONG Length,
1271 ULONG NewType,
1272 ULONG NewProtect,
1273 PMM_ALTER_REGION_FUNC AlterFunc
1274 );
1275
1276 VOID
1277 NTAPI
1278 MmInitializeRegion(
1279 PLIST_ENTRY RegionListHead,
1280 SIZE_T Length,
1281 ULONG Type,
1282 ULONG Protect
1283 );
1284
1285 PMM_REGION
1286 NTAPI
1287 MmFindRegion(
1288 PVOID BaseAddress,
1289 PLIST_ENTRY RegionListHead,
1290 PVOID Address,
1291 PVOID* RegionBaseAddress
1292 );
1293
1294 /* section.c *****************************************************************/
1295
1296 PVOID
1297 STDCALL
1298 MmAllocateSection(
1299 IN ULONG Length,
1300 PVOID BaseAddress
1301 );
1302
1303 NTSTATUS
1304 STDCALL
1305 MmQuerySectionView(
1306 PMEMORY_AREA MemoryArea,
1307 PVOID Address,
1308 PMEMORY_BASIC_INFORMATION Info,
1309 PULONG ResultLength
1310 );
1311
1312 NTSTATUS
1313 NTAPI
1314 MmProtectSectionView(
1315 PMADDRESS_SPACE AddressSpace,
1316 PMEMORY_AREA MemoryArea,
1317 PVOID BaseAddress,
1318 ULONG Length,
1319 ULONG Protect,
1320 PULONG OldProtect
1321 );
1322
1323 NTSTATUS
1324 NTAPI
1325 MmWritePageSectionView(
1326 PMADDRESS_SPACE AddressSpace,
1327 PMEMORY_AREA MArea,
1328 PVOID Address,
1329 PMM_PAGEOP PageOp
1330 );
1331
1332 NTSTATUS
1333 NTAPI
1334 MmInitSectionImplementation(VOID);
1335
1336 NTSTATUS
1337 NTAPI
1338 MmNotPresentFaultSectionView(
1339 PMADDRESS_SPACE AddressSpace,
1340 MEMORY_AREA* MemoryArea,
1341 PVOID Address,
1342 BOOLEAN Locked
1343 );
1344
1345 NTSTATUS
1346 NTAPI
1347 MmPageOutSectionView(
1348 PMADDRESS_SPACE AddressSpace,
1349 PMEMORY_AREA MemoryArea,
1350 PVOID Address,
1351 struct _MM_PAGEOP *PageOp
1352 );
1353
1354 NTSTATUS
1355 NTAPI
1356 MmCreatePhysicalMemorySection(VOID);
1357
1358 NTSTATUS
1359 NTAPI
1360 MmAccessFaultSectionView(
1361 PMADDRESS_SPACE AddressSpace,
1362 MEMORY_AREA* MemoryArea,
1363 PVOID Address,
1364 BOOLEAN Locked
1365 );
1366
1367 VOID
1368 NTAPI
1369 MmFreeSectionSegments(PFILE_OBJECT FileObject);
1370
1371 /* mpw.c *********************************************************************/
1372
1373 NTSTATUS
1374 NTAPI
1375 MmInitMpwThread(VOID);
1376
1377 /* pager.c *******************************************************************/
1378
1379 BOOLEAN
1380 NTAPI
1381 MiIsPagerThread(VOID);
1382
1383 VOID
1384 NTAPI
1385 MiStartPagerThread(VOID);
1386
1387 VOID
1388 NTAPI
1389 MiStopPagerThread(VOID);
1390
1391 NTSTATUS
1392 FASTCALL
1393 MiQueryVirtualMemory(
1394 IN HANDLE ProcessHandle,
1395 IN PVOID Address,
1396 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass,
1397 OUT PVOID VirtualMemoryInformation,
1398 IN ULONG Length,
1399 OUT PULONG ResultLength
1400 );
1401
1402 #endif