RtlpPopulateListIndex

VOID __stdcall RtlpPopulateListIndex(_HEAP *Heap, _HEAP_LIST_LOOKUP *ListLookup){
  unsigned int v4; 
  __int64 v5; 
  unsigned __int64 v6; 
  _HEAP *i; 
  unsigned __int64 MaxPreCommittThreshold_low; 
  _HEAP_LIST_LOOKUP *v9; 
  _LIST_ENTRY *ArraySize; 
  _HEAP_LIST_LOOKUP *ExtendedLookup; 
  int v12; 
  int v13; 
  unsigned int v14; 
  INT64 v15; 
  UINT64 Context; 

  Heap->BlocksIndex = ListLookup;
  if( ListLookup->ExtendedLookup )
  {
    v4 = ListLookup->ArraySize - ListLookup->BaseIndex - 1;
    v5 = 2 * v4;
    if( !ListLookup->ExtraItem )
      v5 = v4;
    ListLookup->ListHints[v5] = 0i64;
    v6 = (unsigned __int64)(ListLookup->ArraySize - ListLookup->BaseIndex - 1) >> 5;
    ListLookup->ListsInUseUlong[v6] &= ~(1 << ((LOBYTE(ListLookup->ArraySize) - LOBYTE(ListLookup->BaseIndex) - 1) & 0x1F));
  }
  for( i = (_HEAP *)Heap->FreeLists.Blink;
        &Heap->FreeLists != (_LIST_ENTRY *)i;
        i = (_HEAP *)i->Segment.Entry.UnpackedEntry.CompactHeader )
  {
    if( Heap->EncodeFlagMask )
    {
      LODWORD(i[-1].TuningParameters.MaxPreCommittThreshold) ^= Heap->Encoding.UnpackedEntry.SubSegmentCode;
      if( BYTE3(i[-1].TuningParameters.MaxPreCommittThreshold) != (LOBYTE(i[-1].TuningParameters.MaxPreCommittThreshold) ^ (unsigned __int8)(BYTE1(i[-1].TuningParameters.MaxPreCommittThreshold) ^ BYTE2(i[-1].TuningParameters.MaxPreCommittThreshold))) )
        RtlpAnalyzeHeapFailure(Heap, (_HEAP_ENTRY *)&i[-1].TuningParameters);
    }
    MaxPreCommittThreshold_low = LOWORD(i[-1].TuningParameters.MaxPreCommittThreshold);
    v9 = ListLookup;
    ArraySize = (_LIST_ENTRY *)ListLookup->ArraySize;
    if( MaxPreCommittThreshold_low < (unsigned __int64)ArraySize )
    {
LABEL_12:
      v12 = LOWORD(i[-1].TuningParameters.MaxPreCommittThreshold);
    }
    else
    {
      while( 1 )
      {
        ExtendedLookup = v9->ExtendedLookup;
        if( !v9->ExtendedLookup )
          break;
        v9 = v9->ExtendedLookup;
        if( MaxPreCommittThreshold_low < ExtendedLookup->ArraySize )
          goto LABEL_12;
      }
      v12 = v9->ArraySize - 1;
    }
    if( ListLookup->ExtendedLookup )
    {
      v13 = (_DWORD)ArraySize - 1;
      if( (unsigned int)MaxPreCommittThreshold_low < (unsigned int)ArraySize )
        v13 = LOWORD(i[-1].TuningParameters.MaxPreCommittThreshold);
      LODWORD(Context) = v13;
      RtlpHeapRemoveListEntry(Heap, ListLookup, ArraySize, (UINT64)i, Context);
    }
    LODWORD(Context) = v12;
    RtlpHeapAddListEntry(Heap, v9, ArraySize, (UINT64)i, Context);
    if( RtlpHeapErrorHandlerThreshold >= 1 )
    {
      v14 = v9->ListsInUseUlong[(unsigned __int64)(v12 - v9->BaseIndex) >> 5];
      if( !_bittest((const int *)&v14, ((_BYTE)v12 - LOBYTE(v9->BaseIndex)) & 0x1F) )
      {
        DbgPrint("RtlpGetBitState(LookupTable, (ULONG)(LookupIndex - LookupTable->BaseIndex))");
        RtlpHeapHandleError(v15);
      }
    }
    if( Heap->EncodeFlagMask )
    {
      BYTE3(i[-1].TuningParameters.MaxPreCommittThreshold) = LOBYTE(i[-1].TuningParameters.MaxPreCommittThreshold) ^ BYTE1(i[-1].TuningParameters.MaxPreCommittThreshold) ^ BYTE2(i[-1].TuningParameters.MaxPreCommittThreshold);
      LODWORD(i[-1].TuningParameters.MaxPreCommittThreshold) ^= Heap->Encoding.UnpackedEntry.SubSegmentCode;
    }
  }
}

Referenced by:

RtlCreateHeap