ExfReleasePushLockSharedEx
VOID __stdcall ExfReleasePushLockSharedEx(_EX_PUSH_LOCK *PushLock, _EXP_AE_RELEASE_STATS *Stats){
__int64 bf_0;
signed __int64 v4;
__int64 v5;
__int64 v6;
__int64 v7;
__int64 v8;
signed __int64 v9;
__int64 v10;
unsigned __int64 i;
__int64 v12;
__int128 v13;
_ETHREAD *CurrentThread;
CurrentThread = 0i64;
v13 = 0i64;
if( Stats )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
DWORD2(v13) = CurrentThread->Tcb.WaitBlock[0].SpareLong;
Stats->Cycles = 0i64;
*(_QWORD *)&v13 = __rdtsc();
}
_m_prefetchw(PushLock);
bf_0 = PushLock->_bf_0;
while( (bf_0 & 2) == 0 )
{
v4 = 0i64;
if( (bf_0 & 0xFFFFFFFFFFFFFFF0ui64) != 16 )
v4 = bf_0 - 16;
v5 = bf_0;
bf_0 = _InterlockedCompareExchange64(&PushLock->_bf_0, v4, bf_0);
if( v5 == bf_0 )
{
if( Stats )
ExpAeStopMeasurement((__int64)&v13, &Stats->Cycles);
return;
}
}
if( (bf_0 & 8) != 0 )
{
for( i = bf_0 & 0xFFFFFFFFFFFFFFF0ui64; ; i = *(_QWORD *)(i + 24) )
{
v12 = *(_QWORD *)(i + 32);
if( v12 )
break;
}
if( _InterlockedDecrement((volatile signed __int32 *)(v12 + 48)) > 0 )
return;
v6 = -9i64;
}
else
{
v6 = -1i64;
}
do
{
v7 = v6 + 4;
v8 = bf_0 & 6;
if( v8 != 2 )
v7 = v6;
v9 = bf_0 + v7;
v10 = bf_0;
bf_0 = _InterlockedCompareExchange64(&PushLock->_bf_0, v9, bf_0);
}
while( v10 != bf_0 );
if( v8 == 2 )
ExpWakePushLock(PushLock, (_EX_PUSH_LOCK)v9);
}Referenced by:
ExReleaseAutoExpandPushLockShared