[CMAKE]
[reactos.git] / ntoskrnl / mm / i386 / page.c
index 800e933..a7dbce4 100644 (file)
@@ -109,6 +109,43 @@ MmProtectToPteMask[32] =
     PTE_EXECUTE_WRITECOPY   | PTE_WRITECOMBINED_CACHE,
 };
 
+const
+ULONG MmProtectToValue[32] =
+{
+    PAGE_NOACCESS,
+    PAGE_READONLY,
+    PAGE_EXECUTE,
+    PAGE_EXECUTE_READ,
+    PAGE_READWRITE,
+    PAGE_WRITECOPY,
+    PAGE_EXECUTE_READWRITE,
+    PAGE_EXECUTE_WRITECOPY,
+    PAGE_NOACCESS,
+    PAGE_NOCACHE | PAGE_READONLY,
+    PAGE_NOCACHE | PAGE_EXECUTE,
+    PAGE_NOCACHE | PAGE_EXECUTE_READ,
+    PAGE_NOCACHE | PAGE_READWRITE,
+    PAGE_NOCACHE | PAGE_WRITECOPY,
+    PAGE_NOCACHE | PAGE_EXECUTE_READWRITE,
+    PAGE_NOCACHE | PAGE_EXECUTE_WRITECOPY,
+    PAGE_NOACCESS,
+    PAGE_GUARD | PAGE_READONLY,
+    PAGE_GUARD | PAGE_EXECUTE,
+    PAGE_GUARD | PAGE_EXECUTE_READ,
+    PAGE_GUARD | PAGE_READWRITE,
+    PAGE_GUARD | PAGE_WRITECOPY,
+    PAGE_GUARD | PAGE_EXECUTE_READWRITE,
+    PAGE_GUARD | PAGE_EXECUTE_WRITECOPY,
+    PAGE_NOACCESS,
+    PAGE_WRITECOMBINE | PAGE_READONLY,
+    PAGE_WRITECOMBINE | PAGE_EXECUTE,
+    PAGE_WRITECOMBINE | PAGE_EXECUTE_READ,
+    PAGE_WRITECOMBINE | PAGE_READWRITE,
+    PAGE_WRITECOMBINE | PAGE_WRITECOPY,
+    PAGE_WRITECOMBINE | PAGE_EXECUTE_READWRITE,
+    PAGE_WRITECOMBINE | PAGE_EXECUTE_WRITECOPY
+};
+
 /* FUNCTIONS ***************************************************************/
 
 BOOLEAN MmUnmapPageTable(PULONG Pt);
@@ -186,7 +223,10 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
                 MmDeleteHyperspaceMapping(PageDir);
                 return NULL;
             }
-            Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Pfn);
+            MI_SET_USAGE(MI_USAGE_LEGACY_PAGE_DIRECTORY);
+            if (Process) MI_SET_PROCESS2(Process->ImageFileName);
+            if (!Process) MI_SET_PROCESS2("Kernel Legacy");
+            Status = MmRequestPageMemoryConsumer(MC_SYSTEM, FALSE, &Pfn);
             if (!NT_SUCCESS(Status) || Pfn == 0)
             {
                 KeBugCheck(MEMORY_MANAGEMENT);
@@ -194,7 +234,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
             Entry = InterlockedCompareExchangePte(&PageDir[PdeOffset], PFN_TO_PTE(Pfn) | PA_PRESENT | PA_READWRITE | PA_USER, 0);
             if (Entry != 0)
             {
-                MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn);
+                MmReleasePageMemoryConsumer(MC_SYSTEM, Pfn);
                 Pfn = PTE_TO_PFN(Entry);
             }
         }
@@ -221,6 +261,9 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
                 {
                     return NULL;
                 }
+                MI_SET_USAGE(MI_USAGE_LEGACY_PAGE_DIRECTORY);
+                if (Process) MI_SET_PROCESS2(Process->ImageFileName);
+                if (!Process) MI_SET_PROCESS2("Kernel Legacy");
                 Status = MmRequestPageMemoryConsumer(MC_SYSTEM, FALSE, &Pfn);
                 if (!NT_SUCCESS(Status) || Pfn == 0)
                 {
@@ -243,7 +286,10 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
             {
                 return NULL;
             }
-            Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Pfn);
+            MI_SET_USAGE(MI_USAGE_LEGACY_PAGE_DIRECTORY);
+            if (Process) MI_SET_PROCESS2(Process->ImageFileName);
+            if (!Process) MI_SET_PROCESS2("Kernel Legacy");
+            Status = MmRequestPageMemoryConsumer(MC_SYSTEM, FALSE, &Pfn);
             if (!NT_SUCCESS(Status) || Pfn == 0)
             {
                 KeBugCheck(MEMORY_MANAGEMENT);
@@ -251,7 +297,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
             Entry = InterlockedCompareExchangePte(PageDir, PFN_TO_PTE(Pfn) | PA_PRESENT | PA_READWRITE | PA_USER, 0);
             if (Entry != 0)
             {
-                MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn);
+                MmReleasePageMemoryConsumer(MC_SYSTEM, Pfn);
             }
         }
     }
