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