WbGetHeapExecutedBlock
NTSTATUS __stdcall WbGetHeapExecutedBlock(UINT64 *a1, INT64 a2, INT64 **a3){
INT64 v5;
_ETHREAD *CurrentThread;
_BYTE *v8;
NTSTATUS v9;
INT64 *v10;
NTSTATUS v12;
__int64 v13;
INT64 v14;
__int64 v15;
v5 = (unsigned int)(*((_DWORD *)a1 + 3) - *((_DWORD *)a1 + 14));
v14 = 0i64;
v15 = 0i64;
WbReleaseLeastRecentlyUsedHeapExecutedBlocks((INT64)a1, v5);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
v8 = KeAbPreAcquire(a1 + 6, 0i64, 0i64);
if( _InterlockedCompareExchange64((volatile signed __int64 *)a1 + 6, 17i64, 0i64) )
ExfAcquirePushLockSharedEx((_EX_PUSH_LOCK *)a1 + 6, v8, a1 + 6);
if( v8 )
v8[26] |= 1u;
v9 = sub_14065E484((__int64)a1, *(_QWORD *)(a2 + 272), &v14, 0i64);
if( _InterlockedCompareExchange64((volatile signed __int64 *)a1 + 6, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)a1 + 6);
KeAbPostRelease(a1 + 6);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
if( v9 == -1073741198 )
{
v12 = WbCreateHeapExecutedBlock((INT64)a1, a2, &v14);
v10 = (INT64 *)v14;
v9 = v12;
if( v12 < 0 )
goto LABEL_11;
v9 = WbAddHeapExecutedBlockToCache((__int64)a1, v14, &v15);
if( v9 < 0 )
goto LABEL_11;
v13 = v15;
if( v15 )
{
sub_14065EF2C((_EX_PUSH_LOCK *)a1, (__int64)v10);
v10 = (INT64 *)v13;
v15 = 0i64;
}
}
else
{
v10 = (INT64 *)v14;
if( v9 < 0 )
goto LABEL_11;
}
WbMoveHeapExecutedBlockToBackOfLRU((INT64)a1, v10);
if( a3 )
{
*a3 = v10;
v10 = 0i64;
}
LABEL_11:
sub_14065EF2C((_EX_PUSH_LOCK *)a1, (__int64)v10);
sub_14065EF2C((_EX_PUSH_LOCK *)a1, v15);
return v9;
}Referenced by:
WbHeapExecuteCall