From 40017a54f958093ee6a12cd73412aedbe44f0ea1 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 8 Apr 2018 18:58:15 +0200 Subject: [PATCH] [NTOSKRNL] Use interlocked operations when dealing with map count. CORE-14349 --- ntoskrnl/cc/view.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) 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); }