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