RtlpHpAllocateHeap

UINT8 *__stdcall RtlpHpAllocateHeap(VOID *HeapAddress, VOID *Param2, INT64 a3, INT16 a4){
  int v5; 
  unsigned int v7; 
  INT64 v8; 
  int v9; 
  int v10; 
  char *v11; 
  char *v12; 
  unsigned __int64 v13; 
  _XSTATE_CONFIGURATION *HeapInternal; 
  INT64 v15; 
  _XSTATE_CONFIGURATION *v16; 
  int v18; 
  UINT64 v19; 
  INT64 v20; 
  INT64 v21; 
  __int64 v22; 

  LOWORD(v22) = a4;
  v5 = a3 | *((_DWORD *)HeapAddress + 5);
  LODWORD(v22) = 0;
  v7 = v5 & 0x93000F0B;
  if( !RtlpHpCheckAllocationSizeLimit(Param2, HeapAddress, (INT64)HeapAddress + 32) )
    return 0i64;
  v8 = 0i64;
  v21 = 0i64;
  v9 = 0;
  v10 = -1073741823;
  if( (v7 & 0x1000000) == 0 )
  {
    v9 = *((_DWORD *)HeapAddress + 6);
    if( v9 )
    {
      v7 |= 8u;
      if( (_WORD)v9 == 1 )
      {
        v18 = ((__int64(__fastcall *)(VOID *, _QWORD, __int64, INT64 *))RtlpInterceptorRoutines.QuadPart)(
                HeapAddress,
                0i64,
                1i64,
                &v21);
        v8 = v21;
      }
      else
      {
        v18 = -1073741823;
      }
      if( v18 < 0 )
        return 0i64;
    }
  }
  v11 = (char *)Param2 + v8;
  v12 = (char *)Param2 + v8 + 16;
  if( (v7 & 0x10000000) == 0 )
    v12 = v11;
  if( (v7 & 0x20000F08) != 0 )
    v12 = (char *)(((unsigned __int64)(v12 + 15) & 0xFFFFFFFFFFFFFFF0ui64) + 16);
  v13 = 1i64;
  if( v12 )
    v13 = (unsigned __int64)v12;
  if( v13 < (unsigned __int64)Param2 || (unsigned __int64)Param2 > 0x7FFFFFFFFFFFFFFFi64 )
    return 0i64;
  HeapInternal = (_XSTATE_CONFIGURATION *)RtlpHpAllocateHeapInternal(
                                            (INT64)HeapAddress,
                                            (UINT64)Param2,
                                            v13,
                                            v7 & 0x13000003,
                                            (__int64)&v22);
  v16 = HeapInternal;
  if( HeapInternal )
  {
    if( (v7 & 0x30000F08) != 0 )
    {
      LODWORD(v20) = v7;
      v19 = RtlpHpExtrasAppend((INT128 *)HeapAddress, HeapInternal, (INT64)Param2, v15, v21, v20, 0);
      if( v9 )
      {
        *(_BYTE *)(v19 + 2) ^= (v9 ^ *(_BYTE *)(v19 + 2)) & 0xF;
        if( (_WORD)v9 == 1 )
          v10 = ((__int64(__fastcall *)(VOID *, _XSTATE_CONFIGURATION *, __int64, UINT64))RtlpInterceptorRoutines.QuadPart)(
                  HeapAddress,
                  v16,
                  2i64,
                  v19 + 16);
        if( v10 < 0 )
        {
          RtlpHpFreeHeap(HeapAddress, v16, v7);
          return 0i64;
        }
      }
    }
  }
  return(UINT8 *)v16;
}

Referenced by:

ExAllocateHeapPages
RtlpHpMetadataAlloc