RtlFindClearRunsEx
INT64 __fastcall RtlFindClearRunsEx(UINT64 *a1, INT64 a2){
UINT64 v2;
unsigned __int8 *v3;
UINT64 v4;
int v5;
unsigned int v6;
unsigned int v8;
__int64 v9;
unsigned __int64 v10;
__int64 v11;
unsigned __int64 v12;
int v13;
unsigned __int8 v14;
__int64 v15;
unsigned int v16;
unsigned __int8 v17;
unsigned int v18;
unsigned int v19;
__int64 v20;
_QWORD *k;
unsigned int v23;
unsigned int v24;
__int64 v25;
_QWORD *i;
__int64 v27;
__int64 v28;
int v29;
char j;
unsigned int v31;
int v32;
unsigned int v33;
__int64 v34;
_QWORD *v35;
unsigned __int8 *v36;
unsigned int v37;
v2 = *a1;
v3 = (unsigned __int8 *)a1[1];
v4 = v2 & 7;
v5 = 0;
v6 = 0;
v37 = 0;
v8 = 0;
LODWORD(v9) = 0;
v10 = (v2 >> 3) + ((v2 & 7) != 0);
if( v10 )
{
v11 = 0i64;
v12 = v10 - 1;
v13 = 0;
do
{
v14 = *v3++;
v36 = v3;
if( v11 == v12 && v4 )
v14 |= byte_14001A768[v4];
if( v14 )
{
v15 = *((unsigned __int8 *)RtlpBitsClearLow + v14);
v16 = v15 + v9;
if( v16 && (!v8 || *(_DWORD *)(a2 + 8i64 * (v8 - 1) + 4) < v16) )
{
v23 = v8 + 1;
if( v8 )
v23 = v8;
v8 = v23;
v24 = v23 - 2;
v25 = (int)(v23 - 2);
for( i = (_QWORD *)(a2 + 8 + 8 * v25); v25 >= 0 && *((_DWORD *)i - 1) < v16; --i )
{
--v24;
--v25;
*i = *(i - 1);
}
v27 = (int)v24;
v6 = v37;
*(_DWORD *)(a2 + 8 * v27 + 12) = v16;
*(_DWORD *)(a2 + 8 * v27 + 8) = v5;
}
v9 = *((unsigned __int8 *)RtlpBitsClearHigh + v14);
v5 = v13 - v9 + 8;
v17 = *((_BYTE *)qword_14001A770 - v9) | byte_14001DA00[v15] | v14;
if( v17 != 0xFF )
{
do
{
if( v8
&& *(_DWORD *)(a2 + 8i64 * (v8 - 1) + 4) >= (unsigned int)*((unsigned __int8 *)RtlpBitsClearAnywhere + v17) )
{
break;
}
v28 = *((unsigned __int8 *)RtlpBitsClearAnywhere + v17);
v29 = 0;
for( j = byte_14001DA00[v28]; ((unsigned __int8)j & v17) != 0; j *= 2 )
++v29;
v31 = v8 + 1;
v32 = *((unsigned __int8 *)RtlpBitsClearAnywhere + v17);
if( v8 )
v31 = v8;
v8 = v31;
v33 = v31 - 2;
v34 = (int)(v31 - 2);
v35 = (_QWORD *)(a2 + 8 + 8 * v34);
while( v34 >= 0 )
{
v32 = v28;
if( *((_DWORD *)v35 - 1) >= (unsigned int)v28 )
break;
--v33;
--v34;
*v35 = *(v35 - 1);
--v35;
}
v17 |= j;
*(_DWORD *)(a2 + 8i64 * (int)v33 + 12) = v32;
*(_DWORD *)(a2 + 8i64 * (int)v33 + 8) = v13 + v29;
}
while( v17 != 0xFF );
v5 = v13 - v9 + 8;
v6 = v37;
}
v3 = v36;
v12 = v10 - 1;
}
else
{
LODWORD(v9) = v9 + 8;
}
++v6;
v13 += 8;
v11 = v6;
v37 = v6;
}
while( v6 < v10 );
}
if( (_DWORD)v9 && (!v8 || *(_DWORD *)(a2 + 8i64 * (v8 - 1) + 4) < (unsigned int)v9) )
{
v18 = v8 + 1;
if( v8 )
v18 = v8;
v8 = v18;
v19 = v18 - 2;
v20 = (int)(v18 - 2);
for( k = (_QWORD *)(a2 + 8 + 8 * v20); v20 >= 0 && *((_DWORD *)k - 1) < (unsigned int)v9; --k )
{
--v19;
--v20;
*k = *(k - 1);
}
*(_DWORD *)(a2 + 8i64 * (int)v19 + 12) = v9;
*(_DWORD *)(a2 + 8i64 * (int)v19 + 8) = v5;
}
return v8;
}Referenced by:
RtlFindLongestRunClearEx