RtlpPopulateListIndex

VOID __fastcall RtlpPopulateListIndex(INT64 a1, INT64 a2){
  unsigned int v4; 
  __int64 v5; 
  unsigned __int64 v6; 
  INT64 *i; 
  unsigned __int64 v8; 
  INT64 v9; 
  unsigned __int64 v10; 
  INT64 v11; 
  int v12; 
  int v13; 
  int v14; 
  INT64 v15; 
  UINT64 v16; 
  *(_QWORD *)(a1 + 312) = a2;
  if( *(_QWORD *)a2 )
  {
    v4 = *(_DWORD *)(a2 + 8) - *(_DWORD *)(a2 + 24) - 1;
    v5 = 2 * v4;
    if( !*(_DWORD *)(a2 + 12) )
      v5 = v4;
    *(_QWORD *)(*(_QWORD *)(a2 + 48) + 8 * v5) = 0i64;
    v6 = (unsigned __int64)(unsigned int)(*(_DWORD *)(a2 + 8) - *(_DWORD *)(a2 + 24) - 1) >> 5;
    *(_DWORD *)(*(_QWORD *)(a2 + 40) + 4 * v6) &= ~(1 << ((*(_BYTE *)(a2 + 8) - *(_BYTE *)(a2 + 24) - 1) & 0x1F));
  }
  for( i = *(INT64 **)(a1 + 344); (INT64 *)(a1 + 336) != i; i = (INT64 *)i[1] )
  {
    if( *(_DWORD *)(a1 + 124) )
    {
      *((_DWORD *)i - 2) ^= *(_DWORD *)(a1 + 136);
      if( *((_BYTE *)i - 5) != (*((_BYTE *)i - 8) ^ (unsigned __int8)(*((_BYTE *)i - 7) ^ *((_BYTE *)i - 6))) )
        RtlpAnalyzeHeapFailure(a1, (UINT64)(i - 2));
    }
    v8 = *((unsigned __int16 *)i - 4);
    v9 = a2;
    v10 = *(unsigned int *)(a2 + 8);
    if( v8 < v10 )
    {
LABEL_12:
      v12 = *((unsigned __int16 *)i - 4);
    }
    else
    {
      while( 1 )
      {
        v11 = *(_QWORD *)v9;
        if( !*(_QWORD *)v9 )
          break;
        v9 = *(_QWORD *)v9;
        if( v8 < *(unsigned int *)(v11 + 8) )
          goto LABEL_12;
      }
      v12 = *(_DWORD *)(v9 + 8) - 1;
    }
    if( *(_QWORD *)a2 )
    {
      v13 = v10 - 1;
      if( (unsigned int)v8 < (unsigned int)v10 )
        v13 = *((unsigned __int16 *)i - 4);
      LODWORD(v16) = v13;
      RtlpHeapRemoveListEntry(a1, a2, v10, i, v16, *((unsigned __int16 *)i - 4));
    }
    LODWORD(v16) = v12;
    RtlpHeapAddListEntry(a1, v9, v10, (INT64)i, v16, *((unsigned __int16 *)i - 4));
    if( RtlpHeapErrorHandlerThreshold >= 1 )
    {
      v14 = *(_DWORD *)(*(_QWORD *)(v9 + 40) + 4 * ((unsigned __int64)(unsigned int)(v12 - *(_DWORD *)(v9 + 24)) >> 5));
      if( !_bittest(&v14, ((_BYTE)v12 - *(_BYTE *)(v9 + 24)) & 0x1F) )
      {
        DbgPrint("RtlpGetBitState(LookupTable, (ULONG)(LookupIndex - LookupTable->BaseIndex))");
        RtlpHeapHandleError(v15);
      }
    }
    if( *(_DWORD *)(a1 + 124) )
    {
      *((_BYTE *)i - 5) = *((_BYTE *)i - 8) ^ *((_BYTE *)i - 7) ^ *((_BYTE *)i - 6);
      *((_DWORD *)i - 2) ^= *(_DWORD *)(a1 + 136);
    }
  }
}

Referenced by:

RtlCreateHeap