RtlpHpHeapAllocate

INT64 __fastcall RtlpHpHeapAllocate(__int64 a1, unsigned int a2, __int128 *a3){
  unsigned __int64 v4; 
  int v5; 
  __int16 v6; 
  __int128 v7; 
  __int128 v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  int v15; 
  int v16; 
  INT64 v17; 
  VOID *v19; 
  UINT64 v20; 
  UINT64 v21; 
  unsigned __int64 v22; 
  __int128 v23; 
  INT128 v24[4]; 
  INT128 a4[4]; 
  __int128 v26; 
  __int64 v27[2]; 
  __int64 v28[2]; 
  __int128 v29[4]; 
  INT64 v30; 
  unsigned __int64 v31; 

  v30 = 0i64;
  v4 = 4096i64;
  v5 = 0;
  v31 = 4096i64;
  v6 = 1;
  v7 = *a3;
  v8 = *a3;
  v9 = (unsigned __int64)(((unsigned int)RtlpHpLfhPerfFlags >> 10) & 1) << 6;
  v10 = 64i64;
  *(_OWORD *)v24 = *a3;
  if( a2 <= 0x40 )
    v10 = a2;
  v23 = v7;
  v11 = v9 + 9 * (v10 + 15) - (((_BYTE)v10 - 1) & 7);
  v12 = v11
      + (unsigned int)v10 * (v9 + 64)
      - (((_BYTE)v11 - 1) & 0x3F)
      + ((unsigned __int64)(((unsigned int)RtlpHpLfhPerfFlags >> 10) & 1) << 6);
  v13 = 129 * v12 + 10175 - ((129 * (_WORD)v12 + 10174) & 0xFFF) + 4095;
  v22 = v13;
  LODWORD(v14) = RtlpHpMetadataHeapCtxGet(v24);
  if( *(_QWORD *)v14 && (v15 & 0x40000000) == 0 && !BYTE2(v23) && v13 < *(unsigned int *)(*(_QWORD *)v14 + 464i64) )
  {
    *(_OWORD *)a4 = v8;
    v19 = RtlpHpMetadataAlloc((VOID *)v13, 0x1000ui64, 1i64);
    v17 = (INT64)v19;
    if( !v19 )
      return v17;
    v26 = *a3;
    RtlpHpMetadataCommit((UINT64)v19, (_DWORD)v19 + 4096, v13 - 4096, &v26, 0);
    goto LABEL_7;
  }
  v5 = BYTE1(v23) < 2u ? 0x1000000 : 0;
  *(_OWORD *)v27 = v8;
  v16 = (v15 & 0x40000000) != 0 ? 64 : 4;
  LODWORD(v20) = v16;
  if( RtlpHpAllocVA(&v30, (__int64 *)&v22, 0i64, v5 | 0x2000, v20, (__int64)v27) >= 0 )
  {
    LODWORD(v21) = v16;
    *(_OWORD *)v28 = *a3;
    if( RtlpHpAllocVA(&v30, (__int64 *)&v31, 0i64, v5 | 0x1000, v21, (__int64)v28) >= 0 )
    {
      v17 = v30;
      v6 = 0;
      v13 = v22;
      v4 = v31;
      v30 = 0i64;
LABEL_7:
      memset((VOID *)v17, 0i64, 0x800u);
      *(_QWORD *)(v17 + 232) = v17 + 2048;
      *(_QWORD *)(v17 + 240) = v17 + v4;
      *(_QWORD *)(v17 + 248) = v17 + v13;
      *(_WORD *)(v17 + 30) = v6 | *(_WORD *)(v17 + 30) & 0xFFFE;
      _InterlockedExchangeAdd64((volatile signed __int64 *)(v17 + 128), v13 >> 12);
      _InterlockedExchangeAdd64((volatile signed __int64 *)(v17 + 136), v31 >> 12);
      goto LABEL_8;
    }
  }
  v17 = 0i64;
LABEL_8:
  if( v30 )
  {
    v29[0] = *a3;
    RtlpHpFreeVA((UINT64 *)&v30, &v22, v5 | 0x8000u, v29);
  }
  return v17;
}

Referenced by:

RtlpHpHeapCreate