diff --git a/ntoskrnl/cc/view.c b/ntoskrnl/cc/view.c index 1ec4c35b1fa..cde1c2d6fa0 100644 --- a/ntoskrnl/cc/view.c +++ b/ntoskrnl/cc/view.c @@ -344,7 +344,7 @@ retry: CcRosVacbIncRefCount(current); /* Check if it's mapped and not dirty */ - if (current->MappedCount > 0 && !current->Dirty) + if (InterlockedCompareExchange((PLONG)¤t->MappedCount, 0, 0) > 0 && !current->Dirty) { /* We have to break these locks because Cc sucks */ KeReleaseSpinLock(¤t->SharedCacheMap->CacheMapLock, oldIrql); @@ -448,14 +448,13 @@ CcRosReleaseVacb ( if (Mapped) { - Vacb->MappedCount++; - } - Refs = CcRosVacbDecRefCount(Vacb); - if (Mapped && (Vacb->MappedCount == 1)) - { - CcRosVacbIncRefCount(Vacb); + if (InterlockedIncrement((PLONG)&Vacb->MappedCount) == 1) + { + CcRosVacbIncRefCount(Vacb); + } } + Refs = CcRosVacbDecRefCount(Vacb); ASSERT(Refs > 0); CcRosReleaseVacbLock(Vacb); @@ -630,9 +629,7 @@ CcRosUnmapVacb ( } ASSERT(Vacb->MappedCount != 0); - Vacb->MappedCount--; - - if (Vacb->MappedCount == 0) + if (InterlockedDecrement((PLONG)&Vacb->MappedCount) == 0) { CcRosVacbDecRefCount(Vacb); }