RtlpInsertFreeBlock

VOID __fastcall RtlpInsertFreeBlock(INT64 a1, UINT64 a2, UINT64 a3){
  UINT64 v3; 
  UINT64 v4; 
  __int64 v5; 
  INT64 v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  char v10; 
  __int64 **v11; 
  unsigned __int16 v12; 
  char v13; 
  INT64 v14; 
  unsigned __int64 v15; 
  _DWORD *v16; 
  unsigned __int64 v17; 
  __int64 *Entry; 
  int v19; 
  int v20; 
  unsigned __int16 v21; 
  INT64 *v22; 
  __int64 **v23; 
  INT64 v24; 
  unsigned __int64 i; 
  INT64 v26; 
  int v27; 
  INT64 v28; 
  int v29; 
  char v30; 
  if( a3 )
  {
    v3 = a2;
    v5 = *(unsigned __int16 *)(a2 + 12);
    v4 = a3;
    LOWORD(v5) = *(_WORD *)(a1 + 140) ^ v5;
    if( !(_WORD)v5
      && RtlpHeapErrorHandlerThreshold >= 1
      && (*(_BYTE *)(v3 + 10) & 8) == 0
      && ((v3 + 4095) & 0xFFFFFFFFFFFFF000ui64) != v3 )
    {
      DbgPrint(
        "((FreeBlock->Flags & HEAP_ENTRY_DECOMMITTED) || (ROUND_UP_TO_POWER2(FreeBlock, PAGE_SIZE) == (ULONG_PTR)FreeBlock))",
        v5,
        a3,
        0i64);
      RtlpHeapHandleError(v7);
    }
    v8 = *(unsigned __int8 *)(v3 + 14);
    if( (_BYTE)v8 )
      v9 = (v3 & 0xFFFFFFFFFFFF0000ui64) - (v8 << 16) + 0x10000;
    else
      v9 = a1;
    v10 = *(_BYTE *)(v3 + 10);
    v11 = (__int64 **)(a1 + 336);
    v30 = v10;
    while( 1 )
    {
      if( v4 <= 0xFF00 )
      {
        v12 = v4;
      }
      else
      {
        v12 = -272;
        if( v4 != 65281 )
          v12 = -256;
      }
      v13 = 0;
      if( v4 <= 0xFF00 )
        v13 = v10;
      *(_BYTE *)(v3 + 10) = v13;
      *(_WORD *)(v3 + 12) = v5 ^ *(_WORD *)(a1 + 140);
      v14 = *(_QWORD *)(v9 + 40);
      if( v14 == v9 )
      {
        LOBYTE(v15) = 0;
      }
      else
      {
        v15 = ((v3 - v9) >> 16) + 1;
        if( v15 >= 0xFE )
          RtlpLogHeapFailure(3i64, v14, v3, v9, 0i64, 0i64);
      }
      *(_BYTE *)(v3 + 10) &= 0xF0u;
      *(_BYTE *)(v3 + 14) = v15;
      *(_WORD *)(v3 + 8) = v12;
      *(_BYTE *)(v3 + 11) = 0;
      *(_BYTE *)(v3 + 15) = 0;
      if( (*(_DWORD *)(a1 + 112) & 0x40) != 0 )
      {
        v16 = (_DWORD *)(v3 + 32);
        v17 = (16 * (unsigned __int64)v12 - 32) >> 2;
        if( v17 )
        {
          if( ((unsigned __int8)v16 & 4) != 0 )
          {
            --v17;
            *v16 = -17891602;
            v16 = (_DWORD *)(v3 + 36);
          }
          memset64(v16, 0xFEEEFEEEFEEEFEEEui64, v17 >> 1);
          if( (v17 & 1) != 0 )
            v16[v17 - 1] = -17891602;
        }
        *(_BYTE *)(v3 + 10) |= 4u;
      }
      if( *(_QWORD *)(a1 + 312) )
        Entry = RtlpFindEntry(a1, v12);
      else
        Entry = *v11;
      if( v11 != (__int64 **)Entry )
      {
        v19 = *(_DWORD *)(a1 + 124);
        do
        {
          if( v19 )
          {
            v20 = *((_DWORD *)Entry - 2);
            v19 = *(_DWORD *)(a1 + 124);
            LOWORD(v29) = v20;
            if( (v19 & v20) != 0 )
              v29 = *(_DWORD *)(a1 + 136) ^ v20;
            v21 = v29;
          }
          else
          {
            v21 = *((_WORD *)Entry - 4);
          }
          if( v12 <= (unsigned __int64)v21 )
            break;
          Entry = (__int64 *)*Entry;
        }
        while( v11 != (__int64 **)Entry );
      }
      v22 = (INT64 *)Entry[1];
      v23 = (__int64 **)(v3 + 16);
      if( (__int64 *)*v22 == Entry )
      {
        *v23 = Entry;
        *(_QWORD *)(v3 + 24) = v22;
        *v22 = (INT64)v23;
        Entry[1] = (__int64)v23;
      }
      else
      {
        RtlpLogHeapFailure(13i64, 0i64, (UINT64)Entry, 0i64, *v22, 0i64);
      }
      *(_QWORD *)(a1 + 192) += *(unsigned __int16 *)(v3 + 8);
      v24 = *(_QWORD *)(a1 + 312);
      if( v24 )
      {
        for( i = *(unsigned int *)(v24 + 8); ; i = *(unsigned int *)(v26 + 8) )
        {
          if( *(unsigned __int16 *)(v3 + 8) < i )
          {
            v27 = *(unsigned __int16 *)(v3 + 8);
            goto LABEL_50;
          }
          v26 = *(_QWORD *)v24;
          if( !*(_QWORD *)v24 )
            break;
          v24 = *(_QWORD *)v24;
        }
        v27 = *(_DWORD *)(v24 + 8) - 1;
LABEL_50:
        LODWORD(v28) = v27;
        RtlpHeapAddListEntry(a1, v24, (INT64)Entry, v3 + 16, v28, *(unsigned __int16 *)(v3 + 8));
      }
      if( *(_DWORD *)(a1 + 124) )
      {
        *(_BYTE *)(v3 + 11) = *(_BYTE *)(v3 + 8) ^ *(_BYTE *)(v3 + 9) ^ *(_BYTE *)(v3 + 10);
        *(_DWORD *)(v3 + 8) ^= *(_DWORD *)(a1 + 136);
      }
      v4 -= v12;
      LOWORD(v5) = v12;
      v3 += 16i64 * v12;
      if( v3 >= *(_QWORD *)(v9 + 72) )
        break;
      v10 = v30;
      v11 = (__int64 **)(a1 + 336);
      if( !v4 )
      {
        *(_WORD *)(v3 + 12) = v12 ^ *(_WORD *)(a1 + 140);
        return;
      }
    }
  }
}

Referenced by:

RtlpCreateSplitBlock
RtlpDeCommitFreeBlock
RtlpExtendHeap
RtlpFreeHeap
RtlpInitializeHeapSegment