MiIsSubsectionClean

__int64 __fastcall MiIsSubsectionClean(__int64 a1, UINT64 a2){
  unsigned int v2; 
  unsigned __int64 v3; 
  unsigned __int64 v4; 
  _MMPFN *v5; 
  _MMPFN *v6; 
  char v7; 
  char v8; 
  UINT64 PageIrql; 
  v2 = 0;
  if( !*(_DWORD *)(a1 + 104) )
    return 0i64;
  v3 = *(_QWORD *)(a1 + 8);
  v4 = v3 + 8i64 * *(unsigned int *)(a1 + 44);
  if( !*(_QWORD *)(*(_QWORD *)a1 + 32i64) )
    return 0i64;
  LOBYTE(PageIrql) = 17;
  v5 = 0i64;
  if( v3 >= v4 )
    return v2;
  while( (v3 & 0xFFF) == 0 || (_BYTE)PageIrql == 17 )
  {
    LOBYTE(a2) = PageIrql;
    if( (_BYTE)PageIrql != 17 )
      MiUnlockProtoPoolPage(v5, a2);
    v5 = MiCheckProtoPtePageState((_MMPTE *)v3, (UINT8 *)&PageIrql);
    if( v5 )
      break;
    v3 = (v3 & 0xFFFFFFFFFFFFF000ui64) + 4096;
LABEL_15:
    if( v3 >= v4 )
      goto LABEL_20;
  }
  v6 = MiLockLeafPage((_MMPTE *)v3, 0i64);
  if( !v6 )
  {
LABEL_14:
    v3 += 8i64;
    goto LABEL_15;
  }
  if( (MI_READ_PTE_LOCK_FREE(v3) & 1) == 0 )
  {
    if( *((_WORD *)v6 + 16) )
    {
      _InterlockedAnd64((volatile signed __int64 *)v6 + 3, 0x7FFFFFFFFFFFFFFFui64);
      v2 = 2;
      goto LABEL_20;
    }
    v7 = *((_BYTE *)v6 + 34);
    _InterlockedAnd64((volatile signed __int64 *)v6 + 3, 0x7FFFFFFFFFFFFFFFui64);
    if( (v7 & 0x18) != 0 )
    {
      v2 = 1;
      goto LABEL_20;
    }
    goto LABEL_14;
  }
  v8 = *((_BYTE *)v6 + 34);
  _InterlockedAnd64((volatile signed __int64 *)v6 + 3, 0x7FFFFFFFFFFFFFFFui64);
  v2 = 2 - ((v8 & 0x18) != 0);
LABEL_20:
  LOBYTE(a2) = PageIrql;
  if( (_BYTE)PageIrql != 17 )
    MiUnlockProtoPoolPage(v5, a2);
  return v2;
}

Referenced by:

MiDeleteCachedSubsection