- Use EPROCESS 's AddressCreationLock instead of the MADDRESS_SPACE Lock.
[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 _ROS_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 _ROS_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 _ROS_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 _ROS_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 struct _ROS_EPROCESS* Process,
623 IN PROS_SECTION_OBJECT Section OPTIONAL
624 );
625
626 NTSTATUS
627 STDCALL
628 MmCreatePeb(struct _ROS_EPROCESS *Process);
629
630 struct _TEB*
631 STDCALL
632 MmCreateTeb(
633 struct _ROS_EPROCESS *Process,
634 PCLIENT_ID ClientId,
635 PINITIAL_TEB InitialTeb
636 );
637
638 VOID
639 STDCALL
640 MmDeleteTeb(
641 struct _ROS_EPROCESS *Process,
642 struct _TEB* Teb
643 );
644
645 /* i386/pfault.c *************************************************************/
646
647 NTSTATUS
648 NTAPI
649 MmPageFault(
650 ULONG Cs,
651 PULONG Eip,
652 PULONG Eax,
653 ULONG Cr2,
654 ULONG ErrorCode
655 );
656
657 /* mm.c **********************************************************************/
658
659 NTSTATUS
660 NTAPI
661 MmAccessFault(
662 KPROCESSOR_MODE Mode,
663 ULONG_PTR Address,
664 BOOLEAN FromMdl
665 );
666
667 NTSTATUS
668 NTAPI
669 MmNotPresentFault(
670 KPROCESSOR_MODE Mode,
671 ULONG_PTR Address,
672 BOOLEAN FromMdl
673 );
674
675 /* anonmem.c *****************************************************************/
676
677 NTSTATUS
678 NTAPI
679 MmNotPresentFaultVirtualMemory(
680 PMADDRESS_SPACE AddressSpace,
681 MEMORY_AREA* MemoryArea,
682 PVOID Address,
683 BOOLEAN Locked
684 );
685
686 NTSTATUS
687 NTAPI
688 MmPageOutVirtualMemory(
689 PMADDRESS_SPACE AddressSpace,
690 PMEMORY_AREA MemoryArea,
691 PVOID Address,
692 struct _MM_PAGEOP* PageOp
693 );
694
695 NTSTATUS
696 STDCALL
697 MmQueryAnonMem(
698 PMEMORY_AREA MemoryArea,
699 PVOID Address,
700 PMEMORY_BASIC_INFORMATION Info,
701 PULONG ResultLength
702 );
703
704 VOID
705 NTAPI
706 MmFreeVirtualMemory(
707 struct _ROS_EPROCESS* Process,
708 PMEMORY_AREA MemoryArea
709 );
710
711 NTSTATUS
712 NTAPI
713 MmProtectAnonMem(
714 PMADDRESS_SPACE AddressSpace,
715 PMEMORY_AREA MemoryArea,
716 PVOID BaseAddress,
717 ULONG Length,
718 ULONG Protect,
719 PULONG OldProtect
720 );
721
722 NTSTATUS
723 NTAPI
724 MmWritePageVirtualMemory(
725 PMADDRESS_SPACE AddressSpace,
726 PMEMORY_AREA MArea,
727 PVOID Address,
728 PMM_PAGEOP PageOp
729 );
730
731 /* kmap.c ********************************************************************/
732
733 PVOID
734 NTAPI
735 ExAllocatePage(VOID);
736
737 VOID
738 NTAPI
739 ExUnmapPage(PVOID Addr);
740
741 PVOID
742 NTAPI
743 ExAllocatePageWithPhysPage(PFN_TYPE Page);
744
745 NTSTATUS
746 NTAPI
747 MiCopyFromUserPage(
748 PFN_TYPE Page,
749 PVOID SourceAddress
750 );
751
752 NTSTATUS
753 NTAPI
754 MiZeroPage(PFN_TYPE Page);
755
756 /* memsafe.s *****************************************************************/
757
758 PVOID
759 FASTCALL
760 MmSafeReadPtr(PVOID Source);
761
762 /* pageop.c ******************************************************************/
763
764 VOID
765 NTAPI
766 MmReleasePageOp(PMM_PAGEOP PageOp);
767
768 PMM_PAGEOP
769 NTAPI
770 MmGetPageOp(
771 PMEMORY_AREA MArea,
772 HANDLE Pid,
773 PVOID Address,
774 PMM_SECTION_SEGMENT Segment,
775 ULONG Offset,
776 ULONG OpType,
777 BOOLEAN First
778 );
779
780 PMM_PAGEOP
781 NTAPI
782 MmCheckForPageOp(
783 PMEMORY_AREA MArea,
784 HANDLE Pid,
785 PVOID Address,
786 PMM_SECTION_SEGMENT Segment,
787 ULONG Offset
788 );
789
790 VOID
791 NTAPI
792 MmInitializePageOp(VOID);
793
794 /* process.c *****************************************************************/
795
796 PVOID
797 STDCALL
798 MmCreateKernelStack(BOOLEAN GuiStack);
799
800 VOID
801 STDCALL
802 MmDeleteKernelStack(PVOID Stack,
803 BOOLEAN GuiStack);
804
805 /* balace.c ******************************************************************/
806
807 VOID
808 NTAPI
809 MmInitializeMemoryConsumer(
810 ULONG Consumer,
811 NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed)
812 );
813
814 VOID
815 NTAPI
816 MmInitializeBalancer(
817 ULONG NrAvailablePages,
818 ULONG NrSystemPages
819 );
820
821 NTSTATUS
822 NTAPI
823 MmReleasePageMemoryConsumer(
824 ULONG Consumer,
825 PFN_TYPE Page
826 );
827
828 NTSTATUS
829 NTAPI
830 MmRequestPageMemoryConsumer(
831 ULONG Consumer,
832 BOOLEAN MyWait,
833 PPFN_TYPE AllocatedPage
834 );
835
836 VOID
837 NTAPI
838 MiInitBalancerThread(VOID);
839
840 VOID
841 NTAPI
842 MmRebalanceMemoryConsumers(VOID);
843
844 /* rmap.c **************************************************************/
845
846 VOID
847 NTAPI
848 MmSetRmapListHeadPage(
849 PFN_TYPE Page,
850 struct _MM_RMAP_ENTRY* ListHead
851 );
852
853 struct _MM_RMAP_ENTRY*
854 NTAPI
855 MmGetRmapListHeadPage(PFN_TYPE Page);
856
857 VOID
858 NTAPI
859 MmInsertRmap(
860 PFN_TYPE Page,
861 struct _ROS_EPROCESS *Process,
862 PVOID Address
863 );
864
865 VOID
866 NTAPI
867 MmDeleteAllRmaps(
868 PFN_TYPE Page,
869 PVOID Context,
870 VOID (*DeleteMapping)(PVOID Context, struct _ROS_EPROCESS *Process, PVOID Address)
871 );
872
873 VOID
874 NTAPI
875 MmDeleteRmap(
876 PFN_TYPE Page,
877 struct _ROS_EPROCESS *Process,
878 PVOID Address
879 );
880
881 VOID
882 NTAPI
883 MmInitializeRmapList(VOID);
884
885 VOID
886 NTAPI
887 MmSetCleanAllRmaps(PFN_TYPE Page);
888
889 VOID
890 NTAPI
891 MmSetDirtyAllRmaps(PFN_TYPE Page);
892
893 BOOLEAN
894 NTAPI
895 MmIsDirtyPageRmap(PFN_TYPE Page);
896
897 NTSTATUS
898 NTAPI
899 MmWritePagePhysicalAddress(PFN_TYPE Page);
900
901 NTSTATUS
902 NTAPI
903 MmPageOutPhysicalAddress(PFN_TYPE Page);
904
905 /* freelist.c **********************************************************/
906
907 PFN_TYPE
908 NTAPI
909 MmGetLRUNextUserPage(PFN_TYPE PreviousPage);
910
911 PFN_TYPE
912 NTAPI
913 MmGetLRUFirstUserPage(VOID);
914
915 VOID
916 NTAPI
917 MmSetLRULastPage(PFN_TYPE Page);
918
919 VOID
920 NTAPI
921 MmLockPage(PFN_TYPE Page);
922
923 VOID
924 NTAPI
925 MmLockPageUnsafe(PFN_TYPE Page);
926
927 VOID
928 NTAPI
929 MmUnlockPage(PFN_TYPE Page);
930
931 ULONG
932 NTAPI
933 MmGetLockCountPage(PFN_TYPE Page);
934
935 PVOID
936 NTAPI
937 MmInitializePageList(
938 ULONG_PTR FirstPhysKernelAddress,
939 ULONG_PTR LastPhysKernelAddress,
940 ULONG MemorySizeInPages,
941 ULONG_PTR LastKernelBase,
942 PADDRESS_RANGE BIOSMemoryMap,
943 ULONG AddressRangeCount
944 );
945
946 PFN_TYPE
947 NTAPI
948 MmGetContinuousPages(
949 ULONG NumberOfBytes,
950 PHYSICAL_ADDRESS LowestAcceptableAddress,
951 PHYSICAL_ADDRESS HighestAcceptableAddress,
952 PHYSICAL_ADDRESS BoundaryAddressMultiple
953 );
954
955 NTSTATUS
956 NTAPI
957 MmInitZeroPageThread(VOID);
958
959 /* i386/page.c *********************************************************/
960
961 PVOID
962 NTAPI
963 MmCreateHyperspaceMapping(PFN_TYPE Page);
964
965 PFN_TYPE
966 NTAPI
967 MmChangeHyperspaceMapping(
968 PVOID Address,
969 PFN_TYPE Page
970 );
971
972 PFN_TYPE
973 NTAPI
974 MmDeleteHyperspaceMapping(PVOID Address);
975
976 NTSTATUS
977 NTAPI
978 MmCreateVirtualMappingForKernel(
979 PVOID Address,
980 ULONG flProtect,
981 PPFN_TYPE Pages,
982 ULONG PageCount
983 );
984
985 NTSTATUS
986 NTAPI
987 MmCommitPagedPoolAddress(
988 PVOID Address,
989 BOOLEAN Locked
990 );
991
992 NTSTATUS
993 NTAPI
994 MmCreateVirtualMapping(
995 struct _ROS_EPROCESS* Process,
996 PVOID Address,
997 ULONG flProtect,
998 PPFN_TYPE Pages,
999 ULONG PageCount
1000 );
1001
1002 NTSTATUS
1003 NTAPI
1004 MmCreateVirtualMappingUnsafe(
1005 struct _ROS_EPROCESS* Process,
1006 PVOID Address,
1007 ULONG flProtect,
1008 PPFN_TYPE Pages,
1009 ULONG PageCount
1010 );
1011
1012 ULONG
1013 NTAPI
1014 MmGetPageProtect(
1015 struct _ROS_EPROCESS* Process,
1016 PVOID Address);
1017
1018 VOID
1019 NTAPI
1020 MmSetPageProtect(
1021 struct _ROS_EPROCESS* Process,
1022 PVOID Address,
1023 ULONG flProtect
1024 );
1025
1026 BOOLEAN
1027 NTAPI
1028 MmIsPagePresent(
1029 struct _ROS_EPROCESS* Process,
1030 PVOID Address
1031 );
1032
1033 VOID
1034 NTAPI
1035 MmInitGlobalKernelPageDirectory(VOID);
1036
1037 VOID
1038 NTAPI
1039 MmDisableVirtualMapping(
1040 struct _ROS_EPROCESS *Process,
1041 PVOID Address,
1042 BOOLEAN* WasDirty,
1043 PPFN_TYPE Page
1044 );
1045
1046 VOID
1047 NTAPI
1048 MmEnableVirtualMapping(
1049 struct _ROS_EPROCESS *Process,
1050 PVOID Address
1051 );
1052
1053 VOID
1054 NTAPI
1055 MmRawDeleteVirtualMapping(PVOID Address);
1056
1057 VOID
1058 NTAPI
1059 MmDeletePageFileMapping(
1060 struct _ROS_EPROCESS *Process,
1061 PVOID Address,
1062 SWAPENTRY* SwapEntry
1063 );
1064
1065 NTSTATUS
1066 NTAPI
1067 MmCreatePageFileMapping(
1068 struct _ROS_EPROCESS *Process,
1069 PVOID Address,
1070 SWAPENTRY SwapEntry
1071 );
1072
1073 BOOLEAN
1074 NTAPI
1075 MmIsPageSwapEntry(
1076 struct _ROS_EPROCESS *Process,
1077 PVOID Address
1078 );
1079
1080 VOID
1081 NTAPI
1082 MmTransferOwnershipPage(
1083 PFN_TYPE Page,
1084 ULONG NewConsumer
1085 );
1086
1087 VOID
1088 NTAPI
1089 MmSetDirtyPage(
1090 struct _ROS_EPROCESS *Process,
1091 PVOID Address
1092 );
1093
1094 PFN_TYPE
1095 NTAPI
1096 MmAllocPage(
1097 ULONG Consumer,
1098 SWAPENTRY SavedSwapEntry
1099 );
1100
1101 LONG
1102 NTAPI
1103 MmAllocPagesSpecifyRange(
1104 ULONG Consumer,
1105 PHYSICAL_ADDRESS LowestAddress,
1106 PHYSICAL_ADDRESS HighestAddress,
1107 ULONG NumberOfPages,
1108 PPFN_TYPE Pages
1109 );
1110
1111 VOID
1112 NTAPI
1113 MmDereferencePage(PFN_TYPE Page);
1114
1115 VOID
1116 NTAPI
1117 MmReferencePage(PFN_TYPE Page);
1118
1119 VOID
1120 NTAPI
1121 MmReferencePageUnsafe(PFN_TYPE Page);
1122
1123 BOOLEAN
1124 NTAPI
1125 MmIsAccessedAndResetAccessPage(
1126 struct _ROS_EPROCESS *Process,
1127 PVOID Address
1128 );
1129
1130 ULONG
1131 NTAPI
1132 MmGetReferenceCountPage(PFN_TYPE Page);
1133
1134 BOOLEAN
1135 NTAPI
1136 MmIsUsablePage(PFN_TYPE Page);
1137
1138 VOID
1139 NTAPI
1140 MmSetFlagsPage(
1141 PFN_TYPE Page,
1142 ULONG Flags);
1143
1144 ULONG
1145 NTAPI
1146 MmGetFlagsPage(PFN_TYPE Page);
1147
1148 VOID
1149 NTAPI
1150 MmSetSavedSwapEntryPage(
1151 PFN_TYPE Page,
1152 SWAPENTRY SavedSwapEntry);
1153
1154 SWAPENTRY
1155 NTAPI
1156 MmGetSavedSwapEntryPage(PFN_TYPE Page);
1157
1158 VOID
1159 NTAPI
1160 MmSetCleanPage(
1161 struct _ROS_EPROCESS *Process,
1162 PVOID Address
1163 );
1164
1165 NTSTATUS
1166 NTAPI
1167 MmCreatePageTable(PVOID PAddress);
1168
1169 VOID
1170 NTAPI
1171 MmDeletePageTable(
1172 struct _ROS_EPROCESS *Process,
1173 PVOID Address
1174 );
1175
1176 PFN_TYPE
1177 NTAPI
1178 MmGetPfnForProcess(
1179 struct _ROS_EPROCESS *Process,
1180 PVOID Address
1181 );
1182
1183 NTSTATUS
1184 STDCALL
1185 MmCopyMmInfo(
1186 struct _ROS_EPROCESS *Src,
1187 struct _ROS_EPROCESS *Dest,
1188 PPHYSICAL_ADDRESS DirectoryTableBase
1189 );
1190
1191 NTSTATUS
1192 NTAPI
1193 MmReleaseMmInfo(struct _ROS_EPROCESS *Process);
1194
1195 NTSTATUS
1196 NTAPI
1197 Mmi386ReleaseMmInfo(struct _ROS_EPROCESS *Process);
1198
1199 VOID
1200 NTAPI
1201 MmDeleteVirtualMapping(
1202 struct _ROS_EPROCESS *Process,
1203 PVOID Address,
1204 BOOLEAN FreePage,
1205 BOOLEAN* WasDirty,
1206 PPFN_TYPE Page
1207 );
1208
1209 BOOLEAN
1210 NTAPI
1211 MmIsDirtyPage(
1212 struct _ROS_EPROCESS *Process,
1213 PVOID Address
1214 );
1215
1216 VOID
1217 NTAPI
1218 MmMarkPageMapped(PFN_TYPE Page);
1219
1220 VOID
1221 NTAPI
1222 MmMarkPageUnmapped(PFN_TYPE Page);
1223
1224 VOID
1225 NTAPI
1226 MmUpdatePageDir(
1227 struct _ROS_EPROCESS *Process,
1228 PVOID Address,
1229 ULONG Size
1230 );
1231
1232 VOID
1233 NTAPI
1234 MiInitPageDirectoryMap(VOID);
1235
1236 ULONG
1237 NTAPI
1238 MiGetUserPageDirectoryCount(VOID);
1239
1240 /* wset.c ********************************************************************/
1241
1242 NTSTATUS
1243 MmTrimUserMemory(
1244 ULONG Target,
1245 ULONG Priority,
1246 PULONG NrFreedPages
1247 );
1248
1249 /* region.c ************************************************************/
1250
1251 NTSTATUS
1252 NTAPI
1253 MmAlterRegion(
1254 PMADDRESS_SPACE AddressSpace,
1255 PVOID BaseAddress,
1256 PLIST_ENTRY RegionListHead,
1257 PVOID StartAddress,
1258 ULONG Length,
1259 ULONG NewType,
1260 ULONG NewProtect,
1261 PMM_ALTER_REGION_FUNC AlterFunc
1262 );
1263
1264 VOID
1265 NTAPI
1266 MmInitializeRegion(
1267 PLIST_ENTRY RegionListHead,
1268 SIZE_T Length,
1269 ULONG Type,
1270 ULONG Protect
1271 );
1272
1273 PMM_REGION
1274 NTAPI
1275 MmFindRegion(
1276 PVOID BaseAddress,
1277 PLIST_ENTRY RegionListHead,
1278 PVOID Address,
1279 PVOID* RegionBaseAddress
1280 );
1281
1282 /* section.c *****************************************************************/
1283
1284 PVOID
1285 STDCALL
1286 MmAllocateSection(
1287 IN ULONG Length,
1288 PVOID BaseAddress
1289 );
1290
1291 NTSTATUS
1292 STDCALL
1293 MmQuerySectionView(
1294 PMEMORY_AREA MemoryArea,
1295 PVOID Address,
1296 PMEMORY_BASIC_INFORMATION Info,
1297 PULONG ResultLength
1298 );
1299
1300 NTSTATUS
1301 NTAPI
1302 MmProtectSectionView(
1303 PMADDRESS_SPACE AddressSpace,
1304 PMEMORY_AREA MemoryArea,
1305 PVOID BaseAddress,
1306 ULONG Length,
1307 ULONG Protect,
1308 PULONG OldProtect
1309 );
1310
1311 NTSTATUS
1312 NTAPI
1313 MmWritePageSectionView(
1314 PMADDRESS_SPACE AddressSpace,
1315 PMEMORY_AREA MArea,
1316 PVOID Address,
1317 PMM_PAGEOP PageOp
1318 );
1319
1320 NTSTATUS
1321 NTAPI
1322 MmInitSectionImplementation(VOID);
1323
1324 NTSTATUS
1325 NTAPI
1326 MmNotPresentFaultSectionView(
1327 PMADDRESS_SPACE AddressSpace,
1328 MEMORY_AREA* MemoryArea,
1329 PVOID Address,
1330 BOOLEAN Locked
1331 );
1332
1333 NTSTATUS
1334 NTAPI
1335 MmPageOutSectionView(
1336 PMADDRESS_SPACE AddressSpace,
1337 PMEMORY_AREA MemoryArea,
1338 PVOID Address,
1339 struct _MM_PAGEOP *PageOp
1340 );
1341
1342 NTSTATUS
1343 NTAPI
1344 MmCreatePhysicalMemorySection(VOID);
1345
1346 NTSTATUS
1347 NTAPI
1348 MmAccessFaultSectionView(
1349 PMADDRESS_SPACE AddressSpace,
1350 MEMORY_AREA* MemoryArea,
1351 PVOID Address,
1352 BOOLEAN Locked
1353 );
1354
1355 VOID
1356 NTAPI
1357 MmFreeSectionSegments(PFILE_OBJECT FileObject);
1358
1359 /* mpw.c *********************************************************************/
1360
1361 NTSTATUS
1362 NTAPI
1363 MmInitMpwThread(VOID);
1364
1365 /* pager.c *******************************************************************/
1366
1367 BOOLEAN
1368 NTAPI
1369 MiIsPagerThread(VOID);
1370
1371 VOID
1372 NTAPI
1373 MiStartPagerThread(VOID);
1374
1375 VOID
1376 NTAPI
1377 MiStopPagerThread(VOID);
1378
1379 NTSTATUS
1380 FASTCALL
1381 MiQueryVirtualMemory(
1382 IN HANDLE ProcessHandle,
1383 IN PVOID Address,
1384 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass,
1385 OUT PVOID VirtualMemoryInformation,
1386 IN ULONG Length,
1387 OUT PULONG ResultLength
1388 );
1389
1390 #endif