diff --git "a/ntoskrnl/cc/view.c" "b/ntoskrnl/cc/view.c" index efa4c8523d4..02d170c4f76 100644 --- "a/ntoskrnl/cc/view.c" +++ "b/ntoskrnl/cc/view.c" @@ -497,6 +497,10 @@ retry: /* Check if it's mapped and not dirty */ if (InterlockedCompareExchange((PLONG)¤t->MappedCount, 0, 0) > 0 && !current->Dirty) { + /* We have to break these locks to call MmPageOutPhysicalAddress */ + KeReleaseSpinLockFromDpcLevel(¤t->SharedCacheMap->CacheMapLock); + KeReleaseQueuedSpinLock(LockQueueMasterLock, oldIrql); + /* Page out the VACB */ for (i = 0; i < VACB_MAPPING_GRANULARITY / PAGE_SIZE; i++) { @@ -504,6 +508,10 @@ retry: MmPageOutPhysicalAddress(Page); } + + /* Reacquire the locks */ + oldIrql = KeAcquireQueuedSpinLock(LockQueueMasterLock); + KeAcquireSpinLockAtDpcLevel(¤t->SharedCacheMap->CacheMapLock); } /* Dereference the VACB */