RtlpHpAllocateHeap
UINT64 __fastcall RtlpHpAllocateHeap(INT64 a1, UINT64 a2, INT64 a3, INT16 a4){
int v5;
unsigned int a6;
__int64 v8;
int v9;
int v10;
unsigned __int64 v11;
unsigned __int64 v12;
UINT64 v13;
INT64 HeapInternal;
__int64 v15;
void *v16;
int v18;
unsigned __int64 v19;
__int64 v20;
INT64 a5;
LOWORD(a5) = a4;
v5 = a3 | *(_DWORD *)(a1 + 20);
LODWORD(a5) = 0;
a6 = v5 & 0x93000F0B;
if( !(unsigned int)RtlpHpCheckAllocationSizeLimit(a2, a1, a1 + 32) )
return 0i64;
v8 = 0i64;
v20 = 0i64;
v9 = 0;
v10 = -1073741823;
if( (a6 & 0x1000000) == 0 )
{
v9 = *(_DWORD *)(a1 + 24);
if( v9 )
{
a6 |= 8u;
if( (_WORD)v9 == 1 )
{
v18 = ((__int64(__fastcall *)(INT64, _QWORD, __int64, __int64 *))RtlpInterceptorRoutines)(a1, 0i64, 1i64, &v20);
v8 = v20;
}
else
{
v18 = -1073741823;
}
if( v18 < 0 )
return 0i64;
}
}
v11 = v8 + a2;
v12 = v8 + a2 + 16;
if( (a6 & 0x10000000) == 0 )
v12 = v11;
if( (a6 & 0x20000F08) != 0 )
v12 = ((v12 + 15) & 0xFFFFFFFFFFFFFFF0ui64) + 16;
v13 = 1i64;
if( v12 )
v13 = v12;
if( v13 < a2 || a2 > 0x7FFFFFFFFFFFFFFFi64 )
return 0i64;
HeapInternal = RtlpHpAllocateHeapInternal(a1, a2, v13, a6 & 0x13000003, (INT64)&a5);
v16 = (void *)HeapInternal;
if( HeapInternal )
{
if( (a6 & 0x30000F08) != 0 )
{
v19 = RtlpHpExtrasAppend((__int128 *)a1, HeapInternal, a2, v15, v20, a6, 0);
if( v9 )
{
*(_BYTE *)(v19 + 2) ^= (v9 ^ *(_BYTE *)(v19 + 2)) & 0xF;
if( (_WORD)v9 == 1 )
v10 = ((__int64(__fastcall *)(INT64, void *, __int64, unsigned __int64))RtlpInterceptorRoutines)(
a1,
v16,
2i64,
v19 + 16);
if( v10 < 0 )
{
RtlpHpFreeHeap((PVOID)a1, v16, a6);
return 0i64;
}
}
}
}
return(UINT64)v16;
}Referenced by:
ExAllocateHeapPages
RtlpHpMetadataAlloc