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