RtlpHpVsContextFree

INT64 __fastcall RtlpHpVsContextFree(INT64 a1, UINT64 a2, UINT64 a3, UINT64 a4, UINT64 *a5){
  char v6; 
  int v9; 
  INT64 v10; 
  unsigned int v11; 
  PSLIST_ENTRY v12; 
  _QWORD *v13; 
  int v14; 
  __int64 v15; 
  UINT64 v16; 
  _QWORD *v17; 
  UINT64 v18; 
  unsigned __int64 v19; 
  int v20; 
  int v21; 
  unsigned __int64 v22; 
  unsigned int i; 
  INT64 v24; 
  unsigned __int64 v25; 
  __int64 v26; 
  __int64 v27; 
  unsigned int v28; 
  UINT64 v29; 
  UINT64 v30; 
  unsigned __int64 v31; 
  _WORD *v32; 
  __int16 v33; 
  UINT64 v34; 
  unsigned __int64 v35; 
  bool v36; 
  unsigned __int64 v37; 
  union _SLIST_HEADER *v39; 
  int v40; 
  int v41; 
  INT64 v42; 
  int v43; 
  unsigned __int64 v44; 
  INT64 v45; 
  UINT64 v46; 
  INT64 v47[2]; 
  __int64 v48; 
  int v49; 
  UINT64 v50; 
  UINT64 v51; 
  UINT64 v52; 
  LODWORD(v52) = a4;
  v6 = a4;
  v9 = *(_DWORD *)(a1 + 176);
  v10 = a3 - 16;
  if( (v9 & 1) != 0 && (a3 & 0xFFF) == 0 )
    v10 = a3 - 32;
  if( !a2 )
  {
    v40 = DWORD1(RtlpHpHeapGlobals) ^ HIDWORD(v10) ^ HIDWORD(*(_QWORD *)v10);
    if( (v40 & 0xFF0000) != 0 )
    {
      v41 = (unsigned __int8)(RtlpHpHeapGlobals ^ v10 ^ *(_BYTE *)(v10 + 8));
    }
    else
    {
      if( (_WORD)v40 )
      {
        v42 = v10 - 16i64 * (unsigned __int16)((v10 ^ (unsigned __int64)RtlpHpHeapGlobals ^ *(_QWORD *)v10) >> 32);
        v43 = DWORD1(RtlpHpHeapGlobals) ^ HIDWORD(v42) ^ HIDWORD(*(_QWORD *)v42);
        if( (v43 & 0xFF0000) != 0 )
        {
          v41 = (unsigned __int8)(RtlpHpHeapGlobals ^ v42 ^ *(_BYTE *)(v42 + 8));
        }
        else if( (_WORD)v43 )
        {
          v42 -= 16i64 * (unsigned __int16)(((unsigned __int64)RtlpHpHeapGlobals ^ v42 ^ *(_QWORD *)v42) >> 32);
          v41 = (unsigned __int8)(RtlpHpHeapGlobals ^ v42 ^ *(_BYTE *)(v42 + 8));
        }
        else
        {
          v41 = 0;
        }
        v6 = v52;
        goto LABEL_64;
      }
      v41 = 0;
    }
    v42 = v10;
LABEL_64:
    a2 = (v42 - (unsigned int)(v41 << 12)) & 0xFFFFFFFFFFFFF000ui64;
  }
  if( (((unsigned __int16)(*(_WORD *)(a2 + 32) ^ *(_WORD *)(a2 + 34)) ^ 0x2BED) & 0x7FFF) != 0 )
  {
    RtlpLogHeapFailure(18i64, a1 ^ *(_QWORD *)(a1 + 128), a2, 0i64, 0i64, 0i64);
    return 0i64;
  }
  else if( ((v10 ^ (unsigned __int64)RtlpHpHeapGlobals ^ *(_QWORD *)v10) & 0xFF000000000000i64) != 0 )
  {
    v11 = 16 * (WORD1(RtlpHpHeapGlobals) ^ WORD1(v10) ^ *(unsigned __int16 *)(v10 + 2)) - 16;
    *(_DWORD *)a5 = v11;
    v12 = 0i64;
    if( (v9 & 4) != 0 && v11 < 0x1000 )
    {
      v39 = (union _SLIST_HEADER *)(a1 + 64);
      if( *(_WORD *)(a1 + 64) < 0x20u )
      {
        RtlpInterlockedPushEntrySList(v39, (PSLIST_ENTRY)(v10 + 16));
        return 1i64;
      }
      v12 = RtlpInterlockedFlushSList(v39);
    }
    v13 = (_QWORD *)(v10 + 16);
    *(_QWORD *)(v10 + 16) = v12;
    v14 = v6 & 1;
    v48 = 0i64;
    v49 = v14;
    *(_OWORD *)v47 = 0i64;
    if( (v6 & 1) == 0 )
      RtlpHpAcquireQueuedLockExclusive(a1, (UINT64 *)*(unsigned int *)(a1 + 8));
    if( v10 != -16 )
    {
      do
      {
        v15 = *(v13 - 2);
        v16 = (UINT64)(v13 - 2);
        v17 = v13;
        v13 = (_QWORD *)*v13;
        v18 = v16;
        v19 = ((unsigned __int64)RtlpHpHeapGlobals ^ v16 ^ v15) >> 32;
        v20 = v19 & 0xFF0000;
        if( (v19 & 0xFF0000) != 0 )
        {
          v21 = (unsigned __int8)(RtlpHpHeapGlobals ^ v16 ^ *((_BYTE *)v17 - 8));
        }
        else
        {
          if( !(_WORD)v19 )
            goto LABEL_84;
          v18 = v16 - 16i64 * (unsigned __int16)v19;
          v44 = ((unsigned __int64)RtlpHpHeapGlobals ^ v18 ^ *(_QWORD *)v18) >> 32;
          if( (v44 & 0xFF0000) != 0 )
          {
            v21 = (unsigned __int8)(RtlpHpHeapGlobals ^ v18 ^ *(_BYTE *)(v18 + 8));
          }
          else
          {
            if( !(_WORD)v44 )
            {
LABEL_84:
              v21 = 0;
              goto LABEL_14;
            }
            v18 -= 16i64 * (unsigned __int16)v44;
            v21 = (unsigned __int8)(RtlpHpHeapGlobals ^ v18 ^ *(_BYTE *)(v18 + 8));
          }
        }
LABEL_14:
        v22 = (v18 - (unsigned int)(v21 << 12)) & 0xFFFFFFFFFFFFF000ui64;
        if( (((unsigned __int16)(*(_WORD *)(v22 + 32) ^ *(_WORD *)(v22 + 34)) ^ 0x2BED) & 0x7FFF) != 0 )
        {
          RtlpLogHeapFailure(18i64, a1 ^ *(_QWORD *)(a1 + 128), v22, 0i64, 0i64, 0i64);
        }
        else if( v20 )
        {
          LODWORD(v50) = 0;
          for( i = 0; ; i = v28 )
          {
            v24 = RtlpHpVsChunkCoalesce(a1, v22, v16, &v50);
            v28 = v50;
            v16 = v24;
            if( (_DWORD)v50 == *(unsigned __int16 *)(v22 + 32) )
            {
              RtlpHpVsSubsegmentCleanup(a1, v22, v26, v27);
              if( !v14 )
                RtlpHpReleaseQueuedLockExclusive(*(unsigned int *)(a1 + 8), (INT64)v47);
              RtlpHpVsSubsegmentFree(a1, v22, (unsigned int)v52);
              if( !v14 )
                RtlpHpAcquireQueuedLockExclusive(a1, (UINT64 *)*(unsigned int *)(a1 + 8));
              goto LABEL_46;
            }
            if( (unsigned int)v50 <= i )
              break;
            LODWORD(v51) = 0;
            v46 = 0i64;
            RtlpHpVsChunkComputeCost(v24, v22, &v51, &v46);
            if( !(_DWORD)v51 )
              break;
            v29 = v46;
            if( !v46 )
              goto LABEL_26;
            v30 = v46 - ((v46 >> 1) & 0x5555555555555555i64);
            v25 = v30 & 0x3333333333333333i64;
            v31 = (0x101010101010101i64
                 * (((v30 & 0x3333333333333333i64)
                   + ((v30 >> 2) & 0x3333333333333333i64)
                   + (((v30 & 0x3333333333333333i64) + ((v30 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
            if( *(__int16 *)(v22 + 34) < 0 )
              goto LABEL_26;
            if( (*(_DWORD *)(a1 + 176) & 2) == 0 )
            {
              v25 = *(_QWORD *)(a1 + 48) >> 7;
              if( v25 <= 8 )
                v25 = 8i64;
              if( *(_QWORD *)(a1 + 56) + (unsigned __int64)(unsigned int)v31 <= v25 )
              {
LABEL_26:
                v14 = v49;
                break;
              }
            }
            v51 = 0x1000000000000i64;
            *(_BYTE *)(v16 + 6) = BYTE6(RtlpHpHeapGlobals) ^ BYTE6(v16) ^ 1;
            *(_DWORD *)(v16 + 8) = (unsigned __int8)(RtlpHpHeapGlobals ^ v16 ^ ((unsigned int)(v16 - v22) >> 12)) | 0x200;
            if( !v49 )
              RtlpHpReleaseQueuedLockExclusive(*(unsigned int *)(a1 + 8), (INT64)v47);
            LODWORD(v45) = 0;
            RtlpHpVsSubsegmentCommitPages(a1, v22, v29, (unsigned int)v31, v45);
            v14 = v49;
            if( !v49 )
              RtlpHpAcquireQueuedLockExclusive(a1, (UINT64 *)*(unsigned int *)(a1 + 8));
            *(_DWORD *)(v16 + 8) &= ~0x200u;
          }
          if( (*(_DWORD *)(a1 + 176) & 1) != 0 && ((v16 + 32) & 0xFFF) != 0 )
          {
            v32 = (_WORD *)RtlpHpVsChunkAlignSplit(v25, v22, v16);
            if( v32 )
              RtlpHpVsFreeChunkInsert((UINT64 *)a1, v22, v32);
          }
          LODWORD(v50) = 0;
          v51 = 0i64;
          v33 = RtlpHpVsChunkComputeCost(v16, v22, &v50, &v51);
          v34 = ((v51 - ((v51 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
              + (((v51 - ((v51 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64);
          *(_QWORD *)(a1 + 56) += (unsigned int)((0x101010101010101i64 * ((v34 + (v34 >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24;
          *(_WORD *)v16 = RtlpHpHeapGlobals ^ v16 ^ (v50
                                                   + v33
                                                   - ((0x101010101010101i64 * ((v34 + (v34 >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56));
          v35 = *(_QWORD *)(a1 + 16);
          if( (*(_QWORD *)(a1 + 24) & 1) != 0 && v35 )
            v35 ^= a1 + 16;
          v36 = 0;
          if( v35 )
          {
            while( 1 )
            {
              if( ((unsigned int)RtlpHpHeapGlobals ^ (unsigned int)v16 ^ *(_DWORD *)v16) < ((unsigned int)RtlpHpHeapGlobals ^ ((_DWORD)v35 - 8) ^ *(_DWORD *)(v35 - 8)) )
              {
                v37 = *(_QWORD *)v35;
                if( (*(_QWORD *)(a1 + 24) & 1) != 0 )
                {
                  if( !v37 )
                    goto LABEL_43;
                  v37 ^= v35;
                }
                if( !v37 )
                {
LABEL_43:
                  v36 = 0;
                  break;
                }
              }
              else
              {
                v37 = *(_QWORD *)(v35 + 8);
                if( (*(_QWORD *)(a1 + 24) & 1) != 0 )
                {
                  if( !v37 )
                    goto LABEL_44;
                  v37 ^= v35;
                }
                if( !v37 )
                {
LABEL_44:
                  v36 = 1;
                  break;
                }
              }
              v35 = v37;
            }
          }
          RtlRbInsertNodeEx((unsigned __int64 *)(a1 + 16), v35, v36, v16 + 8);
        }
        else
        {
          RtlpLogHeapFailure(8i64, a1 ^ *(_QWORD *)(a1 + 128), v16, 0i64, 0i64, 0i64);
        }
LABEL_46:
        ;
      }
      while( v13 );
    }
    if( !v14 )
      RtlpHpReleaseQueuedLockExclusive(*(unsigned int *)(a1 + 8), (INT64)v47);
    return 1i64;
  }
  else
  {
    RtlpLogHeapFailure(8i64, a1 ^ *(_QWORD *)(a1 + 128), a3, v10, 0i64, 0i64);
    return 0i64;
  }
}

Referenced by:

ExFreeHeapPool
RtlpFreeHeapInternal
RtlpHpSegFree