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