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