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