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