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