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