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