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