[NTOS:MM] Keep a ref on the segment when mapping a page & keep trace of what is the highest offset mapped.

This commit is contained in:
Jérôme Gardou 2021-01-27 16:59:37 +01:00
parent 91a4e62376
commit c1c51e31e4
2 changed files with 22 additions and 4 deletions

View file

@ -218,14 +218,35 @@ _MmSetPageEntrySectionSegment(PMM_SECTION_SEGMENT Segment,
}
else
{
/* We're switching to a valid entry from an invalid one. Add the Rmap */
/*
* We're switching to a valid entry from an invalid one.
* Add the Rmap and take a ref on the segment.
*/
MmSetSectionAssociation(PFN_FROM_SSE(Entry), Segment, Offset);
InterlockedIncrement64(Segment->ReferenceCount);
if ((Offset->QuadPart > (Segment->LastPage << PAGE_SHIFT)) || !Segment->LastPage)
Segment->LastPage = (Offset->QuadPart >> PAGE_SHIFT) + 1;
}
}
else if (OldEntry && !IS_SWAP_FROM_SSE(OldEntry))
{
/* We're switching to an invalid entry from a valid one */
MmDeleteSectionAssociation(PFN_FROM_SSE(OldEntry));
MmDereferenceSegment(Segment);
if (Offset->QuadPart == ((Segment->LastPage - 1ULL) << PAGE_SHIFT))
{
/* We are unsetting the last page */
while (--Segment->LastPage)
{
LARGE_INTEGER CheckOffset;
CheckOffset.QuadPart = (Segment->LastPage - 1) << PAGE_SHIFT;
ULONG_PTR Entry = MmGetPageEntrySectionSegment(Segment, &CheckOffset);
if ((Entry != 0) && !IS_SWAP_FROM_SSE(Entry))
break;
}
}
}
PageTable->PageEntries[PageIndex] = Entry;

View file

@ -4113,9 +4113,6 @@ MmCanFileBeTruncated (IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
return Ret;
}
/*
* @implemented
*/