RtlReleaseSwapReference

NTSTATUS __stdcall RtlReleaseSwapReference(
        _KINTERRUPT **InterruptObjectArray,
        UINT64 InterruptObjectCount,
        _INTERRUPT_VECTOR_DATA *VectorData){
  __int64 v3; 
  __int64 v4; 
  _EX_PUSH_LOCK *v5; 
  unsigned __int64 bf_0; 
  __int64 v7; 
  signed __int64 v8; 
  __int64 v9; 
  int v11[10]; 
  unsigned int v12; 

  v3 = 0i64;
  v4 = (unsigned int)InterruptObjectCount;
  v12 = 0;
  v5 = (_EX_PUSH_LOCK *)InterruptObjectArray;
  while( 1 )
  {
    _m_prefetchw(v5);
    bf_0 = v5->_bf_0;
    v7 = v5->_bf_0 & 1;
    if( v7 != v4 )
      break;
    if( !(bf_0 >> 1) )
      __fastfail(0xEu);
    v9 = v5->_bf_0;
    v8 = _InterlockedCompareExchange64(&v5->_bf_0, v7 | (2 * (bf_0 >> 1) - 2), bf_0);
    if( v9 == v8 )
      return v8;
    RtlBackoff(&v12);
  }
  v8 = _InterlockedExchangeAdd64(&v5[1]._bf_0, 0xFFFFFFFFFFFFFFFFui64);
  if( v8 == 1 )
  {
    _InterlockedOr(v11, v3);
    if( v5[2]._bf_0 != v3 )
      ExpUnblockPushLock(v5 + 2, 0i64, 0);
  }
  return v8;
}

Referenced by:

CmFcManagerNotifyFeatureUsage
RtlpFcBufferManagerDereferenceBuffers