RtlFindNextForwardRunClearEx
UINT64 __stdcall RtlFindNextForwardRunClearEx(_RTL_BITMAP_EX *BitMapHeader, UINT64 FromIndex, UINT64 *StartingRunIndex){
unsigned __int64 SizeOfBitMap;
unsigned __int64 v5;
unsigned __int64 *Buffer;
_DWORD *v9;
_DWORD *v10;
UINT64 v11;
unsigned __int64 v12;
_DWORD *v13;
unsigned __int64 i;
SizeOfBitMap = BitMapHeader->SizeOfBitMap;
v5 = FromIndex;
if( BitMapHeader->SizeOfBitMap > FromIndex )
{
Buffer = BitMapHeader->Buffer;
v9 = (_DWORD *)Buffer + ((SizeOfBitMap - 1) >> 5);
v10 = (_DWORD *)Buffer + (FromIndex >> 5);
if( v10 != v9 && (*v10 | *((_DWORD *)qword_140011CE0 + (FromIndex & 0x1F))) == -1 )
{
v5 = (FromIndex & 0xFFFFFFFFFFFFFFE0ui64) + 32;
for( ++v10; v10 < v9 && *v10 == -1; ++v10 )
v5 += 32i64;
}
for( ; v5 < SizeOfBitMap; ++v5 )
{
if( !_bittest64((const signed __int64 *)BitMapHeader->Buffer, 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:
*StartingRunIndex = v5;
return v11;
}
v13 = v10 + 1;
while( v13 < v9 && !*v13 )
{
++v13;
v11 += 32i64;
if( v11 == -1i64 )
goto LABEL_23;
}
}
}
for( i = v11 + v5; i < BitMapHeader->SizeOfBitMap; ++v11 )
{
if( _bittest64((const signed __int64 *)BitMapHeader->Buffer, i) )
break;
if( v11 == -1i64 )
break;
++i;
}
goto LABEL_23;
}
*StartingRunIndex = FromIndex;
return 0i64;
}Referenced by:
IopLiveDumpMirrorPhysicalMemoryCallback
IopLiveDumpPopulateBitmapForDump
MiDeleteAweInfoPages
MiDeleteEmptyPageTableTail