RtlpFindUCREntry
_LIST_ENTRY *__stdcall RtlpFindUCREntry(_HEAP *Heap, UINT64 Size){
INT64 v3;
unsigned int *UCRIndex;
UINT64 i;
unsigned int *v6;
_LIST_ENTRY *result;
_LIST_ENTRY *p_UCRList;
if( RtlpHeapErrorHandlerThreshold >= 1 && ((Size + 4095) & 0xFFFFFFFFFFFFF000ui64) != Size )
{
DbgPrint("(ROUND_UP_TO_POWER2(Size, PAGE_SIZE) == Size)", Size, Size);
RtlpHeapHandleError(v3);
}
UCRIndex = (unsigned int *)Heap->UCRIndex;
if( UCRIndex )
{
for( i = UCRIndex[2]; Size >> 12 >= i; i = v6[2] )
{
v6 = *(unsigned int **)UCRIndex;
if( !*(_QWORD *)UCRIndex )
break;
UCRIndex = *(unsigned int **)UCRIndex;
}
return(_LIST_ENTRY *)RtlpHeapFindListLookupEntry((_LIST_ENTRY *)Heap, (UINT64)UCRIndex);
}
else
{
p_UCRList = &Heap->UCRList;
for( result = p_UCRList->Flink; p_UCRList != result; result = result->Flink )
{
if( result[2].Blink >= (_LIST_ENTRY *)Size )
return result;
}
return p_UCRList;
}
}Referenced by:
RtlpFindAndCommitPages
RtlpInsertUCRBlock