-#ifndef __INCLUDE_INTERNAL_MM_H
-#define __INCLUDE_INTERNAL_MM_H
+#pragma once
#include <internal/arch/mm.h>
struct _EPROCESS;
-extern ULONG MiFreeSwapPages;
-extern ULONG MiUsedSwapPages;
-extern ULONG MmPagedPoolSize;
-extern ULONG MmTotalPagedPoolQuota;
-extern ULONG MmTotalNonPagedPoolQuota;
+extern PFN_NUMBER MiFreeSwapPages;
+extern PFN_NUMBER MiUsedSwapPages;
+extern SIZE_T MmTotalPagedPoolQuota;
+extern SIZE_T MmTotalNonPagedPoolQuota;
extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress;
-extern ULONG MmNumberOfPhysicalPages;
-
-extern PVOID MmPagedPoolBase;
-extern ULONG MmPagedPoolSize;
+extern PFN_NUMBER MmNumberOfPhysicalPages;
+extern UCHAR MmDisablePagingExecutive;
+extern PFN_NUMBER MmLowestPhysicalPage;
+extern PFN_NUMBER MmHighestPhysicalPage;
+extern PFN_NUMBER MmAvailablePages;
+extern PFN_NUMBER MmResidentAvailablePages;
extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor;
extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg;
-extern ULONG MmHighestPhysicalPage;
-extern PVOID MmPfnDatabase;
+
+extern LIST_ENTRY MmLoadedUserImageList;
+
+extern KMUTANT MmSystemLoadLock;
+
+extern ULONG MmNumberOfPagingFiles;
+
+extern PVOID MmUnloadedDrivers;
+extern PVOID MmLastUnloadedDrivers;
+extern PVOID MmTriageActionTaken;
+extern PVOID KernelVerifier;
+extern MM_DRIVER_VERIFIER_DATA MmVerifierData;
+
+extern SIZE_T MmTotalCommitLimit;
+extern SIZE_T MmTotalCommittedPages;
+extern SIZE_T MmSharedCommit;
+extern SIZE_T MmDriverCommit;
+extern SIZE_T MmProcessCommit;
+extern SIZE_T MmPagedPoolCommit;
+extern SIZE_T MmPeakCommitment;
+extern SIZE_T MmtotalCommitLimitMaximum;
+
+extern PVOID MiDebugMapping;
+extern PMMPTE MmDebugPte;
struct _KTRAP_FRAME;
struct _EPROCESS;
struct _MM_RMAP_ENTRY;
struct _MM_PAGEOP;
typedef ULONG SWAPENTRY;
-typedef ULONG PFN_TYPE, *PPFN_TYPE;
-#define MEMORY_AREA_INVALID (0)
+//
+// MmDbgCopyMemory Flags
+//
+#define MMDBG_COPY_WRITE 0x00000001
+#define MMDBG_COPY_PHYSICAL 0x00000002
+#define MMDBG_COPY_UNSAFE 0x00000004
+#define MMDBG_COPY_CACHED 0x00000008
+#define MMDBG_COPY_UNCACHED 0x00000010
+#define MMDBG_COPY_WRITE_COMBINED 0x00000020
+
+//
+// Maximum chunk size per copy
+//
+#define MMDBG_COPY_MAX_SIZE 0x8
+
+#if defined(_X86_)
+#define MI_STATIC_MEMORY_AREAS (14)
+#else
+#define MI_STATIC_MEMORY_AREAS (13)
+#endif
+
#define MEMORY_AREA_SECTION_VIEW (1)
-#define MEMORY_AREA_CONTINUOUS_MEMORY (2)
-#define MEMORY_AREA_NO_CACHE (3)
-#define MEMORY_AREA_IO_MAPPING (4)
-#define MEMORY_AREA_SYSTEM (5)
-#define MEMORY_AREA_MDL_MAPPING (7)
#define MEMORY_AREA_VIRTUAL_MEMORY (8)
-#define MEMORY_AREA_CACHE_SEGMENT (9)
-#define MEMORY_AREA_SHARED_DATA (10)
-#define MEMORY_AREA_KERNEL_STACK (11)
-#define MEMORY_AREA_PAGED_POOL (12)
-#define MEMORY_AREA_NO_ACCESS (13)
-#define MEMORY_AREA_PEB_OR_TEB (14)
+#define MEMORY_AREA_OWNED_BY_ARM3 (15)
+#define MEMORY_AREA_STATIC (0x80000000)
#define MM_PHYSICAL_PAGE_MPW_PENDING (0x8)
/* Number of list heads to use */
#define MI_FREE_POOL_LISTS 4
-/* Signature of free pool blocks */
-#define MM_FREE_POOL_TAG TAG('F', 'r', 'p', 'l')
-#define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
- ((x) / (4*1024*1024))
-
-#define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
- ((((x)) % (4*1024*1024)) / (4*1024))
-
-#define NR_SECTION_PAGE_TABLES 1024
-#define NR_SECTION_PAGE_ENTRIES 1024
-
-#define TEB_BASE 0x7FFDE000
+/* Signature of free pool blocks */
+#define MM_FREE_POOL_TAG 'lprF'
/* Although Microsoft says this isn't hardcoded anymore,
they won't be able to change it. Stuff depends on it */
#define MC_CACHE (0)
#define MC_USER (1)
-#define MC_PPOOL (2)
-#define MC_NPPOOL (3)
-#define MC_MAXIMUM (4)
+#define MC_SYSTEM (2)
+#define MC_MAXIMUM (3)
#define PAGED_POOL_MASK 1
#define MUST_SUCCEED_POOL_MASK 2
*/
#define MM_POOL_ALIGNMENT 8
-/*
- * Maximum size of the kmalloc area (this is totally arbitary)
- */
-#define MM_KERNEL_MAP_SIZE (16*1024*1024)
-#define MM_KERNEL_MAP_BASE (0xf0c00000)
-
-/*
- * FIXME - different architectures have different cache line sizes...
- */
-#define MM_CACHE_LINE_SIZE 32
-
#define MM_ROUND_UP(x,s) \
((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
PAGE_NOACCESS | \
PAGE_NOCACHE)
+#define PAGE_FLAGS_VALID_FOR_SECTION \
+ (PAGE_READONLY | \
+ PAGE_READWRITE | \
+ PAGE_WRITECOPY | \
+ PAGE_EXECUTE | \
+ PAGE_EXECUTE_READ | \
+ PAGE_EXECUTE_READWRITE | \
+ PAGE_EXECUTE_WRITECOPY | \
+ PAGE_NOACCESS)
+
#define PAGE_IS_READABLE \
(PAGE_READONLY | \
PAGE_READWRITE | \
};
} ROS_SECTION_OBJECT, *PROS_SECTION_OBJECT;
+struct _MM_CACHE_SECTION_SEGMENT;
+
typedef struct _MEMORY_AREA
{
PVOID StartingAddress;
ULONG Flags;
BOOLEAN DeleteInProgress;
ULONG PageOpCount;
+ PVOID Vad;
union
{
struct
ROS_SECTION_OBJECT* Section;
ULONG ViewOffset;
PMM_SECTION_SEGMENT Segment;
- BOOLEAN WriteCopyView;
LIST_ENTRY RegionListHead;
} SectionData;
+ struct
+ {
+ LARGE_INTEGER ViewOffset;
+ struct _MM_CACHE_SECTION_SEGMENT *Segment;
+ } CacheData;
struct
{
LIST_ENTRY RegionListHead;
} Data;
} MEMORY_AREA, *PMEMORY_AREA;
-typedef struct
+typedef struct _MM_RMAP_ENTRY
+{
+ struct _MM_RMAP_ENTRY* Next;
+ PEPROCESS Process;
+ PVOID Address;
+#if DBG
+ PVOID Caller;
+#endif
+}
+MM_RMAP_ENTRY, *PMM_RMAP_ENTRY;
+
+#if MI_TRACE_PFNS
+extern ULONG MI_PFN_CURRENT_USAGE;
+extern CHAR MI_PFN_CURRENT_PROCESS_NAME[16];
+#define MI_SET_USAGE(x) MI_PFN_CURRENT_USAGE = x
+#define MI_SET_PROCESS2(x) memcpy(MI_PFN_CURRENT_PROCESS_NAME, x, 16)
+#else
+#define MI_SET_USAGE(x)
+#define MI_SET_PROCESS2(x)
+#endif
+
+typedef enum _MI_PFN_USAGES
+{
+ MI_USAGE_NOT_SET = 0,
+ MI_USAGE_PAGED_POOL,
+ MI_USAGE_NONPAGED_POOL,
+ MI_USAGE_NONPAGED_POOL_EXPANSION,
+ MI_USAGE_KERNEL_STACK,
+ MI_USAGE_KERNEL_STACK_EXPANSION,
+ MI_USAGE_SYSTEM_PTE,
+ MI_USAGE_VAD,
+ MI_USAGE_PEB_TEB,
+ MI_USAGE_SECTION,
+ MI_USAGE_PAGE_TABLE,
+ MI_USAGE_PAGE_DIRECTORY,
+ MI_USAGE_LEGACY_PAGE_DIRECTORY,
+ MI_USAGE_DRIVER_PAGE,
+ MI_USAGE_CONTINOUS_ALLOCATION,
+ MI_USAGE_MDL,
+ MI_USAGE_DEMAND_ZERO,
+ MI_USAGE_ZERO_LOOP,
+ MI_USAGE_CACHE,
+ MI_USAGE_PFN_DATABASE,
+ MI_USAGE_BOOT_DRIVER,
+ MI_USAGE_INIT_MEMORY,
+ MI_USAGE_FREE_PAGE
+} MI_PFN_USAGES;
+
+//
+// These two mappings are actually used by Windows itself, based on the ASSERTS
+//
+#define StartOfAllocation ReadInProgress
+#define EndOfAllocation WriteInProgress
+
+typedef struct _MMPFNENTRY
{
- ULONG NrTotalPages;
- ULONG NrSystemPages;
- ULONG NrUserPages;
- ULONG NrFreePages;
- ULONG NrDirtyPages;
- ULONG NrLockedPages;
- ULONG PagingRequestsInLastMinute;
- ULONG PagingRequestsInLastFiveMinutes;
- ULONG PagingRequestsInLastFifteenMinutes;
-} MM_STATS;
-
-typedef struct _PHYSICAL_PAGE
+ USHORT Modified:1;
+ USHORT ReadInProgress:1; // StartOfAllocation
+ USHORT WriteInProgress:1; // EndOfAllocation
+ USHORT PrototypePte:1;
+ USHORT PageColor:4;
+ USHORT PageLocation:3;
+ USHORT RemovalRequested:1;
+ USHORT CacheAttribute:2;
+ USHORT Rom:1;
+ USHORT ParityError:1; // HasRmap
+} MMPFNENTRY;
+
+typedef struct _MMPFN
{
union
{
+ PFN_NUMBER Flink;
+ ULONG WsIndex; // SavedSwapEntry
+ PKEVENT Event;
+ NTSTATUS ReadStatus;
+ SINGLE_LIST_ENTRY NextStackPfn;
+ } u1;
+ PMMPTE PteAddress;
+ union
+ {
+ PFN_NUMBER Blink;
+ ULONG_PTR ShareCount;
+ } u2;
+ union
+ {
+ struct
+ {
+ USHORT ReferenceCount; // ReferenceCount
+ MMPFNENTRY e1;
+ };
struct
{
- ULONG Type: 2;
- ULONG Consumer: 3;
- ULONG Zero: 1;
- ULONG StartOfAllocation: 1;
- ULONG EndOfAllocation: 1;
- }
- Flags;
- ULONG AllFlags;
+ USHORT ReferenceCount;
+ USHORT ShortFlags;
+ } e2;
+ } u3;
+ union
+ {
+ MMPTE OriginalPte;
+ LONG AweReferenceCount; // RmapListHead
};
-
- LIST_ENTRY ListEntry;
- ULONG ReferenceCount;
- SWAPENTRY SavedSwapEntry;
- ULONG LockCount;
- ULONG MapCount;
- struct _MM_RMAP_ENTRY* RmapListHead;
-}
-PHYSICAL_PAGE, *PPHYSICAL_PAGE;
+ union
+ {
+ ULONG_PTR EntireFrame;
+ struct
+ {
+ ULONG_PTR PteFrame:25;
+ ULONG_PTR InPageError:1;
+ ULONG_PTR VerifierAllocation:1;
+ ULONG_PTR AweAllocation:1;
+ ULONG_PTR Priority:3;
+ ULONG_PTR MustBeCached:1;
+ };
+ } u4;
+#if MI_TRACE_PFNS
+ MI_PFN_USAGES PfnUsage;
+ CHAR ProcessName[16];
+#endif
+} MMPFN, *PMMPFN;
-extern MM_STATS MmStats;
+extern PMMPFN MmPfnDatabase;
+
+typedef struct _MMPFNLIST
+{
+ PFN_NUMBER Total;
+ MMLISTS ListName;
+ PFN_NUMBER Flink;
+ PFN_NUMBER Blink;
+} MMPFNLIST, *PMMPFNLIST;
+
+extern MMPFNLIST MmZeroedPageListHead;
+extern MMPFNLIST MmFreePageListHead;
+extern MMPFNLIST MmStandbyPageListHead;
+extern MMPFNLIST MmModifiedPageListHead;
+extern MMPFNLIST MmModifiedNoWritePageListHead;
typedef struct _MM_PAGEOP
{
struct _MMFREE_POOL_ENTRY *Owner;
} MMFREE_POOL_ENTRY, *PMMFREE_POOL_ENTRY;
+/* Signature of a freed block */
+#define MM_FREE_POOL_SIGNATURE 'ARM3'
+
/* Paged pool information */
typedef struct _MM_PAGED_POOL_INFO
-{
+{
PRTL_BITMAP PagedPoolAllocationMap;
PRTL_BITMAP EndOfPagedPoolBitmap;
PMMPTE FirstPteForPagedPool;
typedef VOID
(*PMM_ALTER_REGION_FUNC)(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PVOID BaseAddress,
ULONG Length,
ULONG OldType,
PVOID Context,
PMEMORY_AREA MemoryArea,
PVOID Address,
- PFN_TYPE Page,
+ PFN_NUMBER Page,
SWAPENTRY SwapEntry,
BOOLEAN Dirty
);
-/* marea.c *******************************************************************/
-
+//
+// Mm copy support for Kd
+//
NTSTATUS
NTAPI
-MmInitMemoryAreas(VOID);
+MmDbgCopyMemory(
+ IN ULONG64 Address,
+ IN PVOID Buffer,
+ IN ULONG Size,
+ IN ULONG Flags
+);
+
+//
+// Determines if a given address is a session address
+//
+BOOLEAN
+NTAPI
+MmIsSessionAddress(
+ IN PVOID Address
+);
+
+/* marea.c *******************************************************************/
NTSTATUS
NTAPI
MmCreateMemoryArea(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
ULONG Type,
PVOID *BaseAddress,
ULONG_PTR Length,
PMEMORY_AREA
NTAPI
MmLocateMemoryAreaByAddress(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PVOID Address
);
ULONG_PTR
NTAPI
MmFindGapAtAddress(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PVOID Address
);
NTSTATUS
NTAPI
MmFreeMemoryArea(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PMEMORY_AREA MemoryArea,
PMM_FREE_PAGE_FUNC FreePage,
PVOID FreePageContext
NTSTATUS
NTAPI
MmFreeMemoryAreaByPtr(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PVOID BaseAddress,
PMM_FREE_PAGE_FUNC FreePage,
PVOID FreePageContext
VOID
NTAPI
-MmDumpMemoryAreas(PMM_AVL_TABLE AddressSpace);
+MmDumpMemoryAreas(PMMSUPPORT AddressSpace);
PMEMORY_AREA
NTAPI
MmLocateMemoryAreaByRegion(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PVOID Address,
ULONG_PTR Length
);
PVOID
NTAPI
MmFindGap(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
ULONG_PTR Length,
ULONG_PTR Granularity,
BOOLEAN TopDown
NTAPI
MmReleaseMemoryAreaIfDecommitted(
struct _EPROCESS *Process,
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PVOID BaseAddress
);
NTAPI
ExFreePagedPool(IN PVOID Block);
+BOOLEAN
+NTAPI
+ExpIsPoolTagDebuggable(ULONG Tag);
+
+PVOID
+NTAPI
+ExpAllocateDebugPool(
+ POOL_TYPE Type,
+ ULONG Size,
+ ULONG Tag,
+ PVOID Caller,
+ BOOLEAN EndOfPage
+);
+
+VOID
+NTAPI
+ExpFreeDebugPool(PVOID Block, BOOLEAN PagedPool);
+
VOID
NTAPI
MmInitializePagedPool(VOID);
NTAPI
MmBuildMdlFromPages(
PMDL Mdl,
- PULONG Pages
+ PPFN_NUMBER Pages
);
/* mminit.c ******************************************************************/
NTAPI
MmReadFromSwapPage(
SWAPENTRY SwapEntry,
- PFN_TYPE Page
+ PFN_NUMBER Page
);
BOOLEAN
NTAPI
MmWriteToSwapPage(
SWAPENTRY SwapEntry,
- PFN_TYPE Page
+ PFN_NUMBER Page
);
NTSTATUS
NTSTATUS
NTAPI
-MmCreatePeb(struct _EPROCESS *Process);
+MmCreatePeb(
+ IN PEPROCESS Process,
+ IN PINITIAL_PEB InitialPeb,
+ OUT PPEB *BasePeb
+);
-PTEB
+NTSTATUS
NTAPI
MmCreateTeb(
- struct _EPROCESS *Process,
- PCLIENT_ID ClientId,
- PINITIAL_TEB InitialTeb
+ IN PEPROCESS Process,
+ IN PCLIENT_ID ClientId,
+ IN PINITIAL_TEB InitialTeb,
+ OUT PTEB* BaseTeb
);
VOID
NTSTATUS
NTAPI
MmNotPresentFaultVirtualMemory(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
MEMORY_AREA* MemoryArea,
PVOID Address,
BOOLEAN Locked
NTSTATUS
NTAPI
MmPageOutVirtualMemory(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PMEMORY_AREA MemoryArea,
PVOID Address,
struct _MM_PAGEOP* PageOp
PMEMORY_AREA MemoryArea,
PVOID Address,
PMEMORY_BASIC_INFORMATION Info,
- PULONG ResultLength
+ PSIZE_T ResultLength
);
VOID
NTSTATUS
NTAPI
MmProtectAnonMem(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PMEMORY_AREA MemoryArea,
PVOID BaseAddress,
ULONG Length,
NTSTATUS
NTAPI
MmWritePageVirtualMemory(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PMEMORY_AREA MArea,
PVOID Address,
PMM_PAGEOP PageOp
PVOID
NTAPI
-ExAllocatePageWithPhysPage(PFN_TYPE Page);
+ExAllocatePageWithPhysPage(PFN_NUMBER Page);
NTSTATUS
NTAPI
MiCopyFromUserPage(
- PFN_TYPE Page,
+ PFN_NUMBER Page,
PVOID SourceAddress
);
NTSTATUS
NTAPI
-MiZeroPage(PFN_TYPE Page);
+MiZeroPage(PFN_NUMBER Page);
/* memsafe.s *****************************************************************/
NTAPI
MmReleasePageMemoryConsumer(
ULONG Consumer,
- PFN_TYPE Page
+ PFN_NUMBER Page
);
NTSTATUS
MmRequestPageMemoryConsumer(
ULONG Consumer,
BOOLEAN MyWait,
- PPFN_TYPE AllocatedPage
+ PPFN_NUMBER AllocatedPage
);
VOID
VOID
NTAPI
MmSetRmapListHeadPage(
- PFN_TYPE Page,
+ PFN_NUMBER Page,
struct _MM_RMAP_ENTRY* ListHead
);
struct _MM_RMAP_ENTRY*
NTAPI
-MmGetRmapListHeadPage(PFN_TYPE Page);
+MmGetRmapListHeadPage(PFN_NUMBER Page);
VOID
NTAPI
MmInsertRmap(
- PFN_TYPE Page,
+ PFN_NUMBER Page,
struct _EPROCESS *Process,
PVOID Address
);
VOID
NTAPI
MmDeleteAllRmaps(
- PFN_TYPE Page,
+ PFN_NUMBER Page,
PVOID Context,
VOID (*DeleteMapping)(PVOID Context, struct _EPROCESS *Process, PVOID Address)
);
VOID
NTAPI
MmDeleteRmap(
- PFN_TYPE Page,
+ PFN_NUMBER Page,
struct _EPROCESS *Process,
PVOID Address
);
VOID
NTAPI
-MmSetCleanAllRmaps(PFN_TYPE Page);
+MmSetCleanAllRmaps(PFN_NUMBER Page);
VOID
NTAPI
-MmSetDirtyAllRmaps(PFN_TYPE Page);
+MmSetDirtyAllRmaps(PFN_NUMBER Page);
BOOLEAN
NTAPI
-MmIsDirtyPageRmap(PFN_TYPE Page);
+MmIsDirtyPageRmap(PFN_NUMBER Page);
NTSTATUS
NTAPI
-MmWritePagePhysicalAddress(PFN_TYPE Page);
+MmWritePagePhysicalAddress(PFN_NUMBER Page);
NTSTATUS
NTAPI
-MmPageOutPhysicalAddress(PFN_TYPE Page);
+MmPageOutPhysicalAddress(PFN_NUMBER Page);
/* freelist.c **********************************************************/
-#define ASSERT_PFN(x) ASSERT((x)->Flags.Type != 0)
-
FORCEINLINE
-PPHYSICAL_PAGE
-MiGetPfnEntry(IN PFN_TYPE Pfn)
+PMMPFN
+MiGetPfnEntry(IN PFN_NUMBER Pfn)
{
- PPHYSICAL_PAGE Page;
- extern PPHYSICAL_PAGE MmPageArray;
- extern ULONG MmPageArraySize;
-
- /* Mark MmPageArraySize as unreferenced, otherwise it will appear as an unused variable on a Release build */
- UNREFERENCED_PARAMETER(MmPageArraySize);
+ PMMPFN Page;
+ extern RTL_BITMAP MiPfnBitMap;
/* Make sure the PFN number is valid */
- ASSERT(Pfn <= MmPageArraySize);
+ if (Pfn > MmHighestPhysicalPage) return NULL;
+
+ /* Make sure this page actually has a PFN entry */
+ if ((MiPfnBitMap.Buffer) && !(RtlTestBit(&MiPfnBitMap, Pfn))) return NULL;
/* Get the entry */
- Page = &MmPageArray[Pfn];
-
- /* Make sure it's valid */
- ASSERT_PFN(Page);
+ Page = &MmPfnDatabase[Pfn];
/* Return it */
return Page;
};
-PFN_TYPE
-NTAPI
-MmGetLRUNextUserPage(PFN_TYPE PreviousPage);
+FORCEINLINE
+PFN_NUMBER
+MiGetPfnEntryIndex(IN PMMPFN Pfn1)
+{
+ //
+ // This will return the Page Frame Number (PFN) from the MMPFN
+ //
+ return Pfn1 - MmPfnDatabase;
+}
-PFN_TYPE
+PFN_NUMBER
NTAPI
-MmGetLRUFirstUserPage(VOID);
+MmGetLRUNextUserPage(PFN_NUMBER PreviousPage);
-VOID
+PFN_NUMBER
NTAPI
-MmInsertLRULastUserPage(PFN_TYPE Page);
+MmGetLRUFirstUserPage(VOID);
VOID
NTAPI
-MmRemoveLRUUserPage(PFN_TYPE Page);
+MmInsertLRULastUserPage(PFN_NUMBER Page);
VOID
NTAPI
-MmLockPage(PFN_TYPE Page);
+MmRemoveLRUUserPage(PFN_NUMBER Page);
VOID
NTAPI
-MmLockPageUnsafe(PFN_TYPE Page);
+MmLockPage(PFN_NUMBER Page);
VOID
NTAPI
-MmUnlockPage(PFN_TYPE Page);
+MmUnlockPage(PFN_NUMBER Page);
ULONG
NTAPI
-MmGetLockCountPage(PFN_TYPE Page);
-
-FORCEINLINE
-KIRQL
-NTAPI
-MmAcquirePageListLock()
-{
- return KeAcquireQueuedSpinLock(LockQueuePfnLock);
-}
+MmGetLockCountPage(PFN_NUMBER Page);
-FORCEINLINE
VOID
NTAPI
-MmReleasePageListLock(KIRQL oldIrql)
-{
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
-}
+MmInitializePageList(
+ VOID
+);
VOID
NTAPI
-MmInitializePageList(
- VOID
+MmDumpArmPfnDatabase(
+ IN BOOLEAN StatusOnly
);
-PFN_TYPE
+PFN_NUMBER
NTAPI
MmGetContinuousPages(
ULONG NumberOfBytes,
PHYSICAL_ADDRESS LowestAcceptableAddress,
PHYSICAL_ADDRESS HighestAcceptableAddress,
- PHYSICAL_ADDRESS BoundaryAddressMultiple
+ PHYSICAL_ADDRESS BoundaryAddressMultiple,
+ BOOLEAN ZeroPages
);
-NTSTATUS
+VOID
NTAPI
-MmZeroPageThreadMain(
- PVOID Context
+MmZeroPageThread(
+ VOID
);
-/* i386/page.c *********************************************************/
+/* hypermap.c *****************************************************************/
+
+extern PEPROCESS HyperProcess;
+extern KIRQL HyperIrql;
PVOID
NTAPI
-MmCreateHyperspaceMapping(PFN_TYPE Page);
+MiMapPageInHyperSpace(IN PEPROCESS Process,
+ IN PFN_NUMBER Page,
+ IN PKIRQL OldIrql);
-PFN_TYPE
+VOID
NTAPI
-MmDeleteHyperspaceMapping(PVOID Address);
+MiUnmapPageInHyperSpace(IN PEPROCESS Process,
+ IN PVOID Address,
+ IN KIRQL OldIrql);
+
+PVOID
+NTAPI
+MiMapPagesToZeroInHyperSpace(IN PMMPFN Pfn1,
+ IN PFN_NUMBER NumberOfPages);
+
+VOID
+NTAPI
+MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress,
+ IN PFN_NUMBER NumberOfPages);
+
+//
+// ReactOS Compatibility Layer
+//
+FORCEINLINE
+PVOID
+MmCreateHyperspaceMapping(IN PFN_NUMBER Page)
+{
+ HyperProcess = (PEPROCESS)KeGetCurrentThread()->ApcState.Process;
+ return MiMapPageInHyperSpace(HyperProcess, Page, &HyperIrql);
+}
+
+#define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
+
+/* i386/page.c *********************************************************/
NTSTATUS
NTAPI
MmCreateVirtualMappingForKernel(
PVOID Address,
ULONG flProtect,
- PPFN_TYPE Pages,
+ PPFN_NUMBER Pages,
ULONG PageCount
);
struct _EPROCESS* Process,
PVOID Address,
ULONG flProtect,
- PPFN_TYPE Pages,
+ PPFN_NUMBER Pages,
ULONG PageCount
);
struct _EPROCESS* Process,
PVOID Address,
ULONG flProtect,
- PPFN_TYPE Pages,
+ PPFN_NUMBER Pages,
ULONG PageCount
);
struct _EPROCESS *Process,
PVOID Address,
BOOLEAN* WasDirty,
- PPFN_TYPE Page
+ PPFN_NUMBER Page
);
VOID
NTAPI
MmRawDeleteVirtualMapping(PVOID Address);
+
+VOID
+NTAPI
+MmGetPageFileMapping(
+ struct _EPROCESS *Process,
+ PVOID Address,
+ SWAPENTRY* SwapEntry);
+
VOID
NTAPI
MmDeletePageFileMapping(
VOID
NTAPI
MmTransferOwnershipPage(
- PFN_TYPE Page,
+ PFN_NUMBER Page,
ULONG NewConsumer
);
PVOID Address
);
-PFN_TYPE
+PFN_NUMBER
NTAPI
MmAllocPage(
- ULONG Consumer,
- SWAPENTRY SavedSwapEntry
+ ULONG Consumer
);
LONG
PHYSICAL_ADDRESS LowestAddress,
PHYSICAL_ADDRESS HighestAddress,
ULONG NumberOfPages,
- PPFN_TYPE Pages
+ PPFN_NUMBER Pages
);
VOID
NTAPI
-MmDereferencePage(PFN_TYPE Page);
-
-VOID
-NTAPI
-MmReferencePage(PFN_TYPE Page);
+MmDereferencePage(PFN_NUMBER Page);
VOID
NTAPI
-MmReferencePageUnsafe(PFN_TYPE Page);
+MmReferencePage(PFN_NUMBER Page);
ULONG
NTAPI
-MmGetReferenceCountPage(PFN_TYPE Page);
+MmGetReferenceCountPage(PFN_NUMBER Page);
BOOLEAN
NTAPI
-MmIsPageInUse(PFN_TYPE Page);
-
-VOID
-NTAPI
-MmSetFlagsPage(
- PFN_TYPE Page,
- ULONG Flags);
-
-ULONG
-NTAPI
-MmGetFlagsPage(PFN_TYPE Page);
+MmIsPageInUse(PFN_NUMBER Page);
VOID
NTAPI
MmSetSavedSwapEntryPage(
- PFN_TYPE Page,
+ PFN_NUMBER Page,
SWAPENTRY SavedSwapEntry);
SWAPENTRY
NTAPI
-MmGetSavedSwapEntryPage(PFN_TYPE Page);
+MmGetSavedSwapEntryPage(PFN_NUMBER Page);
VOID
NTAPI
PVOID Address
);
-PFN_TYPE
+PFN_NUMBER
NTAPI
MmGetPfnForProcess(
struct _EPROCESS *Process,
MmCreateProcessAddressSpace(
IN ULONG MinWs,
IN PEPROCESS Dest,
- IN PULONG DirectoryTableBase
+ IN PULONG_PTR DirectoryTableBase
);
NTSTATUS
NTAPI
MmInitializeHandBuiltProcess(
IN PEPROCESS Process,
- IN PULONG DirectoryTableBase
+ IN PULONG_PTR DirectoryTableBase
);
PVOID Address,
BOOLEAN FreePage,
BOOLEAN* WasDirty,
- PPFN_TYPE Page
+ PPFN_NUMBER Page
);
BOOLEAN
VOID
NTAPI
-MmMarkPageMapped(PFN_TYPE Page);
+MmMarkPageMapped(PFN_NUMBER Page);
VOID
NTAPI
-MmMarkPageUnmapped(PFN_TYPE Page);
+MmMarkPageUnmapped(PFN_NUMBER Page);
VOID
NTAPI
NTSTATUS
NTAPI
MmAlterRegion(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PVOID BaseAddress,
PLIST_ENTRY RegionListHead,
PVOID StartAddress,
PFILE_OBJECT
NTAPI
MmGetFileObjectForSection(
- IN PROS_SECTION_OBJECT Section
+ IN PVOID Section
);
NTSTATUS
NTAPI
NTSTATUS
NTAPI
MmGetFileNameForSection(
- IN PROS_SECTION_OBJECT Section,
+ IN PVOID Section,
OUT POBJECT_NAME_INFORMATION *ModuleName
);
PMEMORY_AREA MemoryArea,
PVOID Address,
PMEMORY_BASIC_INFORMATION Info,
- PULONG ResultLength
+ PSIZE_T ResultLength
);
NTSTATUS
NTAPI
MmProtectSectionView(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PMEMORY_AREA MemoryArea,
PVOID BaseAddress,
ULONG Length,
NTSTATUS
NTAPI
MmWritePageSectionView(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PMEMORY_AREA MArea,
PVOID Address,
PMM_PAGEOP PageOp
NTSTATUS
NTAPI
MmNotPresentFaultSectionView(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
MEMORY_AREA* MemoryArea,
PVOID Address,
BOOLEAN Locked
NTSTATUS
NTAPI
MmPageOutSectionView(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
PMEMORY_AREA MemoryArea,
PVOID Address,
struct _MM_PAGEOP *PageOp
NTSTATUS
NTAPI
MmAccessFaultSectionView(
- PMM_AVL_TABLE AddressSpace,
+ PMMSUPPORT AddressSpace,
MEMORY_AREA* MemoryArea,
PVOID Address,
BOOLEAN Locked
IN PVOID Address,
IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass,
OUT PVOID VirtualMemoryInformation,
- IN ULONG Length,
- OUT PULONG ResultLength
+ IN SIZE_T Length,
+ OUT PSIZE_T ResultLength
);
/* sysldr.c ******************************************************************/
IN PLIST_ENTRY ListHead
);
-/* ReactOS Mm Hacks */
-VOID
-FASTCALL
-MiSyncForProcessAttach(
- IN PKTHREAD NextThread,
- IN PEPROCESS Process
-);
-
-VOID
-FASTCALL
-MiSyncForContextSwitch(
- IN PKTHREAD Thread
-);
-
-extern PMM_AVL_TABLE MmKernelAddressSpace;
+extern PMMSUPPORT MmKernelAddressSpace;
FORCEINLINE
VOID
-MmLockAddressSpace(PMM_AVL_TABLE AddressSpace)
+MmLockAddressSpace(PMMSUPPORT AddressSpace)
{
- KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, VadRoot)->AddressCreationLock);
+ KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, Vm)->AddressCreationLock);
}
FORCEINLINE
VOID
-MmUnlockAddressSpace(PMM_AVL_TABLE AddressSpace)
+MmUnlockAddressSpace(PMMSUPPORT AddressSpace)
{
- KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, VadRoot)->AddressCreationLock);
+ KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, Vm)->AddressCreationLock);
}
FORCEINLINE
PEPROCESS
-MmGetAddressSpaceOwner(IN PMM_AVL_TABLE AddressSpace)
+MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace)
{
if (AddressSpace == MmKernelAddressSpace) return NULL;
- return CONTAINING_RECORD(AddressSpace, EPROCESS, VadRoot);
+ return CONTAINING_RECORD(AddressSpace, EPROCESS, Vm);
}
FORCEINLINE
-PMM_AVL_TABLE
+PMMSUPPORT
MmGetCurrentAddressSpace(VOID)
{
- return &((PEPROCESS)KeGetCurrentThread()->ApcState.Process)->VadRoot;
+ return &((PEPROCESS)KeGetCurrentThread()->ApcState.Process)->Vm;
}
FORCEINLINE
-PMM_AVL_TABLE
+PMMSUPPORT
MmGetKernelAddressSpace(VOID)
{
return MmKernelAddressSpace;
}
-
-#endif