diff --git a/ntoskrnl/mm/balance.c b/ntoskrnl/mm/balance.c index 0eec51fbb88..fe882aff6c4 100644 --- a/ntoskrnl/mm/balance.c +++ b/ntoskrnl/mm/balance.c @@ -213,15 +213,22 @@ MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages) MmLockAddressSpace(&Process->Vm); - /* Be sure this is still valid. */ - PMMPTE Pte = MiAddressToPte(Address); - if (Pte->u.Hard.Valid) + if (!Process->VmDeleted) { - Accessed = Accessed || Pte->u.Hard.Accessed; - Pte->u.Hard.Accessed = 0; + MiLockProcessWorkingSetUnsafe(Process, PsGetCurrentThread()); - /* There is no need to invalidate, the balancer thread is never on a user process */ - //KeInvalidateTlbEntry(Address); + /* Be sure this is still valid. */ + if (MmIsAddressValid(Address)) + { + PMMPTE Pte = MiAddressToPte(Address); + Accessed = Accessed || Pte->u.Hard.Accessed; + Pte->u.Hard.Accessed = 0; + + /* There is no need to invalidate, the balancer thread is never on a user process */ + //KeInvalidateTlbEntry(Address); + } + + MiUnlockProcessWorkingSet(Process, PsGetCurrentThread()); } MmUnlockAddressSpace(&Process->Vm);