RtlpHpVsContextAllocateInternal

char *__fastcall RtlpHpVsContextAllocateInternal(
        INT64 a1,
        size_t a2,
        unsigned int a3,
        unsigned int a4,
        INT64 a5,
        __int64 a6){
  unsigned int v7; 
  _DWORD *v9; 
  INT64 v10; 
  unsigned int v11; 
  unsigned int v12; 
  INT64 v13; 
  __int64 v14; 
  unsigned __int64 v15; 
  _QWORD *v16; 
  int v17; 
  unsigned int v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  unsigned __int64 v22; 
  int v23; 
  int v24; 
  _WORD *v25; 
  char *v26; 
  __int64 v27; 
  int v28; 
  __int64 v30; 
  int v31; 
  __int16 v32; 
  __int16 v33; 
  INT64 v34; 
  INT64 v35; 
  VOID *Param2; 

  v7 = a3;
  if( a2 != a3 )
    v7 = a3 + 2;
  v9 = (_DWORD *)a6;
  v10 = a5;
  v11 = ((v7 + 15) >> 4) + (*(_DWORD *)(a1 + 176) & 1) + 1;
  v12 = v11 << 16;
  if( !*(_DWORD *)a6 )
  {
    *(_DWORD *)a6 = 1;
    if( (a4 & 1) == 0 )
    {
      RtlpHpAcquireQueuedLockExclusive(a1, (UINT64 *)*(unsigned int *)(a1 + 8));
      v10 = a5;
    }
  }
  v13 = a1 + 16;
  while( 1 )
  {
    v14 = *(_QWORD *)(a1 + 24);
    v15 = *(_QWORD *)v13;
    if( (v14 & 1) != 0 && v15 )
      v15 ^= v13;
    v16 = 0i64;
    v17 = v14 & 1;
    while( v15 )
    {
      v18 = RtlpHpHeapGlobals ^ *(_DWORD *)(v15 - 8) ^ (v15 - 8);
      if( v12 < v18 )
      {
        v19 = *(_QWORD *)v15;
        v16 = (_QWORD *)v15;
        if( v17 && v19 )
          goto LABEL_39;
      }
      else
      {
        if( v12 <= v18 )
          goto LABEL_17;
        v19 = *(_QWORD *)(v15 + 8);
        if( v17 && v19 )
        {
LABEL_39:
          v15 ^= v19;
          continue;
        }
      }
      v15 = v19;
    }
    v15 = (unsigned __int64)v16;
LABEL_17:
    if( v15 )
      break;
    if( (a4 & 1) == 0 )
      RtlpHpReleaseQueuedLockExclusive(*(unsigned int *)(a1 + 8), v10);
    *v9 = 0;
    LODWORD(v34) = RtlpHpVsSubsegmentCreate(a1, v7, a4);
    v35 = v34;
    if( !v34 )
      return 0i64;
    *(_DWORD *)a6 = 1;
    if( (a4 & 1) == 0 )
      RtlpHpAcquireQueuedLockExclusive(a1, (UINT64 *)*(unsigned int *)(a1 + 8));
    RtlpHpVsContextAddSubsegment((UINT64 *)a1, v35);
    v10 = a5;
    v9 = (_DWORD *)a6;
  }
  v20 = v15 - 8;
  v21 = HIDWORD(*(_QWORD *)(v15 - 8));
  v22 = v15 - 8;
  if( ((DWORD1(RtlpHpHeapGlobals) ^ (unsigned int)v21 ^ ((v15 - 8) >> 32)) & 0xFF0000) != 0 )
  {
    v24 = (unsigned __int8)(RtlpHpHeapGlobals ^ v20 ^ *(_BYTE *)v15);
  }
  else
  {
    if( WORD2(RtlpHpHeapGlobals) ^ (unsigned __int16)(v21 ^ WORD2(v20)) )
    {
      v22 -= 16i64 * (unsigned __int16)(((unsigned __int64)RtlpHpHeapGlobals ^ v20 ^ *(_QWORD *)(v15 - 8)) >> 32);
      v23 = DWORD1(RtlpHpHeapGlobals) ^ HIDWORD(v22) ^ HIDWORD(*(_QWORD *)v22);
      if( (v23 & 0xFF0000) != 0 )
      {
        v24 = (unsigned __int8)(RtlpHpHeapGlobals ^ v22 ^ *(_BYTE *)(v22 + 8));
        goto LABEL_23;
      }
      if( (_WORD)v23 )
      {
        v22 -= 16i64 * (unsigned __int16)(((unsigned __int64)RtlpHpHeapGlobals ^ v22 ^ *(_QWORD *)v22) >> 32);
        v24 = (unsigned __int8)(RtlpHpHeapGlobals ^ v22 ^ *(_BYTE *)(v22 + 8));
        goto LABEL_23;
      }
    }
    v24 = 0;
  }
LABEL_23:
  v25 = (_WORD *)((v22 - (unsigned int)(v24 << 12)) & 0xFFFFFFFFFFFFF000ui64);
  if( (((unsigned __int16)(v25[16] ^ v25[17]) ^ 0x2BED) & 0x7FFF) != 0 )
  {
    RtlpLogHeapFailure(
      heap_failure_vs_subsegment_corruption,
      (VOID *)(a1 ^ *(_QWORD *)(a1 + 128)),
      v25,
      (VOID *)(v15 - 8),
      0i64);
    return 0i64;
  }
  if( (*(_DWORD *)(a1 + 176) & 1) != 0 && ((v20 + 32) & 0xFFF) != 0 )
    --v11;
  LODWORD(Param2) = a4;
  if( !RtlpHpVsChunkSplit(a1, (UINT64)v25, v15 - 8, v11, (INT64)Param2, v10) )
    return 0i64;
  v26 = (char *)(v20 + 16);
  v27 = 16 * (WORD1(RtlpHpHeapGlobals) ^ WORD1(v20) ^ *(unsigned __int16 *)(v20 + 2)) - 16;
  if( (*(_DWORD *)(a1 + 176) & 1) != 0 && ((v20 + 32) & 0xFFF) == 0 )
  {
    v26 = (char *)(v20 + 32);
    v27 = 16 * (WORD1(RtlpHpHeapGlobals) ^ WORD1(v20) ^ *(unsigned __int16 *)(v20 + 2)) - 32;
  }
  v28 = *(_DWORD *)v15;
  if( a2 < (unsigned int)v27 )
  {
    v30 = (unsigned int)v27;
    v31 = v27 - a2;
    *(_DWORD *)v15 = v28 | 0x100;
    v26[v27 - 1] = 0;
    v32 = *(_WORD *)&v26[v27 - 2];
    v33 = v32 ^ (v32 ^ (v27 - a2)) & 0x1FFF;
    if( v31 == 1 )
      v33 = v32 | 0x8000;
    *(_WORD *)&v26[v30 - 2] = v33;
  }
  else
  {
    *(_DWORD *)v15 = v28 & 0xFFFFFEFF;
  }
  if( (a4 & 2) != 0 )
  {
    if( (a4 & 1) == 0 )
      RtlpHpReleaseQueuedLockExclusive(*(unsigned int *)(a1 + 8), a5);
    *(_DWORD *)a6 = 0;
    memset(v26, 0i64, a2);
  }
  return v26;
}

Referenced by:

ExAllocateHeapPool
RtlpHpVsContextAllocate
RtlpHpVsContextMultiAlloc