RtlpHeapFindListLookupEntry
INT64 *__fastcall RtlpHeapFindListLookupEntry(INT64 a1, INT64 a2, CHAR a3, INT64 a4, INT64 a5){
INT64 *v5;
unsigned int v6;
INT64 *v8;
int v9;
__int64 v12;
__int64 v13;
INT64 *i;
__int64 v15;
unsigned int *v16;
unsigned int v17;
int v18;
unsigned int v19;
__int64 v20;
v5 = *(INT64 **)(a2 + 32);
v6 = a4 - *(_DWORD *)(a2 + 24);
v8 = 0i64;
v9 = a4;
v12 = v5[1];
if( v5 == (INT64 *)v12 || (int)RtlpHeapListCompare(a1, v12, a5, a3) > 0 )
return v5;
if( (int)RtlpHeapListCompare(a1, *v5, a5, a3) <= 0 )
return(INT64 *)*v5;
if( *(_QWORD *)a2 || v9 != *(_DWORD *)(a2 + 8) - 1 )
{
v15 = v6 >> 5;
v16 = (unsigned int *)(*(_QWORD *)(a2 + 40) + 4 * v15);
v17 = *v16 & (-1 << (v6 & 0x1F));
if( v17 )
goto LABEL_20;
do
{
if( (unsigned int)v15 > ((unsigned int)(*(_DWORD *)(a2 + 8) - *(_DWORD *)(a2 + 24)) >> 5) - 1 )
break;
++v16;
LODWORD(v15) = v15 + 1;
v17 = *v16;
}
while( !*v16 );
if( v17 )
{
LABEL_20:
if( (_WORD)v17 )
{
if( (_BYTE)v17 )
v18 = *((unsigned __int8 *)RtlpBitsClearLow + (unsigned __int8)v17);
else
v18 = *((unsigned __int8 *)RtlpBitsClearLow + BYTE1(v17)) + 8;
}
else if( (v17 & 0xFF0000) != 0 )
{
v18 = *((unsigned __int8 *)RtlpBitsClearLow + BYTE2(v17)) + 16;
}
else
{
v18 = *((unsigned __int8 *)RtlpBitsClearLow + ((unsigned __int64)v17 >> 24)) + 24;
}
v19 = 32 * v15 + v18;
v20 = 2 * v19;
if( !*(_DWORD *)(a2 + 12) )
v20 = v19;
return *(INT64 **)(*(_QWORD *)(a2 + 48) + 8 * v20);
}
}
else
{
v13 = 2 * v6;
if( !*(_DWORD *)(a2 + 12) )
v13 = v6;
for( i = *(INT64 **)(*(_QWORD *)(a2 + 48) + 8 * v13); v5 != i; i = (INT64 *)*i )
{
if( (int)RtlpHeapListCompare(a1, (__int64)i, a5, a3) <= 0 )
return i;
}
}
return v8;
}Referenced by:
RtlpFindEntry
RtlpFindUCREntry