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