WbGetHeapExecutedBlock
INT64 __fastcall WbGetHeapExecutedBlock(UINT64 *a1, INT64 rdx0, INT64 **r8_0){
INT64 v5;
_ETHREAD *CurrentThread;
_BYTE *v8;
_BYTE *v9;
int v10;
INT64 *v11;
int HeapExecutedBlock;
__int64 v14;
INT64 *a3;
__int64 a2;
v5 = (unsigned int)(*((_DWORD *)a1 + 3) - *((_DWORD *)a1 + 14));
a3 = 0i64;
a2 = 0i64;
WbReleaseLeastRecentlyUsedHeapExecutedBlocks((INT64)a1, v5);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
LODWORD(v8) = KeAbPreAcquire(a1 + 6, 0i64, 0i64);
v9 = v8;
if( _InterlockedCompareExchange64((volatile signed __int64 *)a1 + 6, 17i64, 0i64) )
ExfAcquirePushLockSharedEx(a1 + 6, v8, a1 + 6);
if( v9 )
v9[26] |= 1u;
v10 = sub_14065E484((INT64)a1, *(_QWORD *)(rdx0 + 272), &a3, 0i64);
if( _InterlockedCompareExchange64((volatile signed __int64 *)a1 + 6, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)a1 + 6);
KeAbPostRelease(a1 + 6);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
if( v10 == -1073741198 )
{
HeapExecutedBlock = WbCreateHeapExecutedBlock((INT64)a1, rdx0, (INT64 *)&a3);
v11 = a3;
v10 = HeapExecutedBlock;
if( HeapExecutedBlock < 0 )
goto LABEL_11;
v10 = WbAddHeapExecutedBlockToCache((INT64)a1, (INT64)a3, &a2);
if( v10 < 0 )
goto LABEL_11;
v14 = a2;
if( a2 )
{
sub_14065EF2C((__int64)a1, (__int64)v11);
v11 = (INT64 *)v14;
a2 = 0i64;
}
}
else
{
v11 = a3;
if( v10 < 0 )
goto LABEL_11;
}
WbMoveHeapExecutedBlockToBackOfLRU((INT64)a1, v11);
if( r8_0 )
{
*r8_0 = v11;
v11 = 0i64;
}
LABEL_11:
sub_14065EF2C((__int64)a1, (__int64)v11);
sub_14065EF2C((__int64)a1, a2);
return(unsigned int)v10;
}Referenced by:
WbHeapExecuteCall