MiCheckProtoPtePageState
_MMPFN *__stdcall MiCheckProtoPtePageState(_MMPTE *ProtoPte, UINT8 *PageIrql){
unsigned __int64 *v4;
char *v5;
unsigned __int64 v6;
unsigned __int64 v7;
_MMPFN *PfnDb;
__int64 v9;
INT64 v10;
UINT8 CurrentIrql;
unsigned __int64 v12;
MMPTE *v13;
char v14;
_MMPFN *result;
__int64 v16[9];
UINT64 SpinCount;
UINT64 v18;
v4 = (unsigned __int64 *)((char *)MmGetPteBase() + (((unsigned __int64)ProtoPte >> 9) & 0x7FFFFFFFF8i64));
while( 2 )
{
while( 2 )
{
v5 = (char *)MmGetPfnDb() + 40;
do
{
while( 1 )
{
v6 = *v4;
v16[0] = v6;
if( (v6 & 1) != 0 )
break;
if( (v6 & 0x400) != 0 || (v6 & 0x800) == 0 )
goto LABEL_20;
if( MiInvalidPteConforms(v6) )
{
if( qword_140C4DC80 && (v6 & 0x10) == 0 )
v6 &= ~qword_140C4DC80;
goto LABEL_6;
}
}
if( (v6 & 0x200) != 0 )
goto LABEL_20;
MiPteInShadowRange((UINT64)v16);
v7 = 2i64;
PfnDb = MmGetPfnDb();
LABEL_6:
v9 = (v6 >> 12) & 0xFFFFFFFFFi64;
}
while( (*(_QWORD *)&v5[48 * v9] & 0x4000000000000i64) == 0 );
v10 = (INT64)PfnDb + 48 * v9;
CurrentIrql = KeGetCurrentIrql();
__writecr8(v7);
LODWORD(v18) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v10 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&v18);
while( *(__int64 *)(v10 + 24) < 0 );
}
*PageIrql = CurrentIrql;
if( *v4 != v16[0] )
{
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
continue;
}
break;
}
if( (*v4 & 1) == 0 )
{
if( (*(_BYTE *)(v10 + 34) & 7u) >= 6 )
{
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
MmAccessFault(2ui64, ProtoPte, 0, 0i64);
continue;
}
LABEL_29:
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
LABEL_20:
result = 0i64;
*PageIrql = 17;
return result;
}
break;
}
if( (*(_QWORD *)(v10 + 24) & 0x3FFFFFFFFFFFFFFFi64) == 1 )
goto LABEL_29;
if( !(unsigned int)MiAreChargesNeededToLockPage(v10) || (unsigned int)MiChargeForLockedPage(v10, 1) )
++*(_WORD *)(v10 + 32);
v12 = *PageIrql;
v13 = (MMPTE *)(*(_QWORD *)(v10 + 8) | 0x8000000000000000ui64);
v14 = *(_BYTE *)(v10 + 34);
for( LODWORD(SpinCount) = 0; (v14 & 0x20) != 0; v14 = *(_BYTE *)(v10 + 34) )
{
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
if( (_BYTE)v12 != 17 )
__writecr8(v12);
LODWORD(SpinCount) = 0;
while( (*(_BYTE *)(v10 + 34) & 0x20) != 0 )
KeYieldProcessorEx(&SpinCount);
MiLockPageInline(v10);
}
*(_BYTE *)(v10 + 34) = v14 | 0x20;
if( (*(_QWORD *)(v10 + 24) & 0x4000000000000000i64) == 0 && (*(_BYTE *)v13 & 0x20) == 0 )
MiWriteValidPteVolatile(v13, 1ui64);
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
return(_MMPFN *)v10;
}Referenced by:
MiAnyProtosAreMapped
MiFlushSectionInternal
MiIsSubsectionClean
MiPurgeFileOnlyPfn
MiPurgeSubsection
MiWalkEntireImage
MmPurgeSection