extern ULONG MmTotalNonPagedPoolQuota;
extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress;
extern ULONG MmNumberOfPhysicalPages;
+extern UCHAR MmDisablePagingExecutive;
+extern ULONG MmLowestPhysicalPage;
+extern ULONG MmHighestPhysicalPage;
+extern ULONG MmAvailablePages;
+extern ULONG MmResidentAvailablePages;
+extern ULONG MmNumberOfSystemPtes;
extern PVOID MmPagedPoolBase;
extern ULONG MmPagedPoolSize;
extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor;
extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg;
-extern ULONG MmHighestPhysicalPage;
+
+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 MI_STATIC_MEMORY_AREAS (8)
+//
+// 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_INVALID (0)
#define MEMORY_AREA_SECTION_VIEW (1)
#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)
#define MI_HYPERSPACE_PTES (256 - 1)
#define MI_ZERO_PTES (32)
-#define MI_MAPPING_RANGE_START (ULONG)HYPER_SPACE
+#define MI_MAPPING_RANGE_START (ULONG_PTR)HYPER_SPACE
#define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \
MI_HYPERSPACE_PTES * PAGE_SIZE)
#define MI_ZERO_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \
} Data;
} MEMORY_AREA, *PMEMORY_AREA;
-typedef struct
-{
- ULONG NrTotalPages;
- ULONG NrSystemPages;
- ULONG NrUserPages;
- ULONG NrFreePages;
- ULONG NrDirtyPages;
- ULONG NrLockedPages;
- ULONG PagingRequestsInLastMinute;
- ULONG PagingRequestsInLastFiveMinutes;
- ULONG PagingRequestsInLastFifteenMinutes;
-} MM_STATS;
-
//
// These two mappings are actually used by Windows itself, based on the ASSERTS
//
USHORT ShortFlags;
} e2;
} u3;
+#ifdef _WIN64
+ ULONG UsedPageTableEntries;
+#endif
union
{
MMPTE OriginalPte;
ULONG_PTR EntireFrame; // SavedSwapEntry
struct
{
- ULONG_PTR PteFrame:25;
+ ULONG_PTR PteFrame: 8*sizeof(PVOID)-7;
ULONG_PTR InPageError:1;
ULONG_PTR VerifierAllocation:1;
ULONG_PTR AweAllocation:1;
} MMPFN, *PMMPFN;
extern PMMPFN MmPfnDatabase;
-extern MM_STATS MmStats;
+
+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
{
PVOID Context,
PMEMORY_AREA MemoryArea,
PVOID Address,
- PFN_TYPE Page,
+ PFN_NUMBER Page,
SWAPENTRY SwapEntry,
BOOLEAN Dirty
);
+//
+// Mm copy support for Kd
+//
+NTSTATUS
+NTAPI
+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
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
PMEMORY_AREA MemoryArea,
PVOID Address,
PMEMORY_BASIC_INFORMATION Info,
- PULONG ResultLength
+ PSIZE_T ResultLength
);
VOID
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 **********************************************************/
FORCEINLINE
PMMPFN
-MiGetPfnEntry(IN PFN_TYPE Pfn)
+MiGetPfnEntry(IN PFN_NUMBER Pfn)
{
PMMPFN Page;
extern RTL_BITMAP MiPfnBitMap;
return Pfn1 - MmPfnDatabase;
}
-PFN_TYPE
+PFN_NUMBER
NTAPI
-MmGetLRUNextUserPage(PFN_TYPE PreviousPage);
+MmGetLRUNextUserPage(PFN_NUMBER PreviousPage);
-PFN_TYPE
+PFN_NUMBER
NTAPI
MmGetLRUFirstUserPage(VOID);
VOID
NTAPI
-MmInsertLRULastUserPage(PFN_TYPE Page);
+MmInsertLRULastUserPage(PFN_NUMBER Page);
VOID
NTAPI
-MmRemoveLRUUserPage(PFN_TYPE Page);
+MmRemoveLRUUserPage(PFN_NUMBER Page);
VOID
NTAPI
-MmLockPage(PFN_TYPE Page);
+MmLockPage(PFN_NUMBER Page);
VOID
NTAPI
-MmUnlockPage(PFN_TYPE Page);
+MmUnlockPage(PFN_NUMBER Page);
ULONG
NTAPI
-MmGetLockCountPage(PFN_TYPE Page);
+MmGetLockCountPage(PFN_NUMBER Page);
VOID
NTAPI
VOID
);
-PFN_TYPE
+PFN_NUMBER
NTAPI
MmGetContinuousPages(
ULONG NumberOfBytes,
PVOID
NTAPI
-MiMapPagesToZeroInHyperSpace(IN PMMPFN *Pages,
+MiMapPagesToZeroInHyperSpace(IN PFN_NUMBER *Pages,
IN PFN_NUMBER NumberOfPages);
VOID
PVOID
MiMapPageToZeroInHyperSpace(IN PFN_NUMBER Page)
{
- PMMPFN Pfn1 = MiGetPfnEntry(Page);
- return MiMapPagesToZeroInHyperSpace(&Pfn1, 1);
+ return MiMapPagesToZeroInHyperSpace(&Page, 1);
}
#define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
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
VOID
NTAPI
MmTransferOwnershipPage(
- PFN_TYPE Page,
+ PFN_NUMBER Page,
ULONG NewConsumer
);
PVOID Address
);
-PFN_TYPE
+PFN_NUMBER
NTAPI
MmAllocPage(
ULONG Consumer,
PHYSICAL_ADDRESS LowestAddress,
PHYSICAL_ADDRESS HighestAddress,
ULONG NumberOfPages,
- PPFN_TYPE Pages
+ PPFN_NUMBER Pages
);
VOID
NTAPI
-MmDereferencePage(PFN_TYPE Page);
+MmDereferencePage(PFN_NUMBER Page);
VOID
NTAPI
-MmReferencePage(PFN_TYPE Page);
+MmReferencePage(PFN_NUMBER Page);
ULONG
NTAPI
-MmGetReferenceCountPage(PFN_TYPE Page);
+MmGetReferenceCountPage(PFN_NUMBER Page);
BOOLEAN
NTAPI
-MmIsPageInUse(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
PMEMORY_AREA MemoryArea,
PVOID Address,
PMEMORY_BASIC_INFORMATION Info,
- PULONG ResultLength
+ PSIZE_T ResultLength
);
NTSTATUS
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 ******************************************************************/