https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4f6fd6c42b4fa712dad5cffc9522e801a38279c1
commit 4f6fd6c42b4fa712dad5cffc9522e801a38279c1 Author: Jérôme Gardou <jerome.gar...@reactos.org> AuthorDate: Mon Oct 26 17:49:16 2020 +0100 Commit: Jérôme Gardou <jerome.gar...@reactos.org> CommitDate: Wed Feb 3 09:41:21 2021 +0100 [NTOS/MM] Infer that the Memory Area is an image mapping from its VAD node --- ntoskrnl/mm/section.c | 57 +++++++++++---------------------------------------- 1 file changed, 12 insertions(+), 45 deletions(-) diff --git a/ntoskrnl/mm/section.c b/ntoskrnl/mm/section.c index f65c5c1ff64..04cba04d612 100644 --- a/ntoskrnl/mm/section.c +++ b/ntoskrnl/mm/section.c @@ -138,7 +138,7 @@ C_ASSERT(PEFMT_FIELDS_EQUAL(IMAGE_OPTIONAL_HEADER32, IMAGE_OPTIONAL_HEADER64, Si typedef struct { - PSECTION Section; + PMEMORY_AREA MemoryArea; PMM_SECTION_SEGMENT Segment; LARGE_INTEGER Offset; BOOLEAN WasDirty; @@ -899,7 +899,7 @@ MmSharePageEntrySectionSegment(PMM_SECTION_SEGMENT Segment, BOOLEAN NTAPI -MmUnsharePageEntrySectionSegment(PSECTION Section, +MmUnsharePageEntrySectionSegment(PMEMORY_AREA MemoryArea, PMM_SECTION_SEGMENT Segment, PLARGE_INTEGER Offset, BOOLEAN Dirty, @@ -939,7 +939,7 @@ MmUnsharePageEntrySectionSegment(PSECTION Section, LARGE_INTEGER FileOffset; FileOffset.QuadPart = Offset->QuadPart + Segment->Image.FileOffset; - IsImageSection = Section->u.Flags.Image; + IsImageSection = MemoryArea->VadNode.u.VadFlags.VadType == VadImageMap; #endif Page = PFN_FROM_SSE(Entry); @@ -1112,7 +1112,7 @@ MiReadPage(PMEMORY_AREA MemoryArea, SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap; RawLength = MemoryArea->SectionData.Segment->RawLength.QuadPart; FileOffset = SegOffset + MemoryArea->SectionData.Segment->Image.FileOffset; - IsImageSection = MemoryArea->SectionData.Section->u.Flags.Image; + IsImageSection = MemoryArea->VadNode.u.VadFlags.VadType == VadImageMap; ASSERT(SharedCacheMap); @@ -1631,7 +1631,7 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, MmCreatePageFileMapping(Process, PAddress, MM_WAIT_ENTRY); MmUnlockAddressSpace(AddressSpace); - if ((Offset.QuadPart >= (LONGLONG)PAGE_ROUND_UP(Segment->RawLength.QuadPart)) && Section->u.Flags.Image) + if ((Offset.QuadPart >= (LONGLONG)PAGE_ROUND_UP(Segment->RawLength.QuadPart)) && (MemoryArea->VadNode.u.VadFlags.VadType == VadImageMap)) { MI_SET_USAGE(MI_USAGE_SECTION); if (Process) MI_SET_PROCESS2(Process->ImageFileName); @@ -1812,7 +1812,6 @@ MmAccessFaultSectionView(PMMSUPPORT AddressSpace, PVOID Address) { PMM_SECTION_SEGMENT Segment; - PSECTION Section; PFN_NUMBER OldPage; PFN_NUMBER NewPage; NTSTATUS Status; @@ -1849,7 +1848,6 @@ MmAccessFaultSectionView(PMMSUPPORT AddressSpace, + MemoryArea->SectionData.ViewOffset.QuadPart; Segment = MemoryArea->SectionData.Segment; - Section = MemoryArea->SectionData.Section; Region = MmFindRegion((PVOID)MA_GetStartingAddress(MemoryArea), &MemoryArea->SectionData.RegionListHead, Address, NULL); @@ -1907,7 +1905,7 @@ MmAccessFaultSectionView(PMMSUPPORT AddressSpace, DPRINT("Swapping page (Old %x New %x)\n", OldPage, NewPage); MmDeleteVirtualMapping(Process, PAddress, NULL, NULL); MmDeleteRmap(OldPage, Process, PAddress); - MmUnsharePageEntrySectionSegment(Section, Segment, &Offset, FALSE, FALSE, NULL); + MmUnsharePageEntrySectionSegment(MemoryArea, Segment, &Offset, FALSE, FALSE, NULL); MmUnlockSectionSegment(Segment); /* @@ -1955,7 +1953,7 @@ MmPageOutDeleteMapping(PVOID Context, PEPROCESS Process, PVOID Address) if (!PageOutContext->Private) { MmLockSectionSegment(PageOutContext->Segment); - MmUnsharePageEntrySectionSegment(PageOutContext->Section, + MmUnsharePageEntrySectionSegment(PageOutContext->MemoryArea, PageOutContext->Segment, &PageOutContext->Offset, PageOutContext->WasDirty, @@ -2000,7 +1998,7 @@ MmPageOutSectionView(PMMSUPPORT AddressSpace, * Get the segment and section. */ Context.Segment = MemoryArea->SectionData.Segment; - Context.Section = MemoryArea->SectionData.Section; + Context.MemoryArea = MemoryArea; Context.SectionEntry = Entry; Context.CallingProcess = Process; @@ -2013,7 +2011,7 @@ MmPageOutSectionView(PMMSUPPORT AddressSpace, #ifndef NEWCC FileOffset = Context.Offset.QuadPart + Context.Segment->Image.FileOffset; - IsImageSection = Context.Section->u.Flags.Image; + IsImageSection = MemoryArea->VadNode.u.VadFlags.VadType == VadImageMap; FileObject = Context.Segment->FileObject; if (FileObject != NULL && @@ -2034,19 +2032,6 @@ MmPageOutSectionView(PMMSUPPORT AddressSpace, } #endif - - /* - * This should never happen since mappings of physical memory are never - * placed in the rmap lists. - */ - if (Context.Section->u.Flags.PhysicalMemory) - { - DPRINT1("Trying to page out from physical memory section address 0x%p " - "process %p\n", Address, - Process ? Process->UniqueProcessId : 0); - KeBugCheck(MEMORY_MANAGEMENT); - } - /* * Get the section segment entry and the physical address. */ @@ -2367,7 +2352,6 @@ MmWritePageSectionView(PMMSUPPORT AddressSpace, ULONG PageEntry) { LARGE_INTEGER Offset; - PSECTION Section; PMM_SECTION_SEGMENT Segment; PFN_NUMBER Page; SWAPENTRY SwapEntry; @@ -2391,8 +2375,7 @@ MmWritePageSectionView(PMMSUPPORT AddressSpace, * Get the segment and section. */ Segment = MemoryArea->SectionData.Segment; - Section = MemoryArea->SectionData.Section; - IsImageSection = Section->u.Flags.Image; + IsImageSection = MemoryArea->VadNode.u.VadFlags.VadType == VadImageMap; FileObject = Segment->FileObject; DirectMapped = FALSE; @@ -2415,18 +2398,6 @@ MmWritePageSectionView(PMMSUPPORT AddressSpace, } } - /* - * This should never happen since mappings of physical memory are never - * placed in the rmap lists. - */ - if (Section->u.Flags.PhysicalMemory) - { - DPRINT1("Trying to write back page from physical memory mapped at %p " - "process %p\n", Address, - Process ? Process->UniqueProcessId : 0); - KeBugCheck(MEMORY_MANAGEMENT); - } - /* * Get the section segment entry and the physical address. */ @@ -2557,7 +2528,6 @@ MmQuerySectionView(PMEMORY_AREA MemoryArea, { PMM_REGION Region; PVOID RegionBaseAddress; - PSECTION Section; PMM_SECTION_SEGMENT Segment; Region = MmFindRegion((PVOID)MA_GetStartingAddress(MemoryArea), @@ -2568,8 +2538,7 @@ MmQuerySectionView(PMEMORY_AREA MemoryArea, return STATUS_UNSUCCESSFUL; } - Section = MemoryArea->SectionData.Section; - if (Section->u.Flags.Image) + if (MemoryArea->VadNode.u.VadFlags.VadType == VadImageMap) { Segment = MemoryArea->SectionData.Segment; Info->AllocationBase = (PUCHAR)MA_GetStartingAddress(MemoryArea) - Segment->Image.VirtualAddress; @@ -3944,7 +3913,6 @@ MmFreeSectionPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address, #endif LARGE_INTEGER Offset; SWAPENTRY SavedSwapEntry; - PSECTION Section; PMM_SECTION_SEGMENT Segment; PMMSUPPORT AddressSpace; PEPROCESS Process; @@ -3957,7 +3925,6 @@ MmFreeSectionPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address, Offset.QuadPart = ((ULONG_PTR)Address - MA_GetStartingAddress(MemoryArea)) + MemoryArea->SectionData.ViewOffset.QuadPart; - Section = MemoryArea->SectionData.Section; Segment = MemoryArea->SectionData.Segment; Entry = MmGetPageEntrySectionSegment(Segment, &Offset); @@ -4017,7 +3984,7 @@ MmFreeSectionPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address, else { MmDeleteRmap(Page, Process, Address); - MmUnsharePageEntrySectionSegment(Section, Segment, &Offset, Dirty, FALSE, NULL); + MmUnsharePageEntrySectionSegment(MemoryArea, Segment, &Offset, Dirty, FALSE, NULL); } } }