https://git.reactos.org/?p=reactos.git;a=commitdiff;h=819406ac975e8e770a3eec...
commit 819406ac975e8e770a3eec42de9d39608489ffab Author: Jérôme Gardou jerome.gardou@reactos.org AuthorDate: Fri Oct 23 12:56:08 2020 +0200 Commit: Jérôme Gardou jerome.gardou@reactos.org 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); }