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