RtlpHpSegAlloc
UINT64 __fastcall RtlpHpSegAlloc(INT64 a1, size_t a2, INT64 a3, INT64 a4, UINT64 a5){
unsigned __int64 v5;
unsigned __int64 v6;
unsigned int v8;
UINT64 result;
UINT64 v10;
INT64 v11;
int v12;
int v13;
int v14;
__int64 v15;
UINT64 *a5a;
unsigned int Size;
Size = a2;
v5 = (unsigned __int64)(a4 + 4095) >> 12;
v6 = (unsigned __int64)(a3 + 4095) >> 12;
v8 = v6 + 1;
if( (a5 & 4) == 0 )
v8 = v6;
if( (a5 & 0x800000) != 0 && (unsigned int)-*(_DWORD *)a1 > 0x200000 )
return 0i64;
result = RtlpHpSegPageRangeAllocate(a1, v8, (unsigned int)a5);
v11 = result;
if( result )
{
v12 = *(unsigned __int8 *)(result + 31);
v13 = (unsigned __int16)~*(_WORD *)(result + 28);
if( !(_DWORD)v5 )
goto LABEL_9;
v14 = a5 & 0xFFFFFFFD;
if( !v13 )
v14 = a5;
LODWORD(a5a) = v14;
if( (int)RtlpHpSegPageRangeCommit(a1, v11, 0i64, (unsigned int)v5, (INT64)a5a, 0i64) < 0 )
{
RtlpHpSegPageRangeFree(a1, v11, (unsigned int)a5);
return 0i64;
}
else
{
LABEL_9:
if( (a5 & 4) != 0 )
{
LODWORD(a5a) = 0;
RtlpHpSegPageRangeCommit(a1, v11, v8 - 1, v8 - (v12 << *(_BYTE *)(a1 + 9)) - 1, (INT64)a5a, 0i64);
}
*(_DWORD *)(v11 + 4) = (v12 << *(_BYTE *)(a1 + 8)) - Size;
v15 = (v11 & *(_QWORD *)a1) + ((v11 - (v11 & *(_QWORD *)a1)) >> 5 << *(_BYTE *)(a1 + 8));
if( (a5 & 2) != 0
&& (v13
|| BYTE1(*(_QWORD *)(a1 + 40)) >= 2u
|| (*(_BYTE *)(a1 + 13) & 7) != 0
&& RtlpHpSegPageRangeComputeLargePageCost((PVOID)a1, (THREADINFOCLASS)v15, (PVOID)Size, v10, a5a) <= 2) )
{
memset(v15, 0i64);
}
return v15;
}
}
return result;
}Referenced by:
ExAllocateContiguousHeapPool
ExAllocateHeapPages
ExAllocateHeapPool
ExAllocateHeapSpecialPool
RtlpHpAllocateHeapInternal
RtlpHpMetadataAlloc
RtlpHpSegSubAllocate