RtlpInitializeHeapSegment

CHAR __fastcall RtlpInitializeHeapSegment(
        INT64 a1,
        INT64 a2,
        INT64 a3,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        UINT64 BaseAddress,
        UINT64 a8){
  UINT64 v8; 
  INT64 v11; 
  UINT64 v12; 
  __int64 v13; 
  UINT64 v14; 
  __int64 v15; 
  INT64 v16; 
  __int64 v17; 
  __int64 v18; 
  INT64 v19; 
  unsigned __int64 v20; 
  UINT64 v22; 
  UINT64 *v23; 
  INT64 *v24; 
  UINT64 AllocationType; 
  UINT64 Protect; 
  ULONG_PTR RegionSize[2]; 
  v8 = a8;
  RegionSize[0] = 0i64;
  if( a8 - a6 > 0xFFFFF000 )
    return 0;
  v11 = a3 + 15;
  v12 = BaseAddress;
  v11 &= 0xFFFFFFFFFFFFFFF0ui64;
  v13 = (__int64)(a8 - a6) / 4096;
  v14 = v11 + a2;
  v15 = v11 >> 4;
  if( v14 + 80 >= BaseAddress )
  {
    if( v14 + 80 < a8 )
    {
      v16 = *(_QWORD *)(a1 + 576) - *(_QWORD *)(a1 + 664);
      RegionSize[0] = (v14 - BaseAddress + 4111) & 0xFFFFFFFFFFFFF000ui64;
      if( (unsigned int)RtlpHpHeapCheckCommitLimit(RegionSize[0], v16, a1, (UINT64 *)(a1 + 376)) )
      {
        LODWORD(Protect) = 4;
        LODWORD(AllocationType) = 4096;
        if( ZwAllocateVirtualMemory(
               (PVOID)0xFFFFFFFFFFFFFFFFi64,
               (PVOID *)&BaseAddress,
               0i64,
               RegionSize,
               AllocationType,
               Protect) >= 0 )
        {
          v12 = RegionSize[0] + BaseAddress;
          BaseAddress += RegionSize[0];
          goto LABEL_7;
        }
      }
      ++*(_DWORD *)(a1 + 632);
    }
    return 0;
  }
LABEL_7:
  *(_WORD *)(a2 + 8) = v15;
  *(_WORD *)(a2 + 10) = 1;
  *(_BYTE *)(a2 + 15) = 1;
  *(_WORD *)(a2 + 12) = *(_WORD *)(a1 + 140);
  v17 = (__int64)(v8 - v12) / 4096;
  *(_QWORD *)(a2 + 40) = a1;
  *(_DWORD *)(a2 + 20) = a5;
  v18 = (unsigned int)((_DWORD)v13 << 12);
  *(_QWORD *)(a2 + 72) = a6 + v18;
  *(_DWORD *)(a2 + 16) = -1114130;
  *(_QWORD *)(a2 + 48) = a6;
  *(_QWORD *)(a2 + 64) = v14;
  *(_DWORD *)(a2 + 56) = v13;
  *(_DWORD *)(a2 + 80) = 0;
  *(_QWORD *)(a1 + 576) += v18;
  *(_QWORD *)(a1 + 568) += v18;
  *(_QWORD *)(a2 + 104) = a2 + 96;
  *(_QWORD *)(a2 + 96) = a2 + 96;
  *(_BYTE *)(a2 + 14) = *(_QWORD *)(a2 + 40) != a2;
  *(_WORD *)(v14 + 12) = *(_WORD *)(a2 + 8) ^ *(_WORD *)(a1 + 140);
  v19 = *(_QWORD *)(a2 + 40);
  if( v19 == a2 )
  {
    LOBYTE(v20) = 0;
  }
  else
  {
    v20 = ((v14 - a2) >> 16) + 1;
    if( v20 >= 0xFE )
    {
      RtlpLogHeapFailure(3i64, v19, v14, a2, 0i64, 0i64);
      v12 = BaseAddress;
    }
  }
  *(_BYTE *)(v14 + 14) = v20;
  RtlpCreateUCREntry(a1, a2, v12 - 48, (unsigned int)((_DWORD)v17 << 12), v14, (INT64 *)RegionSize);
  if( *(_DWORD *)(a1 + 124) )
  {
    *(_BYTE *)(a2 + 11) = *(_BYTE *)(a2 + 8) ^ *(_BYTE *)(a2 + 9) ^ *(_BYTE *)(a2 + 10);
    *(_DWORD *)(a2 + 8) ^= *(_DWORD *)(a1 + 136);
  }
  if( RegionSize[0] )
    RtlpInsertFreeBlock(a1, v14, RegionSize[0]);
  v22 = a1 + 288;
  v23 = (UINT64 *)(a2 + 24);
  v24 = *(INT64 **)(a1 + 296);
  if( *v24 == a1 + 288 )
  {
    *v23 = v22;
    v23[1] = (UINT64)v24;
    *v24 = (INT64)v23;
    *(_QWORD *)(a1 + 296) = v23;
  }
  else
  {
    RtlpLogHeapFailure(13i64, 0i64, v22, 0i64, *v24, 0i64);
  }
  ++*(_DWORD *)(a1 + 600);
  return 1;
}

Referenced by:

RtlCreateHeap
RtlpExtendHeap