RtlReleaseSwapReference

INT64 __fastcall RtlReleaseSwapReference(volatile INT64 *a1, UINT64 a2){
  __int64 v2; 
  __int64 v3; 
  _EX_PUSH_LOCK *v4; 
  unsigned __int64 Value; 
  __int64 v6; 
  INT64 result; 
  unsigned __int64 v8; 
  int v9[10]; 
  UINT64 v10; 
  v2 = 0i64;
  v3 = (unsigned int)a2;
  LODWORD(v10) = 0;
  v4 = (_EX_PUSH_LOCK *)a1;
  while( 1 )
  {
    _m_prefetchw(v4);
    Value = v4->Value;
    v6 = v4->Value & 1;
    if( v6 != v3 )
      break;
    if( !(Value >> 1) )
      __fastfail(0xEu);
    v8 = v4->Value;
    result = _InterlockedCompareExchange64((volatile signed __int64 *)v4, v6 | (2 * (Value >> 1) - 2), Value);
    if( v8 == result )
      return result;
    RtlBackoff(&v10);
  }
  result = _InterlockedExchangeAdd64((volatile signed __int64 *)&v4[1], 0xFFFFFFFFFFFFFFFFui64);
  if( result == 1 )
  {
    _InterlockedOr(v9, v2);
    if( v4[2].Value != v2 )
      ExpUnblockPushLock(v4 + 2, 0i64, 0i64);
  }
  return result;
}

Referenced by:

CmFcManagerNotifyFeatureUsage
RtlpFcBufferManagerDereferenceBuffers