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