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