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