RtlpHpHeapAllocate

INT64 __fastcall RtlpHpHeapAllocate(__int64 a1, unsigned int a2, __int128 *a3){
  size_t v4; 
  unsigned int v5; 
  __int16 v6; 
  __int128 v7; 
  __int128 v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 Value; 
  int v15; 
  INT64 v16; 
  int v17; 
  INT64 v18; 
  void *v20; 
  UINT64 a5; 
  UINT64 a5a; 
  size_t a2a; 
  __int128 v24; 
  __int128 a1a; 
  __int128 a4; 
  __int128 v27; 
  INT64 a6[2]; 
  INT64 v29[2]; 
  __int128 v30[4]; 
  INT64 result; 
  size_t v32; 
  result = 0i64;
  v4 = 4096i64;
  v5 = 0;
  v32 = 4096i64;
  v6 = 1;
  v7 = *a3;
  v8 = *a3;
  v9 = (unsigned __int64)(((unsigned int)RtlpHpLfhPerfFlags >> 10) & 1) << 6;
  v10 = 64i64;
  a1a = *a3;
  if( a2 <= 0x40 )
    v10 = a2;
  v24 = 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;
  a2a = v13;
  Value = RtlpHpMetadataHeapCtxGet(&a1a)->Value;
  if( Value && (v15 & 0x40000000) == 0 && !BYTE2(v24) && v13 < *(unsigned int *)(Value + 464) )
  {
    a4 = v8;
    v20 = RtlpHpMetadataAlloc(v13, 0x1000ui64, 1, &a4);
    v18 = (INT64)v20;
    if( !v20 )
      return v18;
    v27 = *a3;
    RtlpHpMetadataCommit((UINT64)v20, (_DWORD)v20 + 4096, v13 - 4096, &v27, 0);
    goto LABEL_7;
  }
  v5 = BYTE1(v24) < 2u ? 0x1000000 : 0;
  v16 = v5;
  *(_OWORD *)a6 = v8;
  LODWORD(v16) = v5 | 0x2000;
  v17 = (v15 & 0x40000000) != 0 ? 64 : 4;
  LODWORD(a5) = v17;
  if( (int)RtlpHpAllocVA(&result, &a2a, 0i64, v16, a5, (INT64)a6) >= 0 )
  {
    LODWORD(a5a) = v17;
    *(_OWORD *)v29 = *a3;
    if( (int)RtlpHpAllocVA(&result, &v32, 0i64, v5 | 0x1000, a5a, (INT64)v29) >= 0 )
    {
      v18 = result;
      v6 = 0;
      v13 = a2a;
      v4 = v32;
      result = 0i64;
LABEL_7:
      memset(v18, 0i64);
      *(_QWORD *)(v18 + 232) = v18 + 2048;
      *(_QWORD *)(v18 + 240) = v18 + v4;
      *(_QWORD *)(v18 + 248) = v18 + v13;
      *(_WORD *)(v18 + 30) = v6 | *(_WORD *)(v18 + 30) & 0xFFFE;
      _InterlockedExchangeAdd64((volatile signed __int64 *)(v18 + 128), v13 >> 12);
      _InterlockedExchangeAdd64((volatile signed __int64 *)(v18 + 136), v32 >> 12);
      goto LABEL_8;
    }
  }
  v18 = 0i64;
LABEL_8:
  if( result )
  {
    v30[0] = *a3;
    RtlpHpFreeVA((UINT64 *)&result, &a2a, v5 | 0x8000, v30);
  }
  return v18;
}

Referenced by:

RtlpHpHeapCreate