RtlpAllocateHeapInternal

NTSTATUS __stdcall RtlpAllocateHeapInternal(PVOID HeapHandle, UINT64 Size, UINT64 Flags){
  __int16 v3; 
  unsigned __int64 v4; 
  unsigned int v6; 
  void *v7; 
  int v9; 
  unsigned __int64 v10; 
  int v11; 
  int v12; 
  int v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  _DWORD *v16; 
  __int64 v17; 
  _DWORD *v18; 
  char v19; 
  unsigned __int64 v20; 
  int v21; 
  LOWORD(v21) = v3;
  v4 = Size;
  if( *((_DWORD *)HeapHandle + 4) == -857879331 )
  {
    if( Size > 0x20000 )
    {
      LODWORD(v7) = 0;
    }
    else
    {
      v6 = RtlpHpConvertFlagsToSegmentFlags((unsigned int)Flags);
      LODWORD(v7) = RtlpHpVsContextAllocate(
                      (INT64)HeapHandle + 64,
                      (unsigned int)v4,
                      (unsigned int)v4,
                      *((_DWORD *)HeapHandle + 5) | v6);
    }
    return(int)v7;
  }
  v9 = *((_DWORD *)HeapHandle + 29) | Flags;
  v10 = 0i64;
  v21 = 0;
  v20 = 0i64;
  if( Size > 0x7FFFFFFFFFFFFFFFi64
    || !(unsigned int)RtlpHpCheckAllocationSizeLimit(Size, (INT64)HeapHandle, (INT64)HeapHandle + 376) )
  {
    goto LABEL_24;
  }
  v11 = *((_DWORD *)HeapHandle + 36);
  v12 = -1073741823;
  if( v11 )
  {
    if( (v9 & 0x3C000102) != 0 )
    {
      v11 = 0;
    }
    else
    {
      if( (_WORD)v11 == 1 )
        v13 = ((__int64(__fastcall *)(PVOID, _QWORD, __int64, unsigned __int64 *))RtlpInterceptorRoutines)(
                HeapHandle,
                0i64,
                1i64,
                &v20);
      else
        v13 = -1073741823;
      if( v13 < 0 )
        goto LABEL_24;
      v14 = (v20 + 15) & 0xFFFFFFFFFFFFFFF0ui64;
      v4 += v14 + 16;
      v20 = v14 + 16;
    }
  }
  v15 = 1i64;
  if( v4 )
    v15 = v4;
  v10 = (v15 + 23) & 0xFFFFFFFFFFFFFFF0ui64;
  v16 = RtlpAllocateHeap((__int64)HeapHandle, v9 | 2u, v4, v10, v19, &v21);
  LODWORD(v7) = (_DWORD)v16;
  if( !v16 )
    goto LABEL_25;
  if( v11 )
  {
    v18 = v16;
    v4 -= v20;
    v7 = (void *)RtlpSetupExtendedBlock((__int64)HeapHandle, v9, (__int64)v16, v17, v20, v11);
    if( (_WORD)v11 == 1 )
      v12 = ((__int64(__fastcall *)(PVOID, void *, __int64, _DWORD *))RtlpInterceptorRoutines)(
              HeapHandle,
              v7,
              2i64,
              v18);
    if( v12 < 0 )
    {
      RtlFreeHeap(HeapHandle, 0i64, v7);
LABEL_24:
      LODWORD(v7) = 0;
LABEL_25:
      if( (v9 & 4) != 0 )
      {
        if( v10 )
          v4 = v10;
        RtlpAllocateHeapRaiseException(v4);
      }
    }
  }
  return(int)v7;
}

Referenced by:

RtlAllocateHeap
RtlpHpAllocWithExceptionProtection