RtlFindNextForwardRunClearEx
UINT64 __fastcall RtlFindNextForwardRunClearEx(INT64 a1, UINT64 a2, UINT64 *a3){
unsigned __int64 v3;
unsigned __int64 v5;
__int64 v8;
_DWORD *v9;
_DWORD *v10;
UINT64 v11;
unsigned __int64 v12;
_DWORD *v13;
unsigned __int64 i;
v3 = *(_QWORD *)a1;
v5 = a2;
if( *(_QWORD *)a1 > a2 )
{
v8 = *(_QWORD *)(a1 + 8);
v9 = (_DWORD *)(v8 + 4 * ((v3 - 1) >> 5));
v10 = (_DWORD *)(v8 + 4 * (a2 >> 5));
if( v10 != v9 && (*v10 | *((_DWORD *)qword_140011CE0 + (a2 & 0x1F))) == -1 )
{
v5 = (a2 & 0xFFFFFFFFFFFFFFE0ui64) + 32;
for( ++v10; v10 < v9 && *v10 == -1; ++v10 )
v5 += 32i64;
}
for( ; v5 < v3; ++v5 )
{
if( !_bittest64(*(const signed __int64 **)(a1 + 8), v5) )
break;
}
v11 = 0i64;
if( v10 != v9 )
{
v12 = v5 & 0x1F;
if( (~*((_DWORD *)qword_140011CE0 + v12) & *v10) == 0 )
{
v11 = 32 - v12;
if( v12 == 33 )
{
LABEL_23:
*a3 = v5;
return v11;
}
v13 = v10 + 1;
while( v13 < v9 && !*v13 )
{
++v13;
v11 += 32i64;
if( v11 == -1i64 )
goto LABEL_23;
}
}
}
for( i = v11 + v5; i < *(_QWORD *)a1; ++v11 )
{
if( _bittest64(*(const signed __int64 **)(a1 + 8), i) )
break;
if( v11 == -1i64 )
break;
++i;
}
goto LABEL_23;
}
*a3 = a2;
return 0i64;
}Referenced by:
IopLiveDumpMirrorPhysicalMemoryCallback
IopLiveDumpPopulateBitmapForDump
MiDeleteAweInfoPages
MiDeleteEmptyPageTableTail