[NTOS:MM] Do proper checks & acquire proper locks when sweeping user pages

CORE-17595
This commit is contained in:
Jérôme Gardou 2021-08-04 20:35:14 +02:00
parent 789d7a7741
commit 7c006df7e0

View file

@ -213,10 +213,14 @@ MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages)
MmLockAddressSpace(&Process->Vm); MmLockAddressSpace(&Process->Vm);
/* Be sure this is still valid. */ if (!Process->VmDeleted)
PMMPTE Pte = MiAddressToPte(Address);
if (Pte->u.Hard.Valid)
{ {
MiLockProcessWorkingSetUnsafe(Process, PsGetCurrentThread());
/* Be sure this is still valid. */
if (MmIsAddressValid(Address))
{
PMMPTE Pte = MiAddressToPte(Address);
Accessed = Accessed || Pte->u.Hard.Accessed; Accessed = Accessed || Pte->u.Hard.Accessed;
Pte->u.Hard.Accessed = 0; Pte->u.Hard.Accessed = 0;
@ -224,6 +228,9 @@ MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages)
//KeInvalidateTlbEntry(Address); //KeInvalidateTlbEntry(Address);
} }
MiUnlockProcessWorkingSet(Process, PsGetCurrentThread());
}
MmUnlockAddressSpace(&Process->Vm); MmUnlockAddressSpace(&Process->Vm);
KeUnstackDetachProcess(&ApcState); KeUnstackDetachProcess(&ApcState);