- Implement XP-style process name auditing to store the full name of the process...
[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 STDCALL
378 MmCreateMemoryArea(
379 PMADDRESS_SPACE AddressSpace,
380 ULONG Type,
381 PVOID *BaseAddress,
382 ULONG_PTR Length,
383 ULONG Protection,
384 PMEMORY_AREA *Result,
385 BOOLEAN FixedAddress,
386 ULONG AllocationFlags,
387 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
388 );
389
390 PMEMORY_AREA
391 STDCALL
392 MmLocateMemoryAreaByAddress(
393 PMADDRESS_SPACE AddressSpace,
394 PVOID Address
395 );
396
397 ULONG_PTR
398 STDCALL
399 MmFindGapAtAddress(
400 PMADDRESS_SPACE AddressSpace,
401 PVOID Address
402 );
403
404 NTSTATUS
405 STDCALL
406 MmFreeMemoryArea(
407 PMADDRESS_SPACE AddressSpace,
408 PMEMORY_AREA MemoryArea,
409 PMM_FREE_PAGE_FUNC FreePage,
410 PVOID FreePageContext
411 );
412
413 NTSTATUS
414 STDCALL
415 MmFreeMemoryAreaByPtr(
416 PMADDRESS_SPACE AddressSpace,
417 PVOID BaseAddress,
418 PMM_FREE_PAGE_FUNC FreePage,
419 PVOID FreePageContext
420 );
421
422 VOID
423 STDCALL
424 MmDumpMemoryAreas(PMADDRESS_SPACE AddressSpace);
425
426 PMEMORY_AREA
427 STDCALL
428 MmLocateMemoryAreaByRegion(
429 PMADDRESS_SPACE AddressSpace,
430 PVOID Address,
431 ULONG_PTR Length
432 );
433
434 PVOID
435 STDCALL
436 MmFindGap(
437 PMADDRESS_SPACE AddressSpace,
438 ULONG_PTR Length,
439 ULONG_PTR Granularity,
440 BOOLEAN TopDown
441 );
442
443 VOID
444 STDCALL
445 MmReleaseMemoryAreaIfDecommitted(
446 struct _EPROCESS *Process,
447 PMADDRESS_SPACE AddressSpace,
448 PVOID BaseAddress
449 );
450
451 /* npool.c *******************************************************************/
452
453 VOID
454 NTAPI
455 MiDebugDumpNonPagedPool(BOOLEAN NewOnly);
456
457 VOID
458 NTAPI
459 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly);
460
461 VOID
462 NTAPI
463 MiInitializeNonPagedPool(VOID);
464
465 PVOID
466 NTAPI
467 MmGetMdlPageAddress(
468 PMDL Mdl,
469 PVOID Offset
470 );
471
472 /* pool.c *******************************************************************/
473
474 PVOID
475 STDCALL
476 ExAllocateNonPagedPoolWithTag(
477 POOL_TYPE type,
478 ULONG size,
479 ULONG Tag,
480 PVOID Caller
481 );
482
483 PVOID
484 STDCALL
485 ExAllocatePagedPoolWithTag(
486 POOL_TYPE Type,
487 ULONG size,
488 ULONG Tag
489 );
490
491 VOID
492 STDCALL
493 ExFreeNonPagedPool(PVOID block);
494
495 VOID
496 STDCALL
497 ExFreePagedPool(IN PVOID Block);
498
499 VOID
500 NTAPI
501 MmInitializePagedPool(VOID);
502
503 PVOID
504 STDCALL
505 MiAllocateSpecialPool(
506 IN POOL_TYPE PoolType,
507 IN SIZE_T NumberOfBytes,
508 IN ULONG Tag,
509 IN ULONG Underrun
510 );
511
512 BOOLEAN
513 STDCALL
514 MiRaisePoolQuota(
515 IN POOL_TYPE PoolType,
516 IN ULONG CurrentMaxQuota,
517 OUT PULONG NewMaxQuota
518 );
519
520 /* mdl.c *********************************************************************/
521
522 VOID
523 NTAPI
524 MmBuildMdlFromPages(
525 PMDL Mdl,
526 PULONG Pages
527 );
528
529 /* mminit.c ******************************************************************/
530
531 VOID
532 NTAPI
533 MiShutdownMemoryManager(VOID);
534
535 VOID
536 NTAPI
537 MmInit1(
538 ULONG_PTR FirstKernelPhysAddress,
539 ULONG_PTR LastKernelPhysAddress,
540 ULONG_PTR LastKernelAddress,
541 PADDRESS_RANGE BIOSMemoryMap,
542 ULONG AddressRangeCount,
543 ULONG MaxMemInMeg
544 );
545
546 VOID
547 NTAPI
548 MmInit2(VOID);
549
550 VOID
551 NTAPI
552 MmInit3(VOID);
553
554 VOID
555 NTAPI
556 MiFreeInitMemory(VOID);
557
558 VOID
559 NTAPI
560 MmInitializeMdlImplementation(VOID);
561
562 /* pagefile.c ****************************************************************/
563
564 SWAPENTRY
565 NTAPI
566 MmAllocSwapPage(VOID);
567
568 VOID
569 NTAPI
570 MmDereserveSwapPages(ULONG Nr);
571
572 VOID
573 NTAPI
574 MmFreeSwapPage(SWAPENTRY Entry);
575
576 VOID
577 NTAPI
578 MmInitPagingFile(VOID);
579
580 NTSTATUS
581 NTAPI
582 MmReadFromSwapPage(
583 SWAPENTRY SwapEntry,
584 PFN_TYPE Page
585 );
586
587 BOOLEAN
588 NTAPI
589 MmReserveSwapPages(ULONG Nr);
590
591 NTSTATUS
592 NTAPI
593 MmWriteToSwapPage(
594 SWAPENTRY SwapEntry,
595 PFN_TYPE Page
596 );
597
598 NTSTATUS
599 STDCALL
600 MmDumpToPagingFile(
601 ULONG BugCode,
602 ULONG BugCodeParameter1,
603 ULONG BugCodeParameter2,
604 ULONG BugCodeParameter3,
605 ULONG BugCodeParameter4,
606 struct _KTRAP_FRAME* TrapFrame
607 );
608
609 BOOLEAN
610 NTAPI
611 MmIsAvailableSwapPage(VOID);
612
613 VOID
614 NTAPI
615 MmShowOutOfSpaceMessagePagingFile(VOID);
616
617 /* process.c ****************************************************************/
618
619 NTSTATUS
620 STDCALL
621 MmCreateProcessAddressSpace(
622 IN PEPROCESS Process,
623 IN PROS_SECTION_OBJECT Section OPTIONAL,
624 IN POBJECT_NAME_INFORMATION *AuditName OPTIONAL
625 );
626
627 NTSTATUS
628 STDCALL
629 MmCreatePeb(struct _EPROCESS *Process);
630
631 PTEB
632 STDCALL
633 MmCreateTeb(
634 struct _EPROCESS *Process,
635 PCLIENT_ID ClientId,
636 PINITIAL_TEB InitialTeb
637 );
638
639 VOID
640 STDCALL
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 STDCALL
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 STDCALL
818 MmCreateKernelStack(BOOLEAN GuiStack);
819
820 VOID
821 STDCALL
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 MmInitZeroPageThread(VOID);
978
979 /* i386/page.c *********************************************************/
980
981 PVOID
982 NTAPI
983 MmCreateHyperspaceMapping(PFN_TYPE Page);
984
985 PFN_TYPE
986 NTAPI
987 MmChangeHyperspaceMapping(
988 PVOID Address,
989 PFN_TYPE Page
990 );
991
992 PFN_TYPE
993 NTAPI
994 MmDeleteHyperspaceMapping(PVOID Address);
995
996 NTSTATUS
997 NTAPI
998 MmCreateVirtualMappingForKernel(
999 PVOID Address,
1000 ULONG flProtect,
1001 PPFN_TYPE Pages,
1002 ULONG PageCount
1003 );
1004
1005 NTSTATUS
1006 NTAPI
1007 MmCommitPagedPoolAddress(
1008 PVOID Address,
1009 BOOLEAN Locked
1010 );
1011
1012 NTSTATUS
1013 NTAPI
1014 MmCreateVirtualMapping(
1015 struct _EPROCESS* Process,
1016 PVOID Address,
1017 ULONG flProtect,
1018 PPFN_TYPE Pages,
1019 ULONG PageCount
1020 );
1021
1022 NTSTATUS
1023 NTAPI
1024 MmCreateVirtualMappingUnsafe(
1025 struct _EPROCESS* Process,
1026 PVOID Address,
1027 ULONG flProtect,
1028 PPFN_TYPE Pages,
1029 ULONG PageCount
1030 );
1031
1032 ULONG
1033 NTAPI
1034 MmGetPageProtect(
1035 struct _EPROCESS* Process,
1036 PVOID Address);
1037
1038 VOID
1039 NTAPI
1040 MmSetPageProtect(
1041 struct _EPROCESS* Process,
1042 PVOID Address,
1043 ULONG flProtect
1044 );
1045
1046 BOOLEAN
1047 NTAPI
1048 MmIsPagePresent(
1049 struct _EPROCESS* Process,
1050 PVOID Address
1051 );
1052
1053 VOID
1054 NTAPI
1055 MmInitGlobalKernelPageDirectory(VOID);
1056
1057 VOID
1058 NTAPI
1059 MmDisableVirtualMapping(
1060 struct _EPROCESS *Process,
1061 PVOID Address,
1062 BOOLEAN* WasDirty,
1063 PPFN_TYPE Page
1064 );
1065
1066 VOID
1067 NTAPI
1068 MmEnableVirtualMapping(
1069 struct _EPROCESS *Process,
1070 PVOID Address
1071 );
1072
1073 VOID
1074 NTAPI
1075 MmRawDeleteVirtualMapping(PVOID Address);
1076
1077 VOID
1078 NTAPI
1079 MmDeletePageFileMapping(
1080 struct _EPROCESS *Process,
1081 PVOID Address,
1082 SWAPENTRY* SwapEntry
1083 );
1084
1085 NTSTATUS
1086 NTAPI
1087 MmCreatePageFileMapping(
1088 struct _EPROCESS *Process,
1089 PVOID Address,
1090 SWAPENTRY SwapEntry
1091 );
1092
1093 BOOLEAN
1094 NTAPI
1095 MmIsPageSwapEntry(
1096 struct _EPROCESS *Process,
1097 PVOID Address
1098 );
1099
1100 VOID
1101 NTAPI
1102 MmTransferOwnershipPage(
1103 PFN_TYPE Page,
1104 ULONG NewConsumer
1105 );
1106
1107 VOID
1108 NTAPI
1109 MmSetDirtyPage(
1110 struct _EPROCESS *Process,
1111 PVOID Address
1112 );
1113
1114 PFN_TYPE
1115 NTAPI
1116 MmAllocPage(
1117 ULONG Consumer,
1118 SWAPENTRY SavedSwapEntry
1119 );
1120
1121 LONG
1122 NTAPI
1123 MmAllocPagesSpecifyRange(
1124 ULONG Consumer,
1125 PHYSICAL_ADDRESS LowestAddress,
1126 PHYSICAL_ADDRESS HighestAddress,
1127 ULONG NumberOfPages,
1128 PPFN_TYPE Pages
1129 );
1130
1131 VOID
1132 NTAPI
1133 MmDereferencePage(PFN_TYPE Page);
1134
1135 VOID
1136 NTAPI
1137 MmReferencePage(PFN_TYPE Page);
1138
1139 VOID
1140 NTAPI
1141 MmReferencePageUnsafe(PFN_TYPE Page);
1142
1143 BOOLEAN
1144 NTAPI
1145 MmIsAccessedAndResetAccessPage(
1146 struct _EPROCESS *Process,
1147 PVOID Address
1148 );
1149
1150 ULONG
1151 NTAPI
1152 MmGetReferenceCountPage(PFN_TYPE Page);
1153
1154 BOOLEAN
1155 NTAPI
1156 MmIsUsablePage(PFN_TYPE Page);
1157
1158 VOID
1159 NTAPI
1160 MmSetFlagsPage(
1161 PFN_TYPE Page,
1162 ULONG Flags);
1163
1164 ULONG
1165 NTAPI
1166 MmGetFlagsPage(PFN_TYPE Page);
1167
1168 VOID
1169 NTAPI
1170 MmSetSavedSwapEntryPage(
1171 PFN_TYPE Page,
1172 SWAPENTRY SavedSwapEntry);
1173
1174 SWAPENTRY
1175 NTAPI
1176 MmGetSavedSwapEntryPage(PFN_TYPE Page);
1177
1178 VOID
1179 NTAPI
1180 MmSetCleanPage(
1181 struct _EPROCESS *Process,
1182 PVOID Address
1183 );
1184
1185 NTSTATUS
1186 NTAPI
1187 MmCreatePageTable(PVOID PAddress);
1188
1189 VOID
1190 NTAPI
1191 MmDeletePageTable(
1192 struct _EPROCESS *Process,
1193 PVOID Address
1194 );
1195
1196 PFN_TYPE
1197 NTAPI
1198 MmGetPfnForProcess(
1199 struct _EPROCESS *Process,
1200 PVOID Address
1201 );
1202
1203 NTSTATUS
1204 STDCALL
1205 MmCopyMmInfo(
1206 struct _EPROCESS *Src,
1207 struct _EPROCESS *Dest,
1208 PPHYSICAL_ADDRESS DirectoryTableBase
1209 );
1210
1211 NTSTATUS
1212 NTAPI
1213 MmReleaseMmInfo(struct _EPROCESS *Process);
1214
1215 NTSTATUS
1216 NTAPI
1217 Mmi386ReleaseMmInfo(struct _EPROCESS *Process);
1218
1219 VOID
1220 NTAPI
1221 MmDeleteVirtualMapping(
1222 struct _EPROCESS *Process,
1223 PVOID Address,
1224 BOOLEAN FreePage,
1225 BOOLEAN* WasDirty,
1226 PPFN_TYPE Page
1227 );
1228
1229 BOOLEAN
1230 NTAPI
1231 MmIsDirtyPage(
1232 struct _EPROCESS *Process,
1233 PVOID Address
1234 );
1235
1236 VOID
1237 NTAPI
1238 MmMarkPageMapped(PFN_TYPE Page);
1239
1240 VOID
1241 NTAPI
1242 MmMarkPageUnmapped(PFN_TYPE Page);
1243
1244 VOID
1245 NTAPI
1246 MmUpdatePageDir(
1247 struct _EPROCESS *Process,
1248 PVOID Address,
1249 ULONG Size
1250 );
1251
1252 VOID
1253 NTAPI
1254 MiInitPageDirectoryMap(VOID);
1255
1256 ULONG
1257 NTAPI
1258 MiGetUserPageDirectoryCount(VOID);
1259
1260 /* wset.c ********************************************************************/
1261
1262 NTSTATUS
1263 MmTrimUserMemory(
1264 ULONG Target,
1265 ULONG Priority,
1266 PULONG NrFreedPages
1267 );
1268
1269 /* region.c ************************************************************/
1270
1271 NTSTATUS
1272 NTAPI
1273 MmAlterRegion(
1274 PMADDRESS_SPACE AddressSpace,
1275 PVOID BaseAddress,
1276 PLIST_ENTRY RegionListHead,
1277 PVOID StartAddress,
1278 ULONG Length,
1279 ULONG NewType,
1280 ULONG NewProtect,
1281 PMM_ALTER_REGION_FUNC AlterFunc
1282 );
1283
1284 VOID
1285 NTAPI
1286 MmInitializeRegion(
1287 PLIST_ENTRY RegionListHead,
1288 SIZE_T Length,
1289 ULONG Type,
1290 ULONG Protect
1291 );
1292
1293 PMM_REGION
1294 NTAPI
1295 MmFindRegion(
1296 PVOID BaseAddress,
1297 PLIST_ENTRY RegionListHead,
1298 PVOID Address,
1299 PVOID* RegionBaseAddress
1300 );
1301
1302 /* section.c *****************************************************************/
1303
1304 PFILE_OBJECT
1305 NTAPI
1306 MmGetFileObjectForSection(
1307 IN PROS_SECTION_OBJECT Section
1308 );
1309
1310 PVOID
1311 STDCALL
1312 MmAllocateSection(
1313 IN ULONG Length,
1314 PVOID BaseAddress
1315 );
1316
1317 NTSTATUS
1318 STDCALL
1319 MmQuerySectionView(
1320 PMEMORY_AREA MemoryArea,
1321 PVOID Address,
1322 PMEMORY_BASIC_INFORMATION Info,
1323 PULONG ResultLength
1324 );
1325
1326 NTSTATUS
1327 NTAPI
1328 MmProtectSectionView(
1329 PMADDRESS_SPACE AddressSpace,
1330 PMEMORY_AREA MemoryArea,
1331 PVOID BaseAddress,
1332 ULONG Length,
1333 ULONG Protect,
1334 PULONG OldProtect
1335 );
1336
1337 NTSTATUS
1338 NTAPI
1339 MmWritePageSectionView(
1340 PMADDRESS_SPACE AddressSpace,
1341 PMEMORY_AREA MArea,
1342 PVOID Address,
1343 PMM_PAGEOP PageOp
1344 );
1345
1346 NTSTATUS
1347 NTAPI
1348 MmInitSectionImplementation(VOID);
1349
1350 NTSTATUS
1351 NTAPI
1352 MmNotPresentFaultSectionView(
1353 PMADDRESS_SPACE AddressSpace,
1354 MEMORY_AREA* MemoryArea,
1355 PVOID Address,
1356 BOOLEAN Locked
1357 );
1358
1359 NTSTATUS
1360 NTAPI
1361 MmPageOutSectionView(
1362 PMADDRESS_SPACE AddressSpace,
1363 PMEMORY_AREA MemoryArea,
1364 PVOID Address,
1365 struct _MM_PAGEOP *PageOp
1366 );
1367
1368 NTSTATUS
1369 NTAPI
1370 MmCreatePhysicalMemorySection(VOID);
1371
1372 NTSTATUS
1373 NTAPI
1374 MmAccessFaultSectionView(
1375 PMADDRESS_SPACE AddressSpace,
1376 MEMORY_AREA* MemoryArea,
1377 PVOID Address,
1378 BOOLEAN Locked
1379 );
1380
1381 VOID
1382 NTAPI
1383 MmFreeSectionSegments(PFILE_OBJECT FileObject);
1384
1385 /* mpw.c *********************************************************************/
1386
1387 NTSTATUS
1388 NTAPI
1389 MmInitMpwThread(VOID);
1390
1391 /* pager.c *******************************************************************/
1392
1393 BOOLEAN
1394 NTAPI
1395 MiIsPagerThread(VOID);
1396
1397 VOID
1398 NTAPI
1399 MiStartPagerThread(VOID);
1400
1401 VOID
1402 NTAPI
1403 MiStopPagerThread(VOID);
1404
1405 NTSTATUS
1406 FASTCALL
1407 MiQueryVirtualMemory(
1408 IN HANDLE ProcessHandle,
1409 IN PVOID Address,
1410 IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass,
1411 OUT PVOID VirtualMemoryInformation,
1412 IN ULONG Length,
1413 OUT PULONG ResultLength
1414 );
1415
1416 #endif