3 * Copyright (C) 1998-2005 ReactOS Team (and the authors from the programmers section)
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 * PROJECT: ReactOS kernel
21 * FILE: ntoskrnl/include/internal/mm.h
22 * PURPOSE: level memory managment definitions
24 * PROGRAMMERS: David Welch
33 * Thomas Weidenmueller
40 #ifndef __INCLUDE_INTERNAL_MM_H
41 #define __INCLUDE_INTERNAL_MM_H
43 #include <internal/arch/mm.h>
45 /* TYPES *********************************************************************/
47 extern ULONG MiFreeSwapPages
;
48 extern ULONG MiUsedSwapPages
;
49 extern ULONG MmPagedPoolSize
;
50 extern ULONG MmTotalPagedPoolQuota
;
51 extern ULONG MmTotalNonPagedPoolQuota
;
55 struct _MM_RMAP_ENTRY
;
57 typedef ULONG SWAPENTRY
;
59 typedef ULONG PFN_TYPE
, *PPFN_TYPE
;
61 #define MEMORY_AREA_INVALID (0)
62 #define MEMORY_AREA_SECTION_VIEW (1)
63 #define MEMORY_AREA_CONTINUOUS_MEMORY (2)
64 #define MEMORY_AREA_NO_CACHE (3)
65 #define MEMORY_AREA_IO_MAPPING (4)
66 #define MEMORY_AREA_SYSTEM (5)
67 #define MEMORY_AREA_MDL_MAPPING (7)
68 #define MEMORY_AREA_VIRTUAL_MEMORY (8)
69 #define MEMORY_AREA_CACHE_SEGMENT (9)
70 #define MEMORY_AREA_SHARED_DATA (10)
71 #define MEMORY_AREA_KERNEL_STACK (11)
72 #define MEMORY_AREA_PAGED_POOL (12)
73 #define MEMORY_AREA_NO_ACCESS (13)
74 #define MEMORY_AREA_PEB_OR_TEB (14)
76 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
78 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
79 ((((x)) % (4*1024*1024)) / (4*1024))
81 #define NR_SECTION_PAGE_TABLES (1024)
82 #define NR_SECTION_PAGE_ENTRIES (1024)
85 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
88 #define MM_VIRTMEM_GRANULARITY (64 * 1024) /* Although Microsoft says this isn't hardcoded anymore,
89 they won't be able to change it. Stuff depends on it */
91 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
94 * Additional flags for protection attributes
96 #define PAGE_WRITETHROUGH (1024)
97 #define PAGE_SYSTEM (2048)
98 #define PAGE_FLAGS_VALID_FROM_USER_MODE (PAGE_READONLY | \
102 PAGE_EXECUTE_READ | \
103 PAGE_EXECUTE_READWRITE | \
104 PAGE_EXECUTE_WRITECOPY | \
109 #define PAGE_IS_READABLE (PAGE_READONLY | \
112 PAGE_EXECUTE_READ | \
113 PAGE_EXECUTE_READWRITE | \
114 PAGE_EXECUTE_WRITECOPY)
116 #define PAGE_IS_WRITABLE (PAGE_READWRITE | \
118 PAGE_EXECUTE_READWRITE | \
119 PAGE_EXECUTE_WRITECOPY)
121 #define PAGE_IS_EXECUTABLE (PAGE_EXECUTE | \
122 PAGE_EXECUTE_READ | \
123 PAGE_EXECUTE_READWRITE | \
124 PAGE_EXECUTE_WRITECOPY)
126 #define PAGE_IS_WRITECOPY (PAGE_WRITECOPY | \
127 PAGE_EXECUTE_WRITECOPY)
131 ULONG Entry
[NR_SECTION_PAGE_ENTRIES
];
132 } SECTION_PAGE_TABLE
, *PSECTION_PAGE_TABLE
;
136 PSECTION_PAGE_TABLE PageTables
[NR_SECTION_PAGE_TABLES
];
137 } SECTION_PAGE_DIRECTORY
, *PSECTION_PAGE_DIRECTORY
;
139 #define SEC_PHYSICALMEMORY (0x80000000)
141 #define MM_PAGEFILE_SEGMENT (0x1)
142 #define MM_DATAFILE_SEGMENT (0x2)
144 typedef struct _MM_SECTION_SEGMENT
147 ULONG_PTR VirtualAddress
;
152 ULONG ReferenceCount
;
153 SECTION_PAGE_DIRECTORY PageDirectory
;
155 ULONG Characteristics
;
157 } MM_SECTION_SEGMENT
, *PMM_SECTION_SEGMENT
;
159 typedef struct _MM_IMAGE_SECTION_OBJECT
162 ULONG_PTR StackReserve
;
163 ULONG_PTR StackCommit
;
164 ULONG_PTR EntryPoint
;
166 ULONG ImageCharacteristics
;
167 USHORT MinorSubsystemVersion
;
168 USHORT MajorSubsystemVersion
;
172 PMM_SECTION_SEGMENT Segments
;
173 } MM_IMAGE_SECTION_OBJECT
, *PMM_IMAGE_SECTION_OBJECT
;
175 typedef struct _SECTION_OBJECT
179 LARGE_INTEGER MaximumSize
;
180 ULONG SectionPageProtection
;
181 ULONG AllocationAttributes
;
182 PFILE_OBJECT FileObject
;
185 PMM_IMAGE_SECTION_OBJECT ImageSection
;
186 PMM_SECTION_SEGMENT Segment
;
192 typedef struct _SECTION_OBJECT
*PSECTION_OBJECT
;
194 typedef struct _EPROCESS_QUOTA_ENTRY
{
199 } EPROCESS_QUOTA_ENTRY
, *PEPROCESS_QUOTA_ENTRY
;
201 typedef struct _EPROCESS_QUOTA_BLOCK
{
202 EPROCESS_QUOTA_ENTRY QuotaEntry
[3];
203 LIST_ENTRY QuotaList
;
204 ULONG ReferenceCount
;
206 } EPROCESS_QUOTA_BLOCK
, *PEPROCESS_QUOTA_BLOCK
;
212 typedef struct _PAGEFAULT_HISTORY
218 struct _PROCESS_WS_WATCH_INFORMATION WatchInfo
[1];
219 } PAGEFAULT_HISTORY
, *PPAGEFAULT_HISTORY
;
221 #endif /* __USE_W32API */
223 typedef struct _MMADDRESS_NODE
227 struct _MMADDRESS_NODE
*Parent
;
229 struct _MMADDRESS_NODE
*LeftChild
;
230 struct _MMADDRESS_NODE
*RightChild
;
233 } MMADDRESS_NODE
, *PMMADDRESS_NODE
;
235 typedef struct _MM_AVL_TABLE
237 MMADDRESS_NODE BalancedRoot
;
240 ULONG NumberGenericTableElements
:24;
243 } MM_AVL_TABLE
, *PMM_AVL_TABLE
;
245 typedef struct _MEMORY_AREA
247 PVOID StartingAddress
;
249 struct _MEMORY_AREA
*Parent
;
250 struct _MEMORY_AREA
*LeftChild
;
251 struct _MEMORY_AREA
*RightChild
;
255 BOOLEAN DeleteInProgress
;
261 SECTION_OBJECT
* Section
;
263 PMM_SECTION_SEGMENT Segment
;
264 BOOLEAN WriteCopyView
;
265 LIST_ENTRY RegionListHead
;
269 LIST_ENTRY RegionListHead
;
272 } MEMORY_AREA
, *PMEMORY_AREA
;
274 typedef struct _MADDRESS_SPACE
276 PMEMORY_AREA MemoryAreaRoot
;
279 struct _EPROCESS
* Process
;
280 PUSHORT PageTableRefCountTable
;
281 ULONG PageTableRefCountTableSize
;
282 } MADDRESS_SPACE
, *PMADDRESS_SPACE
;
284 typedef struct _KNODE
{
287 ULONG MmShiftedColor
;
289 SLIST_HEADER DeadStackList
;
290 SLIST_HEADER PfnDereferenceSListHead
;
291 struct _SINGLE_LIST_ENTRY
*PfnDeferredList
;
301 extern PVOID EXPORTED MmSystemRangeStart
;
303 extern PVOID IMPORTED MmSystemRangeStart
;
306 #endif /* __USE_W32API */
312 ULONG NrReservedPages
;
317 ULONG PagingRequestsInLastMinute
;
318 ULONG PagingRequestsInLastFiveMinutes
;
319 ULONG PagingRequestsInLastFifteenMinutes
;
322 extern MM_STATS MmStats
;
324 #define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
326 #define MM_PAGEOP_PAGEIN (1)
327 #define MM_PAGEOP_PAGEOUT (2)
328 #define MM_PAGEOP_PAGESYNCH (3)
329 #define MM_PAGEOP_ACCESSFAULT (4)
331 typedef struct _MM_PAGEOP
333 /* Type of operation. */
335 /* Number of threads interested in this operation. */
336 ULONG ReferenceCount
;
337 /* Event that will be set when the operation is completed. */
338 KEVENT CompletionEvent
;
339 /* Status of the operation once it is completed. */
341 /* TRUE if the operation was abandoned. */
343 /* The memory area to be affected by the operation. */
346 struct _MM_PAGEOP
* Next
;
347 struct _ETHREAD
* Thread
;
349 * These fields are used to identify the operation if it is against a
350 * virtual memory area.
355 * These fields are used to identify the operation if it is against a
358 PMM_SECTION_SEGMENT Segment
;
360 } MM_PAGEOP
, *PMM_PAGEOP
;
365 #define MC_NPPOOL (3)
366 #define MC_MAXIMUM (4)
368 typedef struct _MM_MEMORY_CONSUMER
372 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
);
374 MM_MEMORY_CONSUMER
, *PMM_MEMORY_CONSUMER
;
376 extern MM_MEMORY_CONSUMER MiMemoryConsumers
[MC_MAXIMUM
];
378 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress
;
381 typedef VOID (*PMM_ALTER_REGION_FUNC
)(PMADDRESS_SPACE AddressSpace
,
382 PVOID BaseAddress
, ULONG Length
,
383 ULONG OldType
, ULONG OldProtect
,
384 ULONG NewType
, ULONG NewProtect
);
386 typedef struct _MM_REGION
391 LIST_ENTRY RegionListEntry
;
392 } MM_REGION
, *PMM_REGION
;
394 typedef VOID (*PMM_FREE_PAGE_FUNC
)(PVOID Context
, PMEMORY_AREA MemoryArea
,
395 PVOID Address
, PFN_TYPE Page
,
396 SWAPENTRY SwapEntry
, BOOLEAN Dirty
);
400 /* aspace.c ******************************************************************/
402 VOID
MmLockAddressSpace(PMADDRESS_SPACE AddressSpace
);
404 VOID
MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace
);
406 VOID
MmInitializeKernelAddressSpace(VOID
);
408 PMADDRESS_SPACE
MmGetCurrentAddressSpace(VOID
);
410 PMADDRESS_SPACE
MmGetKernelAddressSpace(VOID
);
412 NTSTATUS
MmInitializeAddressSpace(struct _EPROCESS
* Process
,
413 PMADDRESS_SPACE AddressSpace
);
415 NTSTATUS
MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
);
417 /* marea.c *******************************************************************/
419 NTSTATUS INIT_FUNCTION
420 MmInitMemoryAreas(VOID
);
424 struct _EPROCESS
* Process
,
425 PMADDRESS_SPACE AddressSpace
,
430 PMEMORY_AREA
*Result
,
431 BOOLEAN FixedAddress
,
433 PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
);
436 MmLocateMemoryAreaByAddress(
437 PMADDRESS_SPACE AddressSpace
,
442 PMADDRESS_SPACE AddressSpace
,
447 PMADDRESS_SPACE AddressSpace
,
448 PMEMORY_AREA MemoryArea
,
449 PMM_FREE_PAGE_FUNC FreePage
,
450 PVOID FreePageContext
);
453 MmFreeMemoryAreaByPtr(
454 PMADDRESS_SPACE AddressSpace
,
456 PMM_FREE_PAGE_FUNC FreePage
,
457 PVOID FreePageContext
);
460 MmDumpMemoryAreas(PMADDRESS_SPACE AddressSpace
);
463 MmLocateMemoryAreaByRegion(
464 PMADDRESS_SPACE AddressSpace
,
470 PMADDRESS_SPACE AddressSpace
,
472 ULONG_PTR Granularity
,
476 MmReleaseMemoryAreaIfDecommitted(
478 PMADDRESS_SPACE AddressSpace
,
481 /* npool.c *******************************************************************/
483 VOID
MiDebugDumpNonPagedPool(BOOLEAN NewOnly
);
485 VOID
MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly
);
487 VOID
MiInitializeNonPagedPool(VOID
);
489 PVOID
MmGetMdlPageAddress(PMDL Mdl
, PVOID Offset
);
491 /* pool.c *******************************************************************/
496 IN POOL_TYPE PoolType
,
497 IN ULONG CurrentMaxQuota
,
498 OUT PULONG NewMaxQuota
501 /* mdl.c *********************************************************************/
503 VOID
MmBuildMdlFromPages(PMDL Mdl
, PULONG Pages
);
505 /* mminit.c ******************************************************************/
507 VOID
MiShutdownMemoryManager(VOID
);
509 VOID
MmInit1(ULONG_PTR FirstKernelPhysAddress
,
510 ULONG_PTR LastKernelPhysAddress
,
511 ULONG_PTR LastKernelAddress
,
512 PADDRESS_RANGE BIOSMemoryMap
,
513 ULONG AddressRangeCount
,
520 VOID
MiFreeInitMemory(VOID
);
522 VOID
MmInitializeMdlImplementation(VOID
);
524 /* pagefile.c ****************************************************************/
526 SWAPENTRY
MmAllocSwapPage(VOID
);
528 VOID
MmDereserveSwapPages(ULONG Nr
);
530 VOID
MmFreeSwapPage(SWAPENTRY Entry
);
532 VOID
MmInitPagingFile(VOID
);
534 NTSTATUS
MmReadFromSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
536 BOOLEAN
MmReserveSwapPages(ULONG Nr
);
538 NTSTATUS
MmWriteToSwapPage(SWAPENTRY SwapEntry
, PFN_TYPE Page
);
541 MmDumpToPagingFile(ULONG BugCode
,
542 ULONG BugCodeParameter1
,
543 ULONG BugCodeParameter2
,
544 ULONG BugCodeParameter3
,
545 ULONG BugCodeParameter4
,
546 struct _KTRAP_FRAME
* TrapFrame
);
548 BOOLEAN
MmIsAvailableSwapPage(VOID
);
550 VOID
MmShowOutOfSpaceMessagePagingFile(VOID
);
552 /* process.c ****************************************************************/
556 MmCreateProcessAddressSpace(IN
struct _EPROCESS
* Process
,
557 IN PSECTION_OBJECT Section OPTIONAL
);
561 MmCreatePeb(PEPROCESS Process
);
565 MmCreateTeb(PEPROCESS Process
,
567 PINITIAL_TEB InitialTeb
);
571 MmDeleteTeb(PEPROCESS Process
,
574 /* i386/pfault.c *************************************************************/
576 NTSTATUS
MmPageFault(ULONG Cs
,
582 /* mm.c **********************************************************************/
584 NTSTATUS
MmAccessFault(KPROCESSOR_MODE Mode
,
588 NTSTATUS
MmNotPresentFault(KPROCESSOR_MODE Mode
,
592 /* anonmem.c *****************************************************************/
594 NTSTATUS
MmNotPresentFaultVirtualMemory(PMADDRESS_SPACE AddressSpace
,
595 MEMORY_AREA
* MemoryArea
,
599 NTSTATUS
MmPageOutVirtualMemory(PMADDRESS_SPACE AddressSpace
,
600 PMEMORY_AREA MemoryArea
,
602 struct _MM_PAGEOP
* PageOp
);
604 MmQueryAnonMem(PMEMORY_AREA MemoryArea
,
606 PMEMORY_BASIC_INFORMATION Info
,
607 PULONG ResultLength
);
609 VOID
MmFreeVirtualMemory(struct _EPROCESS
* Process
, PMEMORY_AREA MemoryArea
);
611 NTSTATUS
MmProtectAnonMem(PMADDRESS_SPACE AddressSpace
,
612 PMEMORY_AREA MemoryArea
,
618 NTSTATUS
MmWritePageVirtualMemory(PMADDRESS_SPACE AddressSpace
,
623 /* kmap.c ********************************************************************/
625 PVOID
ExAllocatePage(VOID
);
627 VOID
ExUnmapPage(PVOID Addr
);
629 PVOID
ExAllocatePageWithPhysPage(PFN_TYPE Page
);
631 NTSTATUS
MiCopyFromUserPage(PFN_TYPE Page
, PVOID SourceAddress
);
633 NTSTATUS
MiZeroPage(PFN_TYPE Page
);
635 /* memsafe.s *****************************************************************/
637 NTSTATUS
MmSafeCopyFromUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
639 NTSTATUS
MmSafeCopyToUser(PVOID Dest
, const VOID
*Src
, ULONG Count
);
641 PVOID FASTCALL
MmSafeReadPtr(PVOID Source
);
643 /* pageop.c ******************************************************************/
646 MmReleasePageOp(PMM_PAGEOP PageOp
);
649 MmGetPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
650 PMM_SECTION_SEGMENT Segment
, ULONG Offset
, ULONG OpType
, BOOL First
);
652 MmCheckForPageOp(PMEMORY_AREA MArea
, HANDLE Pid
, PVOID Address
,
653 PMM_SECTION_SEGMENT Segment
, ULONG Offset
);
655 MmInitializePageOp(VOID
);
657 /* process.c *****************************************************************/
661 MmCreateKernelStack(BOOLEAN GuiStack
);
665 MmDeleteKernelStack(PVOID Stack
,
668 /* balace.c ******************************************************************/
670 VOID
MmInitializeMemoryConsumer(ULONG Consumer
,
671 NTSTATUS (*Trim
)(ULONG Target
, ULONG Priority
, PULONG NrFreed
));
673 VOID
MmInitializeBalancer(ULONG NrAvailablePages
, ULONG NrSystemPages
);
675 NTSTATUS
MmReleasePageMemoryConsumer(ULONG Consumer
, PFN_TYPE Page
);
677 NTSTATUS
MmRequestPageMemoryConsumer(ULONG Consumer
, BOOLEAN MyWait
, PPFN_TYPE AllocatedPage
);
679 VOID
MiInitBalancerThread(VOID
);
681 VOID
MmRebalanceMemoryConsumers(VOID
);
683 /* rmap.c **************************************************************/
685 VOID
MmSetRmapListHeadPage(PFN_TYPE Page
, struct _MM_RMAP_ENTRY
* ListHead
);
687 struct _MM_RMAP_ENTRY
* MmGetRmapListHeadPage(PFN_TYPE Page
);
689 VOID
MmInsertRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
691 VOID
MmDeleteAllRmaps(PFN_TYPE Page
, PVOID Context
,
692 VOID (*DeleteMapping
)(PVOID Context
, PEPROCESS Process
, PVOID Address
));
694 VOID
MmDeleteRmap(PFN_TYPE Page
, PEPROCESS Process
, PVOID Address
);
696 VOID
MmInitializeRmapList(VOID
);
698 VOID
MmSetCleanAllRmaps(PFN_TYPE Page
);
700 VOID
MmSetDirtyAllRmaps(PFN_TYPE Page
);
702 BOOL
MmIsDirtyPageRmap(PFN_TYPE Page
);
704 NTSTATUS
MmWritePagePhysicalAddress(PFN_TYPE Page
);
706 NTSTATUS
MmPageOutPhysicalAddress(PFN_TYPE Page
);
708 /* freelist.c **********************************************************/
710 PFN_TYPE
MmGetLRUNextUserPage(PFN_TYPE PreviousPage
);
712 PFN_TYPE
MmGetLRUFirstUserPage(VOID
);
714 VOID
MmSetLRULastPage(PFN_TYPE Page
);
716 VOID
MmLockPage(PFN_TYPE Page
);
717 VOID
MmLockPageUnsafe(PFN_TYPE Page
);
719 VOID
MmUnlockPage(PFN_TYPE Page
);
721 ULONG
MmGetLockCountPage(PFN_TYPE Page
);
723 PVOID
MmInitializePageList(ULONG_PTR FirstPhysKernelAddress
,
724 ULONG_PTR LastPhysKernelAddress
,
725 ULONG MemorySizeInPages
,
726 ULONG_PTR LastKernelBase
,
727 PADDRESS_RANGE BIOSMemoryMap
,
728 ULONG AddressRangeCount
);
730 PFN_TYPE
MmGetContinuousPages(ULONG NumberOfBytes
,
731 PHYSICAL_ADDRESS LowestAcceptableAddress
,
732 PHYSICAL_ADDRESS HighestAcceptableAddress
,
735 NTSTATUS
MmInitZeroPageThread(VOID
);
737 /* i386/page.c *********************************************************/
739 PVOID
MmCreateHyperspaceMapping(PFN_TYPE Page
);
741 PFN_TYPE
MmChangeHyperspaceMapping(PVOID Address
, PFN_TYPE Page
);
743 PFN_TYPE
MmDeleteHyperspaceMapping(PVOID Address
);
745 NTSTATUS
MmCreateVirtualMappingForKernel(PVOID Address
,
750 NTSTATUS
MmCommitPagedPoolAddress(PVOID Address
, BOOLEAN Locked
);
752 NTSTATUS
MmCreateVirtualMapping(struct _EPROCESS
* Process
,
758 NTSTATUS
MmCreateVirtualMappingUnsafe(struct _EPROCESS
* Process
,
764 ULONG
MmGetPageProtect(struct _EPROCESS
* Process
, PVOID Address
);
766 VOID
MmSetPageProtect(struct _EPROCESS
* Process
,
770 BOOLEAN
MmIsPagePresent(struct _EPROCESS
* Process
,
773 VOID
MmInitGlobalKernelPageDirectory(VOID
);
775 VOID
MmDisableVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOL
* WasDirty
, PPFN_TYPE Page
);
777 VOID
MmEnableVirtualMapping(PEPROCESS Process
, PVOID Address
);
779 VOID
MmRawDeleteVirtualMapping(PVOID Address
);
781 VOID
MmDeletePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY
* SwapEntry
);
783 NTSTATUS
MmCreatePageFileMapping(PEPROCESS Process
, PVOID Address
, SWAPENTRY SwapEntry
);
785 BOOLEAN
MmIsPageSwapEntry(PEPROCESS Process
, PVOID Address
);
787 VOID
MmTransferOwnershipPage(PFN_TYPE Page
, ULONG NewConsumer
);
789 VOID
MmSetDirtyPage(PEPROCESS Process
, PVOID Address
);
791 PFN_TYPE
MmAllocPage(ULONG Consumer
, SWAPENTRY SavedSwapEntry
);
793 LONG
MmAllocPagesSpecifyRange(ULONG Consumer
,
794 PHYSICAL_ADDRESS LowestAddress
,
795 PHYSICAL_ADDRESS HighestAddress
,
799 VOID
MmDereferencePage(PFN_TYPE Page
);
801 VOID
MmReferencePage(PFN_TYPE Page
);
802 VOID
MmReferencePageUnsafe(PFN_TYPE Page
);
804 BOOLEAN
MmIsAccessedAndResetAccessPage(struct _EPROCESS
* Process
, PVOID Address
);
806 ULONG
MmGetReferenceCountPage(PFN_TYPE Page
);
808 BOOLEAN
MmIsUsablePage(PFN_TYPE Page
);
810 VOID
MmSetFlagsPage(PFN_TYPE Page
, ULONG Flags
);
812 ULONG
MmGetFlagsPage(PFN_TYPE Page
);
814 VOID
MmSetSavedSwapEntryPage(PFN_TYPE Page
, SWAPENTRY SavedSwapEntry
);
816 SWAPENTRY
MmGetSavedSwapEntryPage(PFN_TYPE Page
);
818 VOID
MmSetCleanPage(struct _EPROCESS
* Process
, PVOID Address
);
820 NTSTATUS
MmCreatePageTable(PVOID PAddress
);
822 VOID
MmDeletePageTable(struct _EPROCESS
* Process
, PVOID Address
);
824 PFN_TYPE
MmGetPfnForProcess(struct _EPROCESS
* Process
, PVOID Address
);
828 MmCopyMmInfo(struct _EPROCESS
* Src
,
829 struct _EPROCESS
* Dest
,
830 PPHYSICAL_ADDRESS DirectoryTableBase
);
832 NTSTATUS
MmReleaseMmInfo(struct _EPROCESS
* Process
);
834 NTSTATUS
Mmi386ReleaseMmInfo(struct _EPROCESS
* Process
);
836 VOID
MmDeleteVirtualMapping(struct _EPROCESS
* Process
,
842 BOOLEAN
MmIsDirtyPage(struct _EPROCESS
* Process
, PVOID Address
);
844 VOID
MmMarkPageMapped(PFN_TYPE Page
);
846 VOID
MmMarkPageUnmapped(PFN_TYPE Page
);
848 VOID
MmUpdatePageDir(PEPROCESS Process
, PVOID Address
, ULONG Size
);
850 VOID
MiInitPageDirectoryMap(VOID
);
852 ULONG
MiGetUserPageDirectoryCount(VOID
);
854 /* wset.c ********************************************************************/
856 NTSTATUS
MmTrimUserMemory(ULONG Target
, ULONG Priority
, PULONG NrFreedPages
);
858 /* cont.c ********************************************************************/
861 MmAllocateContiguousAlignedMemory(IN ULONG NumberOfBytes
,
862 IN PHYSICAL_ADDRESS LowestAcceptableAddress
,
863 IN PHYSICAL_ADDRESS HighestAcceptableAddress
,
864 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
,
865 IN MEMORY_CACHING_TYPE CacheType OPTIONAL
,
868 /* region.c ************************************************************/
870 NTSTATUS
MmAlterRegion(PMADDRESS_SPACE AddressSpace
, PVOID BaseAddress
,
871 PLIST_ENTRY RegionListHead
, PVOID StartAddress
, ULONG Length
,
872 ULONG NewType
, ULONG NewProtect
,
873 PMM_ALTER_REGION_FUNC AlterFunc
);
875 VOID
MmInitialiseRegion(PLIST_ENTRY RegionListHead
, ULONG Length
, ULONG Type
,
878 PMM_REGION
MmFindRegion(PVOID BaseAddress
, PLIST_ENTRY RegionListHead
, PVOID Address
,
879 PVOID
* RegionBaseAddress
);
881 /* section.c *****************************************************************/
884 MmAllocateSection (IN ULONG Length
, PVOID BaseAddress
);
887 MmQuerySectionView(PMEMORY_AREA MemoryArea
,
889 PMEMORY_BASIC_INFORMATION Info
,
890 PULONG ResultLength
);
893 MmProtectSectionView(PMADDRESS_SPACE AddressSpace
,
894 PMEMORY_AREA MemoryArea
,
901 MmWritePageSectionView(PMADDRESS_SPACE AddressSpace
,
906 NTSTATUS
MmInitSectionImplementation(VOID
);
909 MmUnmapViewOfSection(struct _EPROCESS
* Process
, PVOID BaseAddress
);
911 /* FIXME: it should be in ddk/mmfuncs.h */
913 MmCreateSection (OUT PSECTION_OBJECT
* SectionObject
,
914 IN ACCESS_MASK DesiredAccess
,
915 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
916 IN PLARGE_INTEGER MaximumSize
,
917 IN ULONG SectionPageProtection
,
918 IN ULONG AllocationAttributes
,
919 IN HANDLE FileHandle OPTIONAL
,
920 IN PFILE_OBJECT File OPTIONAL
);
923 MmNotPresentFaultSectionView(PMADDRESS_SPACE AddressSpace
,
924 MEMORY_AREA
* MemoryArea
,
929 MmPageOutSectionView(PMADDRESS_SPACE AddressSpace
,
930 PMEMORY_AREA MemoryArea
,
932 struct _MM_PAGEOP
* PageOp
);
935 MmCreatePhysicalMemorySection(VOID
);
938 MmAccessFaultSectionView(PMADDRESS_SPACE AddressSpace
,
939 MEMORY_AREA
* MemoryArea
,
944 MmFreeSectionSegments(PFILE_OBJECT FileObject
);
946 /* mpw.c *********************************************************************/
948 NTSTATUS
MmInitMpwThread(VOID
);
950 /* pager.c *******************************************************************/
952 BOOLEAN
MiIsPagerThread(VOID
);
954 VOID
MiStartPagerThread(VOID
);
956 VOID
MiStopPagerThread(VOID
);