https://git.reactos.org/?p=reactos.git;a=commitdiff;h=819406ac975e8e770a3eec42de9d39608489ffab

commit 819406ac975e8e770a3eec42de9d39608489ffab
Author:     Jérôme Gardou <[email protected]>
AuthorDate: Fri Oct 23 12:56:08 2020 +0200
Commit:     Jérôme Gardou <[email protected]>
CommitDate: Wed Feb 3 09:41:21 2021 +0100

    [NTOSKRNL] Get rid of pagefile-backed sections support in legacy Mm
---
 ntoskrnl/include/internal/mm.h |   1 -
 ntoskrnl/mm/section.c          | 218 +++++++++++------------------------------
 2 files changed, 58 insertions(+), 161 deletions(-)

diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h
index 160c19a8a76..47bb43b2a30 100644
--- a/ntoskrnl/include/internal/mm.h
+++ b/ntoskrnl/include/internal/mm.h
@@ -87,7 +87,6 @@ typedef ULONG_PTR SWAPENTRY;
 
 #define SEC_PHYSICALMEMORY                  (0x80000000)
 
-#define MM_PAGEFILE_SEGMENT                 (0x1)
 #define MM_DATAFILE_SEGMENT                 (0x2)
 
 #define MC_CACHE                            (0)
diff --git a/ntoskrnl/mm/section.c b/ntoskrnl/mm/section.c
index 9704ddba8f6..aa76377aa9a 100644
--- a/ntoskrnl/mm/section.c
+++ b/ntoskrnl/mm/section.c
@@ -947,9 +947,7 @@ MmUnsharePageEntrySectionSegment(PROS_SECTION_OBJECT 
Section,
         SavedSwapEntry = MmGetSavedSwapEntryPage(Page);
         if (SavedSwapEntry == 0)
         {
-            if (!PageOut &&
-                    ((Segment->Flags & MM_PAGEFILE_SEGMENT) ||
-                     (Segment->Image.Characteristics & IMAGE_SCN_MEM_SHARED)))
+            if (!PageOut && (Segment->Image.Characteristics & 
IMAGE_SCN_MEM_SHARED))
             {
                 /*
                  * FIXME:
@@ -975,8 +973,7 @@ MmUnsharePageEntrySectionSegment(PROS_SECTION_OBJECT 
Section,
         }
         else
         {
-            if ((Segment->Flags & MM_PAGEFILE_SEGMENT) ||
-                    (Segment->Image.Characteristics & IMAGE_SCN_MEM_SHARED))
+            if (Segment->Image.Characteristics & IMAGE_SCN_MEM_SHARED)
             {
                 if (!PageOut)
                 {
@@ -1497,11 +1494,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace,
             /*
              * Sanity check
              */
-            if (Segment->Flags & MM_PAGEFILE_SEGMENT)
-            {
-                DPRINT1("Found a swaped out private page in a pagefile 
section.\n");
-                KeBugCheck(MEMORY_MANAGEMENT);
-            }
             MmDeletePageFileMapping(Process, Address, &SwapEntry);
         }
 
@@ -1614,9 +1606,8 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace,
         MmCreatePageFileMapping(Process, PAddress, MM_WAIT_ENTRY);
         MmUnlockAddressSpace(AddressSpace);
 
-        if ((Segment->Flags & MM_PAGEFILE_SEGMENT) ||
-                ((Offset.QuadPart >= 
(LONGLONG)PAGE_ROUND_UP(Segment->RawLength.QuadPart) &&
-                  (Section->AllocationAttributes & SEC_IMAGE))))
+        if ((Offset.QuadPart >= 
(LONGLONG)PAGE_ROUND_UP(Segment->RawLength.QuadPart)) &&
+                  (Section->AllocationAttributes & SEC_IMAGE))
         {
             MI_SET_USAGE(MI_USAGE_SECTION);
             if (Process) MI_SET_PROCESS2(Process->ImageFileName);
@@ -2102,8 +2093,7 @@ MmPageOutSectionView(PMMSUPPORT AddressSpace,
      */
     if (!Context.Private && Entry != 0)
     {
-        if (!(Context.Segment->Flags & MM_PAGEFILE_SEGMENT) &&
-                !(Context.Segment->Image.Characteristics & 
IMAGE_SCN_MEM_SHARED))
+        if (!(Context.Segment->Image.Characteristics & IMAGE_SCN_MEM_SHARED))
         {
             KeBugCheckEx(MEMORY_MANAGEMENT, Entry, (ULONG_PTR)Process, 
(ULONG_PTR)Address, 0);
         }
@@ -2117,26 +2107,7 @@ MmPageOutSectionView(PMMSUPPORT AddressSpace,
      * we can't free the page at this point.
      */
     SwapEntry = MmGetSavedSwapEntryPage(Page);
-    if (Context.Segment->Flags & MM_PAGEFILE_SEGMENT)
-    {
-        if (Context.Private)
-        {
-            DPRINT1("Found a %s private page (address %p) in a pagefile 
segment.\n",
-                    Context.WasDirty ? "dirty" : "clean", Address);
-            KeBugCheckEx(MEMORY_MANAGEMENT, SwapEntry, (ULONG_PTR)Process, 
(ULONG_PTR)Address, 0);
-        }
-        if (!Context.WasDirty && SwapEntry != 0)
-        {
-            MmSetSavedSwapEntryPage(Page, 0);
-            MmLockSectionSegment(Context.Segment);
-            MmSetPageEntrySectionSegment(Context.Segment, &Context.Offset, 
MAKE_SWAP_SSE(SwapEntry));
-            MmUnlockSectionSegment(Context.Segment);
-            MmReleasePageMemoryConsumer(MC_USER, Page);
-            MiSetPageEvent(NULL, NULL);
-            return(STATUS_SUCCESS);
-        }
-    }
-    else if (Context.Segment->Image.Characteristics & IMAGE_SCN_MEM_SHARED)
+    if (Context.Segment->Image.Characteristics & IMAGE_SCN_MEM_SHARED)
     {
         if (Context.Private)
         {
@@ -2321,8 +2292,7 @@ MmPageOutSectionView(PMMSUPPORT AddressSpace,
      */
     DPRINT("MM: Wrote section page 0x%.8X to swap!\n", Page << PAGE_SHIFT);
     MmSetSavedSwapEntryPage(Page, 0);
-    if (Context.Segment->Flags & MM_PAGEFILE_SEGMENT ||
-            Context.Segment->Image.Characteristics & IMAGE_SCN_MEM_SHARED)
+    if (Context.Segment->Image.Characteristics & IMAGE_SCN_MEM_SHARED)
     {
         MmLockSectionSegment(Context.Segment);
         MmSetPageEntrySectionSegment(Context.Segment, &Context.Offset, 
MAKE_SWAP_SSE(SwapEntry));
@@ -2715,17 +2685,7 @@ MmpDeleteSection(PVOID ObjectBody)
         if (Section->Segment == NULL)
             return;
 
-        if (Section->Segment->Flags & MM_PAGEFILE_SEGMENT)
-        {
-            MmpFreePageFileSegment(Section->Segment);
-            MmFreePageTablesSectionSegment(Section->Segment, NULL);
-            ExFreePool(Section->Segment);
-            Section->Segment = NULL;
-        }
-        else
-        {
-            (void)InterlockedDecrementUL(&Section->Segment->ReferenceCount);
-        }
+        (void)InterlockedDecrementUL(&Section->Segment->ReferenceCount);
     }
     if (Section->FileObject != NULL)
     {
@@ -2758,29 +2718,65 @@ MmCreatePhysicalMemorySection(VOID)
     UNICODE_STRING Name = RTL_CONSTANT_STRING(L"\\Device\\PhysicalMemory");
     LARGE_INTEGER SectionSize;
     HANDLE Handle;
+    PMM_SECTION_SEGMENT Segment;
 
     /*
      * Create the section mapping physical memory
      */
-    SectionSize.QuadPart = 0xFFFFFFFF;
+    SectionSize.QuadPart = ~((ULONG_PTR)0);
     InitializeObjectAttributes(&Obj,
                                &Name,
                                OBJ_PERMANENT | OBJ_KERNEL_EXCLUSIVE,
                                NULL,
                                NULL);
-    Status = MmCreateSection((PVOID)&PhysSection,
-                             SECTION_ALL_ACCESS,
-                             &Obj,
-                             &SectionSize,
-                             PAGE_EXECUTE_READWRITE,
-                             SEC_PHYSICALMEMORY,
-                             NULL,
-                             NULL);
+    /*
+     * Create the Object
+     */
+    Status = ObCreateObject(KernelMode,
+                            MmSectionObjectType,
+                            &Obj,
+                            ExGetPreviousMode(),
+                            NULL,
+                            sizeof(ROS_SECTION_OBJECT),
+                            0,
+                            0,
+                            (PVOID*)&PhysSection);
     if (!NT_SUCCESS(Status))
     {
-        DPRINT1("Failed to create PhysicalMemory section\n");
-        KeBugCheck(MEMORY_MANAGEMENT);
+        DPRINT1("MmCreatePhysicalMemorySection: failed to create object 
(0x%lx)\n", Status);
+        return(Status);
+    }
+
+    /*
+     * Initialize it
+     */
+    RtlZeroMemory(PhysSection, sizeof(ROS_SECTION_OBJECT));
+    PhysSection->Type = 'SC';
+    PhysSection->Size = 'TN';
+    PhysSection->InitialPageProtection = PAGE_EXECUTE_READWRITE;
+    PhysSection->AllocationAttributes = SEC_PHYSICALMEMORY;
+    PhysSection->SizeOfSection = SectionSize;
+    Segment = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_SECTION_SEGMENT),
+                                    TAG_MM_SECTION_SEGMENT);
+    if (Segment == NULL)
+    {
+        ObDereferenceObject(PhysSection);
+        return(STATUS_NO_MEMORY);
     }
+    RtlZeroMemory(Segment, sizeof(MM_SECTION_SEGMENT));
+    PhysSection->Segment = Segment;
+    Segment->ReferenceCount = 1;
+    ExInitializeFastMutex(&Segment->Lock);
+    Segment->Image.FileOffset = 0;
+    Segment->Protection = PAGE_EXECUTE_READWRITE;
+    Segment->RawLength = SectionSize;
+    Segment->Length = SectionSize;
+    Segment->Flags = 0;
+    Segment->WriteCopy = FALSE;
+    Segment->Image.VirtualAddress = 0;
+    Segment->Image.Characteristics = 0;
+    MiInitializeSectionPageTable(Segment);
+
     Status = ObInsertObject(PhysSection,
                             NULL,
                             SECTION_ALL_ACCESS,
@@ -2792,8 +2788,6 @@ MmCreatePhysicalMemorySection(VOID)
         ObDereferenceObject(PhysSection);
     }
     ObCloseHandle(Handle, KernelMode);
-    PhysSection->AllocationAttributes |= SEC_PHYSICALMEMORY;
-    PhysSection->Segment->Flags &= ~MM_PAGEFILE_SEGMENT;
 
     return(STATUS_SUCCESS);
 }
@@ -2831,81 +2825,6 @@ MmInitSectionImplementation(VOID)
     return(STATUS_SUCCESS);
 }
 
-NTSTATUS
-NTAPI
-MmCreatePageFileSection(PROS_SECTION_OBJECT *SectionObject,
-                        ACCESS_MASK DesiredAccess,
-                        POBJECT_ATTRIBUTES ObjectAttributes,
-                        PLARGE_INTEGER UMaximumSize,
-                        ULONG SectionPageProtection,
-                        ULONG AllocationAttributes)
-/*
- * Create a section which is backed by the pagefile
- */
-{
-    LARGE_INTEGER MaximumSize;
-    PROS_SECTION_OBJECT Section;
-    PMM_SECTION_SEGMENT Segment;
-    NTSTATUS Status;
-
-    if (UMaximumSize == NULL)
-    {
-        DPRINT1("MmCreatePageFileSection: (UMaximumSize == NULL)\n");
-        return(STATUS_INVALID_PARAMETER);
-    }
-    MaximumSize = *UMaximumSize;
-
-    /*
-     * Create the section
-     */
-    Status = ObCreateObject(ExGetPreviousMode(),
-                            MmSectionObjectType,
-                            ObjectAttributes,
-                            ExGetPreviousMode(),
-                            NULL,
-                            sizeof(ROS_SECTION_OBJECT),
-                            0,
-                            0,
-                            (PVOID*)(PVOID)&Section);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("MmCreatePageFileSection: failed to create object (0x%lx)\n", 
Status);
-        return(Status);
-    }
-
-    /*
-     * Initialize it
-     */
-    RtlZeroMemory(Section, sizeof(ROS_SECTION_OBJECT));
-    Section->Type = 'SC';
-    Section->Size = 'TN';
-    Section->InitialPageProtection = SectionPageProtection;
-    Section->AllocationAttributes = AllocationAttributes;
-    Section->SizeOfSection = MaximumSize;
-    Segment = ExAllocatePoolWithTag(NonPagedPool, sizeof(MM_SECTION_SEGMENT),
-                                    TAG_MM_SECTION_SEGMENT);
-    if (Segment == NULL)
-    {
-        ObDereferenceObject(Section);
-        return(STATUS_NO_MEMORY);
-    }
-    RtlZeroMemory(Segment, sizeof(MM_SECTION_SEGMENT));
-    Section->Segment = Segment;
-    Segment->ReferenceCount = 1;
-    ExInitializeFastMutex(&Segment->Lock);
-    Segment->Image.FileOffset = 0;
-    Segment->Protection = SectionPageProtection;
-    Segment->RawLength.QuadPart = MaximumSize.u.LowPart;
-    Segment->Length.QuadPart = PAGE_ROUND_UP(MaximumSize.u.LowPart);
-    Segment->Flags = MM_PAGEFILE_SEGMENT;
-    Segment->WriteCopy = FALSE;
-    Segment->Image.VirtualAddress = 0;
-    Segment->Image.Characteristics = 0;
-    *SectionObject = Section;
-    MiInitializeSectionPageTable(Segment);
-    return(STATUS_SUCCESS);
-}
-
 NTSTATUS
 NTAPI
 MmCreateDataFileSection(PROS_SECTION_OBJECT *SectionObject,
@@ -4026,11 +3945,6 @@ MmFreeSectionPage(PVOID Context, MEMORY_AREA* 
MemoryArea, PVOID Address,
         /*
          * Sanity check
          */
-        if (Segment->Flags & MM_PAGEFILE_SEGMENT)
-        {
-            DPRINT1("Found a swap entry for a page in a pagefile section.\n");
-            KeBugCheck(MEMORY_MANAGEMENT);
-        }
         MmFreeSwapPage(SwapEntry);
     }
     else if (Page != 0)
@@ -4038,14 +3952,6 @@ MmFreeSectionPage(PVOID Context, MEMORY_AREA* 
MemoryArea, PVOID Address,
         if (IS_SWAP_FROM_SSE(Entry) ||
                 Page != PFN_FROM_SSE(Entry))
         {
-            /*
-             * Sanity check
-             */
-            if (Segment->Flags & MM_PAGEFILE_SEGMENT)
-            {
-                DPRINT1("Found a private page in a pagefile section.\n");
-                KeBugCheck(MEMORY_MANAGEMENT);
-            }
             /*
              * Just dereference private pages
              */
@@ -5140,17 +5046,9 @@ MmCreateSection (OUT PVOID  * Section,
 #endif
     else
     {
-        if ((AllocationAttributes & SEC_PHYSICALMEMORY) == 0)
-        {
-            DPRINT1("Invalid path: %lx %p %p\n", AllocationAttributes, 
FileObject, FileHandle);
-        }
-//        ASSERT(AllocationAttributes & SEC_PHYSICALMEMORY);
-        Status = MmCreatePageFileSection(SectionObject,
-                                         DesiredAccess,
-                                         ObjectAttributes,
-                                         MaximumSize,
-                                         SectionPageProtection,
-                                         AllocationAttributes);
+        /* All cases should be handled above, and the Physical Memorw section 
was created at initialization phase */
+        ASSERT(FALSE);
+        Status = STATUS_INVALID_PARAMETER;
         if (FileObject)
             ObDereferenceObject(FileObject);
     }

Reply via email to