RtlpExtendHeap

INT64 __fastcall RtlpExtendHeap(INT64 a1, INT64 a2){
  _HEAP_FREE_ENTRY *v4; 
  UINT64 *v5; 
  _HEAP_FREE_ENTRY *v6; 
  unsigned __int64 v7; 
  ULONG_PTR v8; 
  INT64 v9; 
  unsigned __int64 v10; 
  NTSTATUS v11; 
  ULONG_PTR v12; 
  INT64 v13; 
  INT64 v14; 
  INT64 v15; 
  NTSTATUS v16; 
  UINT64 v17; 
  UINT64 *AllocationType; 
  UINT64 AllocationTypea; 
  INT64 AllocationTypeb; 
  VOID *Protect; 
  UINT64 Protecta; 
  __int64 v24[2]; 
  ULONG_PTR RegionSize; 
  PVOID BaseAddress; 
  UINT64 FreeSize; 
  FreeSize = ((_DWORD)a2 + 4095) & 0xFFFFF000;
  v4 = (_HEAP_FREE_ENTRY *)RtlpFindAndCommitPages(a1, &FreeSize);
  if( v4 )
  {
    FreeSize >>= 4;
    v6 = RtlpCoalesceFreeBlocks((_HEAP *)a1, v4, &FreeSize, v5, AllocationType, Protect);
    RtlpInsertFreeBlock(a1, (UINT64)v6, FreeSize);
    if( *(_DWORD *)(a1 + 124) )
    {
      v6->HeapEntry.UnpackedEntry.SubSegmentCode ^= *(_DWORD *)(a1 + 136);
      if( v6->HeapEntry.UnpackedEntry.SmallTagIndex != (LOBYTE(v6->InterceptorValue) ^ (unsigned __int8)(BYTE1(v6->Code1) ^ v6->HeapEntry.UnpackedEntry.Flags)) )
        RtlpAnalyzeHeapFailure(a1, (UINT64)v6);
    }
    return(INT64)v6;
  }
  if( (*(_DWORD *)(a1 + 112) & 2) == 0 )
    return 0i64;
  v7 = *(_QWORD *)(a1 + 160);
  v8 = a2 + 0x2000;
  BaseAddress = 0i64;
  LODWORD(Protect) = 4;
  v9 = a2 + 0x2000;
  LODWORD(AllocationType) = 0x2000;
  if( a2 + 0x2000 <= v7 )
    v9 = v7;
  v10 = (v9 + 0xFFFF) & 0xFFFFFFFFFFFF0000ui64;
  if( v10 >= 0xFD0000 )
    v10 = 16580608i64;
  RegionSize = v10;
  v11 = ZwAllocateVirtualMemory(
          (PVOID)0xFFFFFFFFFFFFFFFFi64,
          &BaseAddress,
          0i64,
          &RegionSize,
          (UINT64)AllocationType,
          (UINT64)Protect);
  if( v11 >= 0 )
  {
    v12 = RegionSize;
  }
  else
  {
    while( 1 )
    {
      v12 = RegionSize;
      if( RegionSize == v8 )
        break;
      v13 = RegionSize >> 1;
      LODWORD(Protecta) = 4;
      LODWORD(AllocationTypea) = 0x2000;
      if( RegionSize >> 1 < v8 )
        v13 = a2 + 0x2000;
      RegionSize = v13;
      v11 = ZwAllocateVirtualMemory(
              (PVOID)0xFFFFFFFFFFFFFFFFi64,
              &BaseAddress,
              0i64,
              &RegionSize,
              AllocationTypea,
              Protecta);
      if( v11 >= 0 )
      {
        v12 = RegionSize;
        break;
      }
    }
    if( v11 < 0 )
    {
      ++*(_DWORD *)(a1 + 632);
      return 0i64;
    }
  }
  *(_QWORD *)(a1 + 160) += v12;
  v14 = a2 + 4096;
  if( (unsigned __int64)(a2 + 4096) <= *(_QWORD *)(a1 + 168) )
    v14 = *(_QWORD *)(a1 + 168);
  v15 = *(_QWORD *)(a1 + 576) - *(_QWORD *)(a1 + 664);
  v24[0] = (v14 + 4095) & 0xFFFFFFFFFFFFF000ui64;
  if( !(unsigned int)RtlpHpHeapCheckCommitLimit(v24[0], v15, a1, (UINT64 *)(a1 + 376)) )
    goto LABEL_30;
  LODWORD(Protecta) = 4;
  LODWORD(AllocationTypea) = 4096;
  v16 = ZwAllocateVirtualMemory(
          (PVOID)0xFFFFFFFFFFFFFFFFi64,
          &BaseAddress,
          0i64,
          (UINT64 *)v24,
          AllocationTypea,
          Protecta);
  if( v16 < 0 )
    goto LABEL_30;
  LODWORD(AllocationTypeb) = 2;
  if( !RtlpInitializeHeapSegment(
          a1,
          (INT64)BaseAddress,
          112i64,
          (INT64)BaseAddress + RegionSize - 4096,
          AllocationTypeb,
          (INT64)BaseAddress,
          (UINT64)BaseAddress + v24[0],
          (UINT64)BaseAddress + RegionSize - 4096) )
    v16 = -1073741801;
  if( v16 < 0 )
  {
LABEL_30:
    ZwFreeVirtualMemory((PVOID)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &RegionSize, 0x8000ui64);
    return 0i64;
  }
  v17 = *((_QWORD *)BaseAddress + 8);
  if( *(_DWORD *)(a1 + 124) )
  {
    *(_DWORD *)(v17 + 8) ^= *(_DWORD *)(a1 + 136);
    if( *(_BYTE *)(v17 + 11) != (*(_BYTE *)(v17 + 8) ^ (unsigned __int8)(*(_BYTE *)(v17 + 9) ^ *(_BYTE *)(v17 + 10))) )
      RtlpAnalyzeHeapFailure(a1, v17);
  }
  return *((_QWORD *)BaseAddress + 8);
}

Referenced by:

RtlpAllocateHeap