RtlpHpVsChunkCoalesce

UINT64 __stdcall RtlpHpVsChunkCoalesce(INT64 a1, INT64 a2, UINT64 a3, UINT64 *a4){
  UINT64 v4; 
  __int64 v6; 
  unsigned int v7; 
  UINT64 v8; 
  __int64 v9; 
  unsigned int v10; 
  unsigned int v11; 
  __int64 v12; 
  unsigned int v13; 
  bool v14; 
  INT64 v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  int v18; 
  unsigned int v19; 
  unsigned int v20; 
  __int64 v21; 
  unsigned int v22; 
  unsigned __int64 v23; 
  __int64 v24; 
  unsigned __int64 v25; 
  INT64 v27; 

  v27 = a1;
  v4 = a3;
  v6 = a3 ^ RtlpHpHeapGlobals ^ *(_QWORD *)a3;
  v7 = WORD1(v6);
  *(_BYTE *)(a3 + 6) = BYTE6(a3) ^ BYTE6(RtlpHpHeapGlobals);
  if( WORD2(v6) )
  {
    v8 = a3 - 16i64 * WORD2(v6);
    v9 = RtlpHpHeapGlobals ^ v8 ^ *(_QWORD *)v8;
    if( (v9 & 0xFF000000000000i64) == 0 )
    {
      RtlRbRemoveNode((UINT64 *)(a1 + 16), v8 + 8);
      v10 = RtlpHpHeapGlobals ^ v8 ^ *(_DWORD *)v8;
      v11 = (v8 - a2 + 4127) & 0xFFFFF000;
      v4 = v8;
      v12 = 16 * HIWORD(v10);
      v13 = ((v8 + v12 - a2) & 0xFFFFF000) - v11;
      v14 = v11 < (((_DWORD)v8 + (_DWORD)v12 - (_DWORD)a2) & 0xFFFFF000);
      a1 = v27;
      if( !v14 )
        v13 = 0;
      *(_QWORD *)(v27 + 56) -= (unsigned int)(((v8 & 0xFFF) + v12 + 4095) >> 12)
                             + (v13 >> 12)
                             - (unsigned int)((unsigned __int64)(v12 + 4095) >> 12)
                             - (unsigned __int16)v10;
      v7 += WORD1(v9);
    }
  }
  v15 = a2 + 48;
  v16 = v4 + 16i64 * v7;
  if( v16 < a2 + 48 + 16 * (unsigned __int64)*(unsigned __int16 *)(a2 + 32) )
  {
    v17 = RtlpHpHeapGlobals ^ *(_QWORD *)v16 ^ v16;
    if( (v17 & 0xFF000000000000i64) == 0 )
    {
      RtlRbRemoveNode((UINT64 *)(a1 + 16), v16 + 8);
      v18 = v4 + 16 * v7;
      v19 = RtlpHpHeapGlobals ^ *(_DWORD *)v16 ^ v16;
      v20 = (v18 - a2 + 4127) & 0xFFFFF000;
      v21 = 16 * HIWORD(v19);
      v22 = ((v18 + v21 - a2) & 0xFFFFF000) - v20;
      v14 = v20 < ((v18 + (_DWORD)v21 - (_DWORD)a2) & 0xFFFFF000);
      a1 = v27;
      if( !v14 )
        v22 = 0;
      *(_QWORD *)(v27 + 56) -= (unsigned int)(((unsigned __int64)(v18 & 0xFFF) + v21 + 4095) >> 12)
                             + (v22 >> 12)
                             - (unsigned int)((unsigned __int64)(v21 + 4095) >> 12)
                             - (unsigned __int16)v19;
      v7 += WORD1(v17);
    }
  }
  if( (*(_DWORD *)(a1 + 176) & 1) != 0 )
  {
    v23 = v4 + 16i64 * v7;
    if( v23 < v15 + 16 * (unsigned __int64)*(unsigned __int16 *)(a2 + 32) )
    {
      v24 = RtlpHpHeapGlobals ^ *(_QWORD *)v23 ^ v23;
      if( (v24 & 0xFF000000000000i64) == 0 )
      {
        RtlpHpVsFreeChunkRemove(a1, a2, v23);
        v7 += WORD1(v24);
      }
    }
  }
  if( WORD1(v6) != v7 )
  {
    v25 = v4 + 16i64 * v7;
    *(_WORD *)(v4 + 2) = WORD1(RtlpHpHeapGlobals) ^ v7 ^ WORD1(v4);
    if( v25 < v15 + 16 * (unsigned __int64)*(unsigned __int16 *)(a2 + 32) )
      *(_WORD *)(v25 + 4) = WORD2(RtlpHpHeapGlobals) ^ v7 ^ WORD2(v25);
  }
  *(_DWORD *)a4 = v7;
  return v4;
}

Referenced by:

RtlpHpVsChunkFree
RtlpHpVsContextFree