Sync to trunk (r44371)
[reactos.git] / reactos / ntoskrnl / include / internal / mm.h
index b48aaa5..cc352e1 100644 (file)
@@ -14,22 +14,69 @@ extern ULONG MmTotalPagedPoolQuota;
 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)
@@ -45,6 +92,7 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE;
 #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)
@@ -63,7 +111,7 @@ typedef ULONG PFN_TYPE, *PPFN_TYPE;
 
 #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 + \
@@ -278,19 +326,6 @@ typedef struct _MEMORY_AREA
     } 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
 //
@@ -340,6 +375,9 @@ typedef struct _MMPFN
             USHORT ShortFlags;
         } e2;
     } u3;
+#ifdef _WIN64
+    ULONG UsedPageTableEntries;
+#endif
     union
     {
         MMPTE OriginalPte;
@@ -350,7 +388,7 @@ typedef struct _MMPFN
         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;
@@ -361,7 +399,20 @@ typedef struct _MMPFN
 } 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
 {
@@ -449,11 +500,32 @@ typedef VOID
     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
@@ -650,7 +722,7 @@ VOID
 NTAPI
 MmBuildMdlFromPages(
     PMDL Mdl,
-    PULONG Pages
+    PPFN_NUMBER Pages
 );
 
 /* mminit.c ******************************************************************/
@@ -700,7 +772,7 @@ NTSTATUS
 NTAPI
 MmReadFromSwapPage(
     SWAPENTRY SwapEntry,
-    PFN_TYPE Page
+    PFN_NUMBER Page
 );
 
 BOOLEAN
@@ -711,7 +783,7 @@ NTSTATUS
 NTAPI
 MmWriteToSwapPage(
     SWAPENTRY SwapEntry,
-    PFN_TYPE Page
+    PFN_NUMBER Page
 );
 
 NTSTATUS
@@ -747,14 +819,19 @@ MmInitializeProcessAddressSpace(
 
 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
@@ -832,7 +909,7 @@ MmQueryAnonMem(
     PMEMORY_AREA MemoryArea,
     PVOID Address,
     PMEMORY_BASIC_INFORMATION Info,
-    PULONG ResultLength
+    PSIZE_T ResultLength
 );
 
 VOID
@@ -874,18 +951,18 @@ ExUnmapPage(PVOID Addr);
 
 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 *****************************************************************/
 
@@ -956,7 +1033,7 @@ NTSTATUS
 NTAPI
 MmReleasePageMemoryConsumer(
     ULONG Consumer,
-    PFN_TYPE Page
+    PFN_NUMBER Page
 );
 
 NTSTATUS
@@ -964,7 +1041,7 @@ NTAPI
 MmRequestPageMemoryConsumer(
     ULONG Consumer,
     BOOLEAN MyWait,
-    PPFN_TYPE AllocatedPage
+    PPFN_NUMBER AllocatedPage
 );
 
 VOID
@@ -980,18 +1057,18 @@ MmRebalanceMemoryConsumers(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
 );
@@ -999,7 +1076,7 @@ MmInsertRmap(
 VOID
 NTAPI
 MmDeleteAllRmaps(
-    PFN_TYPE Page,
+    PFN_NUMBER Page,
     PVOID Context,
     VOID (*DeleteMapping)(PVOID Context, struct _EPROCESS *Process, PVOID Address)
 );
@@ -1007,7 +1084,7 @@ MmDeleteAllRmaps(
 VOID
 NTAPI
 MmDeleteRmap(
-    PFN_TYPE Page,
+    PFN_NUMBER Page,
     struct _EPROCESS *Process,
     PVOID Address
 );
@@ -1018,23 +1095,23 @@ MmInitializeRmapList(VOID);
 
 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 **********************************************************/
 
@@ -1042,7 +1119,7 @@ MmPageOutPhysicalAddress(PFN_TYPE Page);
 
 FORCEINLINE
 PMMPFN
-MiGetPfnEntry(IN PFN_TYPE Pfn)
+MiGetPfnEntry(IN PFN_NUMBER Pfn)
 {
     PMMPFN Page;
     extern RTL_BITMAP MiPfnBitMap;
@@ -1073,33 +1150,33 @@ MiGetPfnEntryIndex(IN PMMPFN Pfn1)
     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
@@ -1113,7 +1190,7 @@ MmDumpPfnDatabase(
    VOID
 );
 
-PFN_TYPE
+PFN_NUMBER
 NTAPI
 MmGetContinuousPages(
     ULONG NumberOfBytes,
@@ -1148,7 +1225,7 @@ MiUnmapPageInHyperSpace(IN PEPROCESS Process,
 
 PVOID
 NTAPI
-MiMapPagesToZeroInHyperSpace(IN PMMPFN *Pages,
+MiMapPagesToZeroInHyperSpace(IN PFN_NUMBER *Pages,
                              IN PFN_NUMBER NumberOfPages);
 
 VOID
@@ -1171,8 +1248,7 @@ FORCEINLINE
 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);
@@ -1184,7 +1260,7 @@ NTAPI
 MmCreateVirtualMappingForKernel(
     PVOID Address,
     ULONG flProtect,
-    PPFN_TYPE Pages,
+    PPFN_NUMBER Pages,
     ULONG PageCount
 );
 
@@ -1201,7 +1277,7 @@ MmCreateVirtualMapping(
     struct _EPROCESS* Process,
     PVOID Address,
     ULONG flProtect,
-    PPFN_TYPE Pages,
+    PPFN_NUMBER Pages,
     ULONG PageCount
 );
 
@@ -1211,7 +1287,7 @@ MmCreateVirtualMappingUnsafe(
     struct _EPROCESS* Process,
     PVOID Address,
     ULONG flProtect,
-    PPFN_TYPE Pages,
+    PPFN_NUMBER Pages,
     ULONG PageCount
 );
 
@@ -1246,7 +1322,7 @@ MmDisableVirtualMapping(
     struct _EPROCESS *Process,
     PVOID Address,
     BOOLEAN* WasDirty,
-    PPFN_TYPE Page
+    PPFN_NUMBER Page
 );
 
 VOID
@@ -1286,7 +1362,7 @@ MmIsPageSwapEntry(
 VOID
 NTAPI
 MmTransferOwnershipPage(
-    PFN_TYPE Page,
+    PFN_NUMBER Page,
     ULONG NewConsumer
 );
 
@@ -1297,7 +1373,7 @@ MmSetDirtyPage(
     PVOID Address
 );
 
-PFN_TYPE
+PFN_NUMBER
 NTAPI
 MmAllocPage(
     ULONG Consumer,
@@ -1311,34 +1387,34 @@ MmAllocPagesSpecifyRange(
     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
@@ -1358,7 +1434,7 @@ MmDeletePageTable(
     PVOID Address
 );
 
-PFN_TYPE
+PFN_NUMBER
 NTAPI
 MmGetPfnForProcess(
     struct _EPROCESS *Process,
@@ -1370,14 +1446,14 @@ NTAPI
 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
 );
 
 
@@ -1402,7 +1478,7 @@ MmDeleteVirtualMapping(
     PVOID Address,
     BOOLEAN FreePage,
     BOOLEAN* WasDirty,
-    PPFN_TYPE Page
+    PPFN_NUMBER Page
 );
 
 BOOLEAN
@@ -1414,11 +1490,11 @@ MmIsDirtyPage(
 
 VOID
 NTAPI
-MmMarkPageMapped(PFN_TYPE Page);
+MmMarkPageMapped(PFN_NUMBER Page);
 
 VOID
 NTAPI
-MmMarkPageUnmapped(PFN_TYPE Page);
+MmMarkPageUnmapped(PFN_NUMBER Page);
 
 VOID
 NTAPI
@@ -1512,7 +1588,7 @@ MmQuerySectionView(
     PMEMORY_AREA MemoryArea,
     PVOID Address,
     PMEMORY_BASIC_INFORMATION Info,
-    PULONG ResultLength
+    PSIZE_T ResultLength
 );
 
 NTSTATUS
@@ -1605,8 +1681,8 @@ MiQueryVirtualMemory(
     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 ******************************************************************/