RtlpHeapRemoveListEntry

INT64 *__fastcall RtlpHeapRemoveListEntry(INT64 a1, INT64 a2, INT64 a3, INT64 *a4, UINT64 a5, INT64 a6){
  __int64 v7; 
  unsigned int v8; 
  __int64 v10; 
  __int64 v11; 
  INT64 *result; 
  unsigned int v13; 
  unsigned int v14; 
  INT64 *v15; 
  v7 = *(_QWORD *)(a2 + 48);
  v8 = a5 - *(_DWORD *)(a2 + 24);
  v10 = 2 * v8;
  if( !*(_DWORD *)(a2 + 12) )
    v10 = v8;
  v11 = (unsigned int)v10;
  result = *(INT64 **)(v7 + 8 * v10);
  --*(_DWORD *)(a2 + 16);
  v13 = *(_DWORD *)(a2 + 8);
  v14 = v13 - 1;
  if( (_DWORD)a5 == v13 - 1 )
    --*(_DWORD *)(a2 + 20);
  if( result == a4 )
  {
    v15 = (INT64 *)*a4;
    result = *(INT64 **)(a2 + 32);
    if( *(_QWORD *)a2 )
      v14 = v13;
    if( (unsigned int)a5 >= v14 )
    {
      if( v15 != result )
      {
        *(_QWORD *)(v7 + 8 * v11) = v15;
        return result;
      }
      *(_QWORD *)(v7 + 8 * v11) = 0i64;
    }
    else
    {
      if( v15 != result && !(unsigned int)RtlpHeapListCompare(a1, (__int64)v15, a6, 1) )
      {
        result = *(INT64 **)(a2 + 48);
        result[v11] = (INT64)v15;
        return result;
      }
      *(_QWORD *)(*(_QWORD *)(a2 + 48) + 8 * v11) = 0i64;
    }
    result = *(INT64 **)(a2 + 40);
    *((_DWORD *)result + ((unsigned __int64)v8 >> 5)) &= ~(1 << (v8 & 0x1F));
  }
  return result;
}

Referenced by:

RtlZeroHeap
RtlpAllocateHeap
RtlpCoalesceFreeBlocks
RtlpCreateSplitBlock
RtlpPopulateListIndex