RtlpHpSegAlloc
UINT64 __fastcall RtlpHpSegAlloc(UINT16 *a1, size_t a2, __int64 a3, __int64 a4, UINT64 a5){
unsigned __int64 v5;
unsigned __int64 v6;
unsigned int v8;
UINT64 result;
UINT64 v10;
UINT64 v11;
int v12;
int v13;
int v14;
VOID *v15;
UINT64 *ReturnLength;
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((INT64)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;
if( RtlpHpSegPageRangeCommit(a1, v11, 0, v5, v14, 0i64) < 0 )
{
RtlpHpSegPageRangeFree((INT64)a1, v11, (unsigned int)a5);
return 0i64;
}
else
{
LABEL_9:
if( (a5 & 4) != 0 )
RtlpHpSegPageRangeCommit(a1, v11, v8 - 1, v8 - (v12 << *((_BYTE *)a1 + 9)) - 1, 0, 0i64);
*(_DWORD *)(v11 + 4) = (v12 << *((_BYTE *)a1 + 8)) - a2;
v15 = (VOID *)((v11 & *(_QWORD *)a1) + ((__int64)(v11 - (v11 & *(_QWORD *)a1)) >> 5 << *((_BYTE *)a1 + 8)));
if( (a5 & 2) != 0
&& (v13
|| BYTE1(*((_QWORD *)a1 + 5)) >= 2u
|| (*((_BYTE *)a1 + 13) & 7) != 0
&& RtlpHpSegPageRangeComputeLargePageCost(a1, (_THREADINFOCLASS)v15, (PVOID)a2, v10, ReturnLength) <= 2) )
{
memset(v15, 0i64, a2);
}
return(UINT64)v15;
}
}
return result;
}Referenced by:
ExAllocateContiguousHeapPool
ExAllocateHeapPages
ExAllocateHeapPool
ExAllocateHeapSpecialPool
RtlpHpAllocateHeapInternal
RtlpHpMetadataAlloc
RtlpHpSegSubAllocate