ExReleaseAutoExpandPushLockShared

VOID __stdcall ExReleaseAutoExpandPushLockShared(VOID *LockHandle, UINT64 Flags){
  char v2; 
  unsigned __int64 v3; 
  unsigned int v4; 
  unsigned int v5; 
  unsigned int v6; 
  unsigned __int64 v7; 
  _EXP_AE_RELEASE_STATS Stats; 

  v2 = Flags;
  Stats.Cycles = 0i64;
  if( (Flags & 0xFFFFFFFC) != 0 || ((unsigned __int8)LockHandle & 2) != 0 && (Flags & 2) != 0 )
    KeBugCheckEx(0x152u, (PVOID)(unsigned int)Flags, LockHandle, 0i64, 0i64);
  v3 = (unsigned __int64)LockHandle & 0xFFFFFFFFFFFFFFFCui64;
  if( ((unsigned __int8)LockHandle & 1) != 0 )
  {
    _m_prefetchw((const void *)(v3 + 12));
    v4 = *(_DWORD *)(v3 + 12);
    if( v4 >= 0x80000000 && (*(_DWORD *)(v3 + 8) & 3) == 0 )
    {
      if( (unsigned __int16)v4 < (unsigned int)ExpAeCycleCountThreshold
        || (v4 & 0xF0000) >= 0xF0000
        || KeGetCurrentIrql() >= 2u )
      {
        v4 = (v4 >> 2) & 0x3FF33FFF;
        *(_DWORD *)(v3 + 12) = v4;
      }
      else
      {
        ExpTryExpandAutoExpandPushLock((_EX_PUSH_LOCK_AUTO_EXPAND *)((unsigned __int64)LockHandle & 0xFFFFFFFFFFFFFFFCui64));
      }
    }
    if( _InterlockedCompareExchange64((volatile signed __int64 *)v3, 0i64, 17i64) == 17 )
    {
LABEL_6:
      if( v4 < 0x80000000 )
        *(_DWORD *)(v3 + 12) = v4 + 0x100000;
      goto LABEL_8;
    }
    if( (v4 & ExpAeSamplingPeriodMask) == 0 )
    {
      ExfReleasePushLockSharedEx((_EX_PUSH_LOCK *)v3, &Stats);
      if( !Stats.Cycles )
        goto LABEL_8;
      v6 = *(_DWORD *)(v3 + 12);
      if( v6 >= 0x80000000 )
        goto LABEL_8;
      v7 = Stats.Cycles >> ExpAeCycleCountScaler;
      if( Stats.Cycles >> ExpAeCycleCountScaler > 0x1FF )
        LODWORD(v7) = 511;
      v4 = v7 + v6;
      goto LABEL_6;
    }
    ExfReleasePushLockSharedEx((_EX_PUSH_LOCK *)v3, 0i64);
    v5 = *(_DWORD *)(v3 + 12);
    if( v5 < 0x80000000 )
      *(_DWORD *)(v3 + 12) = v5 + 0x100000;
  }
  else
  {
    if( _InterlockedCompareExchange64((volatile signed __int64 *)v3, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((_EX_PUSH_LOCK *)((unsigned __int64)LockHandle & 0xFFFFFFFFFFFFFFFCui64));
    v3 = *(_QWORD *)(v3 + 8);
  }
LABEL_8:
  if( (v2 & 2) == 0 )
    KeAbPostRelease((VOID *)v3);
}

Referenced by:

MiUnlockAweVadsShared