diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 9191d9dda0a..c478582e5c3 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -917,7 +917,6 @@ MiLockProcessWorkingSet(IN PEPROCESS Process, //ASSERT(Process->Vm.Flags.AcquiredUnsafe == 0); /* Okay, now we can own it exclusively */ - ASSERT(Thread->OwnsProcessWorkingSetExclusive == FALSE); Thread->OwnsProcessWorkingSetExclusive = TRUE; } diff --git a/reactos/ntoskrnl/mm/ARM3/virtual.c b/reactos/ntoskrnl/mm/ARM3/virtual.c index 28f74d639c6..2785093ae47 100644 --- a/reactos/ntoskrnl/mm/ARM3/virtual.c +++ b/reactos/ntoskrnl/mm/ARM3/virtual.c @@ -34,7 +34,8 @@ MiMakeSystemAddressValid(IN PVOID PageTableVirtualAddress, IN PEPROCESS CurrentProcess) { NTSTATUS Status; - BOOLEAN LockChange = FALSE; + BOOLEAN WsWasLocked = FALSE, LockChange = FALSE; + PETHREAD CurrentThread = PsGetCurrentThread(); /* Must be a non-pool page table, since those are double-mapped already */ ASSERT(PageTableVirtualAddress > MM_HIGHEST_USER_ADDRESS); @@ -47,6 +48,14 @@ MiMakeSystemAddressValid(IN PVOID PageTableVirtualAddress, /* Check if the page table is valid */ while (!MmIsAddressValid(PageTableVirtualAddress)) { + /* Check if the WS is locked */ + if (CurrentThread->OwnsProcessWorkingSetExclusive) + { + /* Unlock the working set and remember it was locked */ + MiUnlockProcessWorkingSet(CurrentProcess, CurrentThread); + WsWasLocked = TRUE; + } + /* Fault it in */ Status = MmAccessFault(FALSE, PageTableVirtualAddress, KernelMode, NULL); if (!NT_SUCCESS(Status)) @@ -59,6 +68,9 @@ MiMakeSystemAddressValid(IN PVOID PageTableVirtualAddress, (ULONG_PTR)PageTableVirtualAddress); } + /* Lock the working set again */ + if (WsWasLocked) MiLockProcessWorkingSet(CurrentProcess, CurrentThread); + /* This flag will be useful later when we do better locking */ LockChange = TRUE; }