ExpAcquireFastMutexContended

VOID __stdcall ExpAcquireFastMutexContended(FAST_MUTEX *Mutex, PVOID LockHandle){
  int v2; 
  int v5; 
  int Count; 
  int v7; 
  int v8; 
  void *v9; 
  ++Mutex->Contention;
  v2 = 1;
  v5 = 4;
LABEL_2:
  Count = Mutex->Count;
  do
  {
    while( (Count & 1) == 0 )
    {
      v8 = Count;
      Count = _InterlockedCompareExchange(&Mutex->Count, v5 + Count, Count);
      if( v8 == Count )
      {
        if( LockHandle )
          KeAbPreWait(LockHandle);
        KeWaitForSingleObject(&Mutex->Event, WrFastMutex, 0, 0, 0i64);
        _m_prefetchw(Mutex);
        v2 = 3;
        v5 = 2;
        if( LockHandle )
        {
          LODWORD(v9) = KeAbPreAcquire(Mutex, LockHandle, 0i64);
          LockHandle = v9;
        }
        goto LABEL_2;
      }
    }
    v7 = Count;
    Count = _InterlockedCompareExchange(&Mutex->Count, v2 ^ Count, Count);
  }
  while( v7 != Count );
}

Referenced by:

CcPinFileData
CcSetDirtyInMask
CcSetDirtyPinnedData
CcUnpinFileDataEx
CmpDereferenceKeyControlBlock
CmpPerformSingleKcbCacheLookup
ExAcquireFastMutex
ExAcquireFastMutexUnsafe
ExEnterCriticalRegionAndAcquireFastMutexUnsafe
FsRtlAcquireEofLock
FsRtlAcquireHeaderMutex
FsRtlCheckOplockEx2
FsRtlReleaseEofLock
KeAcquireGuardedMutex