MiIterateOverPartitions
__int64 __fastcall MiIterateOverPartitions(void (__fastcall *a1)(__int64, __int64), __int64 a2){
unsigned int v2;
unsigned int v5;
unsigned int v6;
int v7;
char *v8;
unsigned int v9;
unsigned int v10;
char *v11;
__int64 i;
unsigned __int64 v13;
unsigned int v14;
__int64 result;
__int64 v16;
unsigned int SizeOfBitMap;
v2 = 0;
while( 1 )
{
v5 = v2 < qword_140C4E368->SizeOfBitMap ? v2 : 0;
v6 = qword_140C4E368->SizeOfBitMap - 1;
v7 = ((__int64)qword_140C4E368->Buffer & 4) != 0i64 ? 0x20 : 0;
v8 = (char *)qword_140C4E368->Buffer - (((__int64)qword_140C4E368->Buffer & 4) != 0 ? 4 : 0);
while( 1 )
{
v9 = v7 + v6;
v10 = v7 + v5;
if( v6 - v5 == -1 )
goto LABEL_17;
v11 = &v8[8 * ((unsigned __int64)v10 >> 6)];
for( i = ~*(_QWORD *)v11 | ((1i64 << (v10 & 0x3F)) - 1); i == -1; i = ~*(_QWORD *)v11 )
{
v11 += 8;
if( v11 > &v8[8 * ((unsigned __int64)v9 >> 6)] )
goto LABEL_17;
}
_BitScanForward64(&v13, ~i);
v14 = v13 + ((unsigned int)((v11 - v8) >> 3) << 6);
if( v14 > v9 )
{
LABEL_17:
v14 = -1;
}
else if( v14 != -1 )
{
break;
}
if( !v5 )
break;
SizeOfBitMap = v2 + 1;
if( v2 + 1 > qword_140C4E368->SizeOfBitMap )
SizeOfBitMap = qword_140C4E368->SizeOfBitMap;
v6 = SizeOfBitMap - 1;
v5 = 0;
}
result = v14 - v7;
if( v14 == -1 )
result = 0xFFFFFFFFi64;
if( (unsigned int)result < v2 || (_DWORD)result == -1 )
return result;
v2 = result + 1;
v16 = *(_QWORD *)(qword_140C4E388 + 8i64 * (unsigned int)result);
if( (*(_DWORD *)(v16 + 4) & 2) != 0 )
a1(v16, a2);
}
}Referenced by:
MiLockAllMemoryLists
MiMirrorBlackPhase
MiResumeFromHibernate
MiUnlockAllMemoryLists