@@ -412,7 +458,7 @@ MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOLEAN FreePage,
     
     if (FreePage && WasValid)
     {
-        MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn);
+        MmReleasePageMemoryConsumer(MC_SYSTEM, Pfn);
     }
     
     /*
@@ -428,6 +474,18 @@ MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOLEAN FreePage,
     }
 }
 
+VOID
+NTAPI
+MmGetPageFileMapping(PEPROCESS Process, PVOID Address,
+                                        SWAPENTRY* SwapEntry)
+/*
+ * FUNCTION: Get a page file mapping
+ */
+{
+       ULONG Entry = MmGetPageEntryForProcess(Process, Address);
+       *SwapEntry = Entry >> 1;
+}
+
 VOID
 NTAPI
 MmDeletePageFileMapping(PEPROCESS Process, PVOID Address,
@@ -653,8 +711,6 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
     ULONG oldPdeOffset, PdeOffset;
     PULONG Pt = NULL;
     ULONG Pte;
-    BOOLEAN NoExecute = FALSE;
-    
     DPRINT("MmCreateVirtualMappingUnsafe(%x, %x, %x, %x (%x), %d)\n",
            Process, Address, flProtect, Pages, *Pages, PageCount);
     
@@ -689,10 +745,6 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
     }
     
     Attributes = ProtectToPTE(flProtect);
-    if (Attributes & 0x80000000)
-    {
-        NoExecute = TRUE;
-    }
     Attributes &= 0xfff;
     if (Address >= MmSystemRangeStart)
     {
@@ -826,7 +878,6 @@ NTAPI
 MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect)
 {
     ULONG Attributes = 0;
-    BOOLEAN NoExecute = FALSE;
     PULONG Pt;
     
     DPRINT("MmSetPageProtect(Process %x  Address %x  flProtect %x)\n",
@@ -834,10 +885,6 @@ MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect)
     
     Attributes = ProtectToPTE(flProtect);
 
-    if (Attributes & 0x80000000)
-    {
-        NoExecute = TRUE;
-    }
     Attributes &= 0xfff;
     if (Address >= MmSystemRangeStart)
     {
@@ -883,54 +930,6 @@ MmGetPhysicalAddress(PVOID vaddr)
     return p;
 }
 
-VOID
-NTAPI
-MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size)
-{
-    ULONG StartOffset, EndOffset, Offset;
-    PULONG Pde;
-    
-    //
-    // Check if the process isn't there anymore
-    // This is probably a bad sign, since it means the caller is setting cr3 to
-    // 0 or something...
-    //
-    if ((PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0]) == 0) && (Process != PsGetCurrentProcess()))
-    {
-        DPRINT1("Process: %16s is dead: %p\n", Process->ImageFileName, Process->Pcb.DirectoryTableBase[0]);
-        ASSERT(FALSE);
-        return;
-    }
-
-    if (Address < MmSystemRangeStart)
-    {
-        KeBugCheck(MEMORY_MANAGEMENT);
-    }
-
-    StartOffset = ADDR_TO_PDE_OFFSET(Address);
-    EndOffset = ADDR_TO_PDE_OFFSET((PVOID)((ULONG_PTR)Address + Size));
-
-    if (Process != NULL && Process != PsGetCurrentProcess())
-    {
-        Pde = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0]));
-    }
-    else
-    {
-        Pde = (PULONG)PAGEDIRECTORY_MAP;
-    }
-    for (Offset = StartOffset; Offset <= EndOffset; Offset++)
-    {
-        if (Offset != ADDR_TO_PDE_OFFSET(PAGETABLE_MAP))
-        {
-            InterlockedCompareExchangePte(&Pde[Offset], MmGlobalKernelPageDirectory[Offset], 0);
-        }
-    }
-    if (Pde != (PULONG)PAGEDIRECTORY_MAP)
-    {
-        MmDeleteHyperspaceMapping(Pde);
-    }
-}
-
 VOID
 INIT_FUNCTION
 NTAPI