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