MiIsSubsectionClean

_MI_SUBSECTION_STATUS __stdcall MiIsSubsectionClean(_MSUBSECTION *MappedSubsection){
  _MI_SUBSECTION_STATUS v1; 
  _MMPTE *SubsectionBase; 
  _MMPTE *v3; 
  ULONG_PTR v4; 
  _MMPFN *v5; 
  _MMPFN *v6; 
  char v7; 
  char v8; 
  UINT8 PageIrql; 

  v1 = MiSubsectionClean;
  if( !MappedSubsection->NumberOfPfnReferences )
    return 0;
  SubsectionBase = MappedSubsection->Core.SubsectionBase;
  v3 = &SubsectionBase[MappedSubsection->Core.PtesInSubsection];
  if( !MappedSubsection->Core.ControlArea->NumberOfPfnReferences )
    return 0;
  PageIrql = 17;
  v4 = 0;
  if( SubsectionBase >= v3 )
    return v1;
  while( ((unsigned __int16)SubsectionBase & 0xFFF) == 0 || PageIrql == 17 )
  {
    if( PageIrql != 17 )
      MiUnlockProtoPoolPage(v4, PageIrql);
    v5 = MiCheckProtoPtePageState(SubsectionBase, &PageIrql);
    v4 = (unsigned int)v5;
    if( v5 )
      break;
    SubsectionBase = (_MMPTE *)(((unsigned __int64)SubsectionBase & 0xFFFFFFFFFFFFF000ui64) + 4096);
LABEL_15:
    if( SubsectionBase >= v3 )
      goto LABEL_20;
  }
  v6 = MiLockLeafPage(SubsectionBase, 0i64);
  if( !v6 )
  {
LABEL_14:
    ++SubsectionBase;
    goto LABEL_15;
  }
  if( (MI_READ_PTE_LOCK_FREE((INT64)SubsectionBase) & 1) == 0 )
  {
    if( v6->u3.ReferenceCount )
    {
      _InterlockedAnd64(&v6->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
      v1 = MiSubsectionUnknown;
      goto LABEL_20;
    }
    v7 = *((_BYTE *)&v6->u3 + 2);
    _InterlockedAnd64(&v6->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    if( (v7 & 0x18) != 0 )
    {
      v1 = MiSubsectionDirty;
      goto LABEL_20;
    }
    goto LABEL_14;
  }
  v8 = *((_BYTE *)&v6->u3 + 2);
  _InterlockedAnd64(&v6->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  v1 = 2 - ((v8 & 0x18) != 0);
LABEL_20:
  if( PageIrql != 17 )
    MiUnlockProtoPoolPage(v4, PageIrql);
  return v1;
}

Referenced by:

MiDeleteCachedSubsection