RtlpHpVsContextAllocateInternal

CHAR *__fastcall RtlpHpVsContextAllocateInternal(INT64 *SpinLock, UINT64 a2, UINT64 a3, UINT64 a4, INT64 a5, INT64 a6){
  unsigned int v6; 
  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; 
  unsigned __int64 v25; 
  CHAR *v26; 
  __int64 v27; 
  int v28; 
  __int64 v30; 
  int v31; 
  __int16 v32; 
  __int16 v33; 
  INT64 v34; 
  INT64 v35; 
  unsigned int Size; 
  Size = a2;
  v6 = a4;
  v7 = a3;
  if( (_DWORD)a2 != (_DWORD)a3 )
    v7 = a3 + 2;
  v9 = (_DWORD *)a6;
  v10 = a5;
  v11 = ((v7 + 15) >> 4) + (SpinLock[22] & 1) + 1;
  v12 = v11 << 16;
  if( !*(_DWORD *)a6 )
  {
    *(_DWORD *)a6 = 1;
    if( (a4 & 1) == 0 )
    {
      RtlpHpAcquireQueuedLockExclusive((INT8)SpinLock, (UINT64 *)*((unsigned int *)SpinLock + 2));
      v10 = a5;
    }
  }
  v13 = SpinLock + 2;
  while( 1 )
  {
    v14 = SpinLock[3];
    v15 = *v13;
    if( (v14 & 1) != 0 && v15 )
      v15 ^= (unsigned __int64)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( (v6 & 1) == 0 )
      RtlpHpReleaseQueuedLockExclusive(*((unsigned int *)SpinLock + 2), v10);
    *v9 = 0;
    v34 = RtlpHpVsSubsegmentCreate((INT64)SpinLock, v7, v6);
    if( !v34 )
      return 0i64;
    *(_DWORD *)a6 = 1;
    if( (v6 & 1) == 0 )
      RtlpHpAcquireQueuedLockExclusive((INT8)SpinLock, (UINT64 *)*((unsigned int *)SpinLock + 2));
    RtlpHpVsContextAddSubsegment(SpinLock, v34);
    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 = (v22 - (unsigned int)(v24 << 12)) & 0xFFFFFFFFFFFFF000ui64;
  if( (((unsigned __int16)(*(_WORD *)(v25 + 32) ^ *(_WORD *)(v25 + 34)) ^ 0x2BED) & 0x7FFF) != 0 )
  {
    RtlpLogHeapFailure(18i64, (unsigned __int64)SpinLock ^ SpinLock[16], v25, v15 - 8, 0i64, 0i64);
    return 0i64;
  }
  if( (SpinLock[22] & 1) != 0 && ((v20 + 32) & 0xFFF) != 0 )
    --v11;
  LODWORD(v35) = v6;
  if( !(unsigned int)RtlpHpVsChunkSplit(SpinLock, v25, v15 - 8, v11, v35, v10) )
    return 0i64;
  v26 = (CHAR *)(v20 + 16);
  v27 = 16 * (WORD1(RtlpHpHeapGlobals) ^ WORD1(v20) ^ *(unsigned __int16 *)(v20 + 2)) - 16;
  if( (SpinLock[22] & 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( Size < (unsigned int)v27 )
  {
    v30 = (unsigned int)v27;
    v31 = v27 - Size;
    *(_DWORD *)v15 = v28 | 0x100;
    v26[v27 - 1] = 0;
    v32 = *(_WORD *)&v26[v27 - 2];
    v33 = v32 ^ (v32 ^ (v27 - Size)) & 0x1FFF;
    if( v31 == 1 )
      v33 = v32 | 0x8000;
    *(_WORD *)&v26[v30 - 2] = v33;
  }
  else
  {
    *(_DWORD *)v15 = v28 & 0xFFFFFEFF;
  }
  if( (v6 & 2) != 0 )
  {
    if( (v6 & 1) == 0 )
      RtlpHpReleaseQueuedLockExclusive(*((unsigned int *)SpinLock + 2), a5);
    *(_DWORD *)a6 = 0;
    memset((INT64)v26, 0i64);
  }
  return v26;
}

Referenced by:

ExAllocateHeapPool
RtlpHpVsContextAllocate
RtlpHpVsContextMultiAlloc