RtlCSparseBitmapFindBitSetCapped
UINT64 __fastcall RtlCSparseBitmapFindBitSetCapped(INT64 rcx0, UINT64 a2, INT64 a3){
unsigned __int64 v6;
__int64 v7;
__int64 v8;
__int64 v9;
const signed __int64 *v10;
__int64 v11;
UINT64 v12;
UINT64 v15;
__int64 v16;
_QWORD a1[2];
*(_OWORD *)a1 = 0i64;
while( a3 )
{
v6 = a2 & 0x7FFF;
v7 = a3;
v8 = v6 + a3;
if( a3 < 0 )
{
v7 = ~v6;
if( v8 >= 0 )
v7 = a3;
}
else if( v8 > 0x8000 )
{
v7 = 0x8000 - v6;
}
if( _bittest64((const signed __int64 *)(rcx0 + 56), a2 >> 30) )
{
if( _bittest64(*(const signed __int64 **)rcx0, a2 >> 15) )
{
v9 = 1i64;
if( v7 > 1 )
v9 = v7;
v10 = (const signed __int64 *)(*(_QWORD *)(rcx0 + 8) + (((__int64)a2 / 0x8000) << 12));
a1[0] = v6 + v9;
a1[1] = v10;
if( _bittest64(v10, v6) )
{
v11 = 0i64;
}
else
{
v12 = a2 & 0x7FFF;
v11 = v7 <= 0 ? -(__int64)RtlLengthCurrentClearRunBackwardEx((INT64)a1, v12, -v7) : RtlLengthCurrentClearRunForwardEx(
a1,
v12);
}
if( (__int64)abs64(v11) < (__int64)abs64(v7) )
return v6 + v11 + (((__int64)a2 / 0x8000) << 15);
}
}
else
{
v15 = a2 & 0x3FFFFFFF;
v7 = a3;
v16 = v15 + a3;
if( a3 >= 0 )
{
if( v16 > 0x40000000 )
v7 = 0x40000000 - v15;
}
else
{
v7 = ~(unsigned __int64)(unsigned int)v15;
if( v16 >= 0 )
v7 = a3;
}
}
a2 += v7;
a3 -= v7;
}
return -1i64;
}Referenced by:
RtlSparseArrayElementAllocated
RtlSparseArrayElementFindCapped