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