ExfReleasePushLockSharedEx

VOID __stdcall ExfReleasePushLockSharedEx(_EX_PUSH_LOCK *PushLock, _EXP_AE_RELEASE_STATS *Stats){
  __int64 bf_0; 
  signed __int64 v4; 
  __int64 v5; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  signed __int64 v9; 
  __int64 v10; 
  unsigned __int64 i; 
  __int64 v12; 
  __int128 v13; 
  _ETHREAD *CurrentThread; 

  CurrentThread = 0i64;
  v13 = 0i64;
  if( Stats )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    DWORD2(v13) = CurrentThread->Tcb.WaitBlock[0].SpareLong;
    Stats->Cycles = 0i64;
    *(_QWORD *)&v13 = __rdtsc();
  }
  _m_prefetchw(PushLock);
  bf_0 = PushLock->_bf_0;
  while( (bf_0 & 2) == 0 )
  {
    v4 = 0i64;
    if( (bf_0 & 0xFFFFFFFFFFFFFFF0ui64) != 16 )
      v4 = bf_0 - 16;
    v5 = bf_0;
    bf_0 = _InterlockedCompareExchange64(&PushLock->_bf_0, v4, bf_0);
    if( v5 == bf_0 )
    {
      if( Stats )
        ExpAeStopMeasurement((__int64)&v13, &Stats->Cycles);
      return;
    }
  }
  if( (bf_0 & 8) != 0 )
  {
    for( i = bf_0 & 0xFFFFFFFFFFFFFFF0ui64; ; i = *(_QWORD *)(i + 24) )
    {
      v12 = *(_QWORD *)(i + 32);
      if( v12 )
        break;
    }
    if( _InterlockedDecrement((volatile signed __int32 *)(v12 + 48)) > 0 )
      return;
    v6 = -9i64;
  }
  else
  {
    v6 = -1i64;
  }
  do
  {
    v7 = v6 + 4;
    v8 = bf_0 & 6;
    if( v8 != 2 )
      v7 = v6;
    v9 = bf_0 + v7;
    v10 = bf_0;
    bf_0 = _InterlockedCompareExchange64(&PushLock->_bf_0, v9, bf_0);
  }
  while( v10 != bf_0 );
  if( v8 == 2 )
    ExpWakePushLock(PushLock, (_EX_PUSH_LOCK)v9);
}

Referenced by:

ExReleaseAutoExpandPushLockShared