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