[NTOSKRNL]
authorCameron Gutman <aicommander@gmail.com>
Wed, 14 Dec 2011 17:53:15 +0000 (17:53 +0000)
committerCameron Gutman <aicommander@gmail.com>
Wed, 14 Dec 2011 17:53:15 +0000 (17:53 +0000)
- Don't page out locked pages
- Fixes random failed assertions in MmUnlockPages

svn path=/trunk/; revision=54648

reactos/ntoskrnl/mm/anonmem.c
reactos/ntoskrnl/mm/section.c

index 7dfdfa1..8c7be81 100644 (file)
@@ -74,6 +74,20 @@ MmPageOutVirtualMemory(PMMSUPPORT AddressSpace,
         MmReleasePageOp(PageOp);
         return(STATUS_UNSUCCESSFUL);
     }
+    
+    /*
+     * Check the reference count to ensure this page can be paged out
+     */
+    Page = MmGetPfnForProcess(Process, Address);
+    if (MmGetReferenceCountPage(Page) != 1)
+    {
+        DPRINT1("Cannot page out locked virtual memory page: 0x%p (RefCount: %d)\n",
+                Page, MmGetReferenceCountPage(Page));
+        PageOp->Status = STATUS_UNSUCCESSFUL;
+        KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE);
+        MmReleasePageOp(PageOp);
+        return(STATUS_UNSUCCESSFUL);
+    }
 
     /*
     * Disable the virtual mapping.
index 8c3aea9..596be8a 100644 (file)
@@ -2106,6 +2106,18 @@ MmPageOutSectionView(PMMSUPPORT AddressSpace,
    Page = MmGetPfnForProcess(Process, Address);
    SwapEntry = MmGetSavedSwapEntryPage(Page);
 
+   /*
+    * Check the reference count to ensure this page can be paged out
+    */
+   if (MmGetReferenceCountPage(Page) != 1)
+   {
+       DPRINT1("Cannot page out locked section page: 0x%p (RefCount: %d)\n",
+               Page, MmGetReferenceCountPage(Page));
+       PageOp->Status = STATUS_UNSUCCESSFUL;
+       MmspCompleteAndReleasePageOp(PageOp);
+       return STATUS_UNSUCCESSFUL;
+   }
+
    /*
     * Prepare the context structure for the rmap delete call.
     */