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