WbReleaseLeastRecentlyUsedHeapExecutedBlocks
VOID __stdcall WbReleaseLeastRecentlyUsedHeapExecutedBlocks(INT64 a1, INT64 a2){
int v2;
_EX_PUSH_LOCK *v3;
_QWORD *v5;
_EX_PUSH_LOCK *v6;
_ETHREAD *CurrentThread;
_BYTE *v8;
_BYTE *v9;
_BYTE *v10;
_BYTE *v11;
_QWORD *v12;
__int64 v13;
__int64 v14;
char v15;
__int64 v16;
char v17;
__int64 v18;
if( (int)a2 > 0 )
{
v2 = a2;
v3 = (_EX_PUSH_LOCK *)(a1 + 80);
v5 = (_QWORD *)(a1 + 64);
v6 = (_EX_PUSH_LOCK *)(a1 + 48);
do
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--v2;
--CurrentThread->Tcb.SpecialApcDisable;
v8 = KeAbPreAcquire(v6, 0i64, 0i64);
v9 = v8;
if( _interlockedbittestandset64((volatile signed __int32 *)v6, 0i64) )
ExfAcquirePushLockExclusiveEx(v6, v8, v6);
if( v9 )
v9[26] |= 1u;
v10 = KeAbPreAcquire(v3, 0i64, 0i64);
v11 = v10;
if( _interlockedbittestandset64((volatile signed __int32 *)v3, 0i64) )
ExfAcquirePushLockExclusiveEx(v3, v10, v3);
if( v11 )
v11[26] |= 1u;
v12 = (_QWORD *)*v5;
if( (_QWORD *)*v5 == v5 )
{
v12 = 0i64;
}
else
{
if( (_QWORD *)v12[1] != v5 || (v13 = *v12, *(_QWORD **)(*v12 + 8i64) != v12) )
__fastfail(3u);
*v5 = v13;
*(_QWORD *)(v13 + 8) = v5;
}
v14 = 0i64;
if( v12 )
{
*((_DWORD *)v12 + 4) &= ~1u;
v14 = (__int64)v12;
}
v15 = _InterlockedExchangeAdd64(&v3->_bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v15 & 2) != 0 && (v15 & 4) == 0 )
ExfTryToWakePushLock(v3);
KeAbPostRelease(v3);
if( v14 )
{
v16 = *(_QWORD *)(v14 + 48);
v18 = 0i64;
if( (int)sub_14065D374(a1 + 8, v16, 8u, -1, &v18) >= 0 )
sub_14065EF2C((_EX_PUSH_LOCK *)a1, v18);
}
v17 = _InterlockedExchangeAdd64(&v6->_bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v17 & 2) != 0 && (v17 & 4) == 0 )
ExfTryToWakePushLock(v6);
KeAbPostRelease(v6);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
if( !v14 )
break;
sub_14065EF2C((_EX_PUSH_LOCK *)a1, v14);
}
while( v2 > 0 );
}
}Referenced by:
WbGetHeapExecutedBlock