https://git.reactos.org/?p=reactos.git;a=commitdiff;h=8b98ff66eabba884a02993704b46174da1a0141a
commit 8b98ff66eabba884a02993704b46174da1a0141a Author: Jérôme Gardou <jerome.gar...@reactos.org> AuthorDate: Mon Oct 26 09:04:49 2020 +0100 Commit: Jérôme Gardou <jerome.gar...@reactos.org> CommitDate: Wed Feb 3 09:41:21 2021 +0100 [NTOSKRNL] Store File Object in the segment instead of Section object --- ntoskrnl/include/internal/mm.h | 6 ++++-- ntoskrnl/mm/ARM3/section.c | 9 ++++---- ntoskrnl/mm/section.c | 47 +++++++++++++++++++++++++++++------------- 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h index 760b514de4a..74cfcf7f11e 100644 --- a/ntoskrnl/include/internal/mm.h +++ b/ntoskrnl/include/internal/mm.h @@ -166,8 +166,9 @@ typedef ULONG_PTR SWAPENTRY; typedef struct _MM_SECTION_SEGMENT { + PFILE_OBJECT FileObject; + FAST_MUTEX Lock; /* lock which protects the page directory */ - PFILE_OBJECT FileObject; LARGE_INTEGER RawLength; /* length of the segment which is part of the mapped file */ LARGE_INTEGER Length; /* absolute length of the segment */ ULONG ReferenceCount; @@ -190,6 +191,8 @@ typedef struct _MM_SECTION_SEGMENT typedef struct _MM_IMAGE_SECTION_OBJECT { + PFILE_OBJECT FileObject; + SECTION_IMAGE_INFORMATION ImageInformation; PVOID BasedAddress; ULONG NrSegments; @@ -199,7 +202,6 @@ typedef struct _MM_IMAGE_SECTION_OBJECT typedef struct _ROS_SECTION_OBJECT { SECTION; - PFILE_OBJECT FileObject; } ROS_SECTION_OBJECT, *PROS_SECTION_OBJECT; #define MA_GetStartingAddress(_MemoryArea) ((_MemoryArea)->VadNode.StartingVpn << PAGE_SHIFT) diff --git a/ntoskrnl/mm/ARM3/section.c b/ntoskrnl/mm/ARM3/section.c index 81ecdc9f8dc..a91cfe2ed4a 100644 --- a/ntoskrnl/mm/ARM3/section.c +++ b/ntoskrnl/mm/ARM3/section.c @@ -1662,7 +1662,7 @@ MiGetFileObjectForSectionAddress( { /* Get the section pointer to the SECTION_OBJECT */ Section = MemoryArea->SectionData.Section; - *FileObject = Section->FileObject; + *FileObject = ((PMM_SECTION_SEGMENT)Section->Segment)->FileObject; } else { @@ -1705,7 +1705,7 @@ PFILE_OBJECT NTAPI MmGetFileObjectForSection(IN PVOID SectionObject) { - PSECTION Section; + PSECTION Section = SectionObject; ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); ASSERT(SectionObject != NULL); @@ -1713,12 +1713,11 @@ MmGetFileObjectForSection(IN PVOID SectionObject) if (MiIsRosSectionObject(SectionObject) == FALSE) { /* Return the file pointer stored in the control area */ - Section = SectionObject; return Section->Segment->ControlArea->FilePointer; } /* Return the file object */ - return ((PROS_SECTION_OBJECT)SectionObject)->FileObject; + return ((PMM_SECTION_SEGMENT)Section->Segment)->FileObject; } static @@ -1740,7 +1739,7 @@ MiGetFileObjectForVad( { /* Get the section pointer to the SECTION_OBJECT */ Section = MemoryArea->SectionData.Section; - FileObject = Section->FileObject; + FileObject = ((PMM_SECTION_SEGMENT)Section->Segment)->FileObject; } else { diff --git a/ntoskrnl/mm/section.c b/ntoskrnl/mm/section.c index 73711677d41..b975433e271 100644 --- a/ntoskrnl/mm/section.c +++ b/ntoskrnl/mm/section.c @@ -847,6 +847,7 @@ MmFreeSectionSegments(PFILE_OBJECT FileObject) } MmFreePageTablesSectionSegment(&SectionSegments[i], NULL); } + ObDereferenceObject(ImageSectionObject->FileObject); ExFreePool(ImageSectionObject->Segments); ExFreePool(ImageSectionObject); FileObject->SectionObjectPointer->ImageSectionObject = NULL; @@ -863,6 +864,7 @@ MmFreeSectionSegments(PFILE_OBJECT FileObject) DPRINT1("Data segment still referenced\n"); KeBugCheck(MEMORY_MANAGEMENT); } + ObDereferenceObject(Segment->FileObject); MmFreePageTablesSectionSegment(Segment, NULL); ExFreePool(Segment); FileObject->SectionObjectPointer->DataSectionObject = NULL; @@ -941,7 +943,7 @@ MmUnsharePageEntrySectionSegment(PROS_SECTION_OBJECT Section, #endif Page = PFN_FROM_SSE(Entry); - FileObject = Section->FileObject; + FileObject = Segment->FileObject; if (FileObject != NULL && !(Segment->Image.Characteristics & IMAGE_SCN_MEM_SHARED)) { @@ -1047,7 +1049,7 @@ BOOLEAN MiIsPageFromCache(PMEMORY_AREA MemoryArea, { PROS_SHARED_CACHE_MAP SharedCacheMap; PROS_VACB Vacb; - SharedCacheMap = MemoryArea->SectionData.Section->FileObject->SectionObjectPointer->SharedCacheMap; + SharedCacheMap = MemoryArea->SectionData.Segment->FileObject->SectionObjectPointer->SharedCacheMap; Vacb = CcRosLookupVacb(SharedCacheMap, SegOffset + MemoryArea->SectionData.Segment->Image.FileOffset); if (Vacb) { @@ -1106,7 +1108,7 @@ MiReadPage(PMEMORY_AREA MemoryArea, BOOLEAN IsImageSection; LONGLONG Length; - FileObject = MemoryArea->SectionData.Section->FileObject; + FileObject = MemoryArea->SectionData.Segment->FileObject; SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap; RawLength = MemoryArea->SectionData.Segment->RawLength.QuadPart; FileOffset = SegOffset + MemoryArea->SectionData.Segment->Image.FileOffset; @@ -2012,7 +2014,7 @@ MmPageOutSectionView(PMMSUPPORT AddressSpace, #ifndef NEWCC FileOffset = Context.Offset.QuadPart + Context.Segment->Image.FileOffset; IsImageSection = Context.Section->u.Flags.Image; - FileObject = Context.Section->FileObject; + FileObject = Context.Segment->FileObject; if (FileObject != NULL && !(Context.Segment->Image.Characteristics & IMAGE_SCN_MEM_SHARED)) @@ -2392,7 +2394,7 @@ MmWritePageSectionView(PMMSUPPORT AddressSpace, Section = MemoryArea->SectionData.Section; IsImageSection = Section->u.Flags.Image; - FileObject = Section->FileObject; + FileObject = Segment->FileObject; DirectMapped = FALSE; if (FileObject != NULL && !(Segment->Image.Characteristics & IMAGE_SCN_MEM_SHARED)) @@ -2709,13 +2711,16 @@ MmpDeleteSection(PVOID ObjectBody) (void)InterlockedDecrementUL(&((PMM_SECTION_SEGMENT)Section->Segment)->ReferenceCount); } - if (Section->FileObject != NULL) + + if (Section->Segment) { -#ifndef NEWCC - CcRosDereferenceCache(Section->FileObject); -#endif - ObDereferenceObject(Section->FileObject); - Section->FileObject = NULL; + PMM_SECTION_SEGMENT Segment = (PMM_SECTION_SEGMENT)Section->Segment; + if (Segment->FileObject != NULL) + { + #ifndef NEWCC + CcRosDereferenceCache(Segment->FileObject); + #endif + } } } @@ -2986,6 +2991,7 @@ MmCreateDataFileSection(PROS_SECTION_OBJECT *SectionObject, Section->Segment = (PSEGMENT)Segment; Segment->ReferenceCount = 1; ExInitializeFastMutex(&Segment->Lock); + Segment->FileObject = FileObject; /* * Set the lock before assigning the segment to the file object */ @@ -3029,9 +3035,12 @@ MmCreateDataFileSection(PROS_SECTION_OBJECT *SectionObject, Segment->RawLength.QuadPart = MaximumSize.QuadPart; Segment->Length.QuadPart = PAGE_ROUND_UP(Segment->RawLength.QuadPart); } + + /* We let the segment reference the file object */ + ObDereferenceObject(FileObject); + FileObject = Segment->FileObject; } MmUnlockSectionSegment(Segment); - Section->FileObject = FileObject; Section->SizeOfSection = MaximumSize; #ifndef NEWCC CcRosReferenceCache(FileObject); @@ -3663,8 +3672,11 @@ ExeFmtpCreateImageSection(PFILE_OBJECT FileObject, ExInitializeFastMutex(&ImageSectionObject->Segments[i].Lock); ImageSectionObject->Segments[i].ReferenceCount = 1; MiInitializeSectionPageTable(&ImageSectionObject->Segments[i]); + ImageSectionObject->Segments[i].FileObject = FileObject; } + ImageSectionObject->FileObject = FileObject; + ASSERT(NT_SUCCESS(Status)); return Status; } @@ -3795,6 +3807,10 @@ MmCreateImageSection(PROS_SECTION_OBJECT *SectionObject, { (void)InterlockedIncrementUL(&SectionSegments[i].ReferenceCount); } + + /* We let the Image Section Object hold the reference */ + ObDereferenceObject(FileObject); + FileObject = ImageSectionObject->FileObject; } Status = StatusExeFmt; @@ -3824,9 +3840,12 @@ MmCreateImageSection(PROS_SECTION_OBJECT *SectionObject, (void)InterlockedIncrementUL(&SectionSegments[i].ReferenceCount); } + /* We let the Image Section Object hold the reference */ + ObDereferenceObject(FileObject); + FileObject = ImageSectionObject->FileObject; + Status = STATUS_SUCCESS; } - Section->FileObject = FileObject; #ifndef NEWCC CcRosReferenceCache(FileObject); #endif @@ -3963,7 +3982,7 @@ MmFreeSectionPage(PVOID Context, MEMORY_AREA* MemoryArea, PVOID Address, if (Page == PFN_FROM_SSE(Entry) && Dirty) { #ifndef NEWCC - FileObject = MemoryArea->SectionData.Section->FileObject; + FileObject = MemoryArea->SectionData.Segment->FileObject; SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap; CcRosMarkDirtyFile(SharedCacheMap, Offset.QuadPart + Segment->Image.FileOffset); #endif