ExfReleasePushLockExclusive

VOID __stdcall ExfReleasePushLockExclusive(_EX_PUSH_LOCK *PushLock){
  signed __int64 v1; 
  signed __int64 v2; 
  __int64 v3; 
  signed __int64 v4; 
  signed __int64 v5; 

  v1 = _InterlockedCompareExchange64(&PushLock->_bf_0, 0i64, 1i64);
  if( v1 != 1 )
  {
    do
    {
      v2 = v1 & 6;
      v3 = 3i64;
      if( v2 != 2 )
        v3 = -1i64;
      v4 = v1 + v3;
      v5 = v1;
      v1 = _InterlockedCompareExchange64(&PushLock->_bf_0, v4, v1);
    }
    while( v5 != v1 );
    if( v2 == 2 )
      ExpWakePushLock(PushLock, (_EX_PUSH_LOCK)v4);
  }
}

Referenced by:

ExfAcquireReleasePushLockExclusive
ExfReleasePushLock