ExpTryAcquireFannedOutPushLockExclusive
UINT8 __stdcall ExpTryAcquireFannedOutPushLockExclusive(VOID *FannedOutPushLock){
UINT8 v2;
unsigned int v3;
unsigned int v4;
__int64 v5;
unsigned int v6;
unsigned int v7;
unsigned int v8;
unsigned int v10;
_EX_PUSH_LOCK *v11;
KeQueryMaximumProcessorCountEx(0xFFFFu);
v2 = 0;
v4 = v3;
LODWORD(v5) = 0;
if( !v3 )
return 1;
v6 = ((unsigned int)FannedOutPushLock >> 13) & 0x3FFFF;
v7 = ((unsigned __int64)FannedOutPushLock >> 4) & 0x1FF;
while( 1 )
{
_BitScanReverse(&v8, v6);
if( _interlockedbittestandset64(
(volatile signed __int32 *)(*(_QWORD *)(*(_QWORD *)(*(_QWORD *)(*(&WheapDeferredInternalLogsEventLock + 52)
+ 8i64 * (unsigned int)v5)
+ 8i64 * (v8 - 2))
+ 8i64 * (v6 ^ (1 << v8))
+ 8)
+ 8i64 * v7),
0i64) )
{
break;
}
LODWORD(v5) = v5 + 1;
if( (unsigned int)v5 >= v4 )
return 1;
}
while( (_DWORD)v5 )
{
_BitScanReverse(&v10, v6);
v5 = (unsigned int)(v5 - 1);
v11 = (_EX_PUSH_LOCK *)(*(_QWORD *)(*(_QWORD *)(*(_QWORD *)(*(&WheapDeferredInternalLogsEventLock + 52) + 8 * v5)
+ 8i64 * (v10 - 2))
+ 8i64 * (v6 ^ (1 << v10))
+ 8)
+ 8i64 * v7);
if( (_InterlockedExchangeAdd64(&v11->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v11);
}
return v2;
}Referenced by:
ExTryAcquireAutoExpandPushLockExclusive