[NTOSKRNL] Use interlocked operations for VACB reference counting.

CORE-14480
CORE-14285
This commit is contained in:
Pierre Schweitzer 2018-03-24 19:15:16 +01:00
parent dea9c291ab
commit 14b05e65ff
No known key found for this signature in database
GPG key ID: 7545556C3D585B0B
3 changed files with 60 additions and 23 deletions

View file

@ -220,7 +220,7 @@ typedef struct _ROS_VACB
/* Mutex */
KMUTEX Mutex;
/* Number of references. */
ULONG ReferenceCount;
volatile ULONG ReferenceCount;
/* How many times was it pinned? */
_Guarded_by_(Mutex)
LONG PinCount;
@ -523,20 +523,28 @@ IsPointInRange(
#if DBG
#define CcRosVacbIncRefCount(vacb) CcRosVacbIncRefCount_(vacb,__FILE__,__LINE__)
#define CcRosVacbDecRefCount(vacb) CcRosVacbDecRefCount_(vacb,__FILE__,__LINE__)
#define CcRosVacbGetRefCount(vacb) CcRosVacbGetRefCount_(vacb,__FILE__,__LINE__)
VOID
ULONG
CcRosVacbIncRefCount_(
PROS_VACB vacb,
PCSTR file,
INT line);
VOID
ULONG
CcRosVacbDecRefCount_(
PROS_VACB vacb,
PCSTR file,
INT line);
ULONG
CcRosVacbGetRefCount_(
PROS_VACB vacb,
PCSTR file,
INT line);
#else
#define CcRosVacbIncRefCount(vacb) (++((vacb)->ReferenceCount))
#define CcRosVacbDecRefCount(vacb) (--((vacb)->ReferenceCount))
#define CcRosVacbIncRefCount(vacb) InterlockedIncrement((PLONG)&(vacb)->ReferenceCount)
#define CcRosVacbDecRefCount(vacb) InterlockedDecrement((PLONG)&(vacb)->ReferenceCount)
#define CcRosVacbGetRefCount(vacb) InterlockedCompareExchange((PLONG)&(vacb)->ReferenceCount, 0, 0)
#endif