RtlpSizeHeapInternal

UINT64 __stdcall RtlpSizeHeapInternal(PVOID HeapHandle, PVOID BaseAddress){
  UINT64 v2; 
  UINT64 v3; 
  INT64 v5; 
  INT64 v6; 
  UINT8 *v8; 
  INT64 v9; 
  UINT8 v10; 
  int v11; 
  int v12; 
  unsigned __int16 v13; 
  int v15; 
  unsigned __int16 v16; 
  unsigned __int64 v17; 
  int v18; 
  unsigned __int16 v19; 
  __int64 v20; 
  __int64 v21; 
  int v22; 
  int v23; 
  int v24; 
  v3 = v2;
  if( *((_DWORD *)HeapHandle + 4) == -857879331 )
  {
    v6 = RtlpHpVsChunkSize((INT64)HeapHandle + 64, v2, v2, 0i64);
    if( v6 == -1 )
      RtlpLogHeapFailure(9i64, (INT64)HeapHandle, v3, v5, v5 & v20, v5 & v21);
    return v6;
  }
  if( (*((_DWORD *)HeapHandle + 30) & 1) != 0 )
  {
    v8 = RtlpProbeUserBufferSafe((INT64)HeapHandle, v2);
  }
  else
  {
    if( (v2 & 0xF) != 0 )
    {
      v9 = 9i64;
    }
    else
    {
      v8 = (UINT8 *)(v2 - 16);
      _m_prefetchw((const void *)(v2 - 16));
      if( *(_BYTE *)(v2 - 16 + 15) == 5 )
        v8 -= 16 * v8[14];
      if( (v8[15] & 0x3F) != 0 )
        goto LABEL_14;
      v2 = (UINT64)v8;
      v9 = 8i64;
    }
    RtlpLogHeapFailure(v9, (INT64)HeapHandle, v2, 0i64, 0i64, 0i64);
    v8 = 0i64;
  }
LABEL_14:
  if( !v8 )
    return -1i64;
  v10 = v8[15];
  v11 = *((_DWORD *)HeapHandle + 31);
  if( v10 == 4 )
  {
    if( v11 )
    {
      v12 = *((_DWORD *)v8 + 2);
      LOWORD(v22) = v12;
      if( (v12 & *((_DWORD *)HeapHandle + 31)) != 0 )
        v22 = *((_DWORD *)HeapHandle + 34) ^ v12;
      v13 = v22;
    }
    else
    {
      v13 = *((_WORD *)v8 + 4);
    }
    return *((_QWORD *)v8 - 2) - v13;
  }
  else
  {
    if( v11 )
    {
      v15 = *((_DWORD *)v8 + 2);
      v11 = *((_DWORD *)HeapHandle + 31);
      LOWORD(v23) = v15;
      if( (v11 & v15) != 0 )
        v23 = *((_DWORD *)HeapHandle + 34) ^ v15;
      v16 = v23;
      v10 = v8[15];
    }
    else
    {
      v16 = *((_WORD *)v8 + 4);
    }
    if( v10 == 5 )
    {
      v17 = *((unsigned __int16 *)v8 + 6) ^ (unsigned __int64)*((unsigned __int16 *)HeapHandle + 70);
    }
    else if( (v10 & 0x40) != 0 )
    {
      v17 = *(unsigned __int16 *)&v8[16 * (v10 & 0x3F) + 12];
    }
    else if( (v10 & 0x3F) == 63 )
    {
      if( v11 )
      {
        v18 = *((_DWORD *)v8 + 2);
        LOWORD(v24) = v18;
        if( (v18 & *((_DWORD *)HeapHandle + 31)) != 0 )
          v24 = *((_DWORD *)HeapHandle + 34) ^ v18;
        v19 = v24;
      }
      else
      {
        v19 = *((_WORD *)v8 + 4);
      }
      v17 = *(_QWORD *)&v8[16 * v19];
    }
    else
    {
      v17 = v10 & 0x3F;
    }
    return 16i64 * v16 - v17;
  }
}

Referenced by:

RtlSizeHeap