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