ExfTryAcquirePushLockShared

UINT8 __stdcall ExfTryAcquirePushLockShared(_EX_PUSH_LOCK *PushLock){
  UINT8 v2; 
  unsigned __int64 bf_0; 
  __int64 v4; 
  __int64 v5; 
  unsigned __int64 v6; 

  v2 = 0;
  _m_prefetchw(PushLock);
  bf_0 = PushLock->_bf_0;
  while( 1 )
  {
    v4 = (bf_0 >> 1) & 1;
    if( (bf_0 & 1) != 0 && (v4 || (bf_0 & 0xFFFFFFFFFFFFFFF0ui64) == 0) )
      break;
    v5 = (bf_0 | 1) + 16;
    if( v4 )
      v5 = bf_0 | 1;
    v6 = bf_0;
    bf_0 = _InterlockedCompareExchange64(&PushLock->_bf_0, v5, bf_0);
    if( v6 == bf_0 )
      return 1;
  }
  return v2;
}

Referenced by:

ExAcquireCacheAwarePushLockSharedEx
ExTryAcquireAutoExpandPushLockShared
ExTryAcquireCacheAwarePushLockSharedEx
ExTryAcquirePushLockSharedEx
ExpTryAcquireFannedOutPushLockShared
IopProcessIoTracking
MiCoalesceFreePages
MiProcessTransitionHeatBatch
PfLockSharedTryAcquire
TryLockShutdownShared