MiCheckProtoPtePageState
_MMPFN *__stdcall MiCheckProtoPtePageState(VOID *ProtoPte, UINT8 *PageIrql){
UINT8 *v3;
unsigned __int64 *v4;
union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4;
unsigned __int64 v6;
unsigned __int64 v7;
_MMPFN *PfnDb;
__int64 v9;
_MMPFN *v10;
unsigned __int8 CurrentIrql;
unsigned __int64 v12;
_MMPTE *v13;
char v14;
_MMPFN *result;
int v16;
__int64 v17[9];
UINT64 SpinCount;
UINT64 v19;
v3 = PageIrql;
v4 = (unsigned __int64 *)((char *)&MmGetPteBase()->u.Long + (((unsigned __int64)ProtoPte >> 9) & 0x7FFFFFFFF8i64));
while( 2 )
{
while( 2 )
{
p_u4 = &MmGetPfnDb()->u4;
do
{
while( 1 )
{
v6 = *v4;
v17[0] = v6;
if( (v6 & 1) != 0 )
break;
if( (v6 & 0x400) != 0 || (v6 & 0x800) == 0 )
goto LABEL_20;
LOBYTE(v16) = MiInvalidPteConforms(v6, (INT64 *)PageIrql);
if( v16 )
{
if( *(&stru_140C4DB30 + 42) && (v6 & 0x10) == 0 )
v6 &= ~*(&stru_140C4DB30 + 42);
goto LABEL_6;
}
}
if( (v6 & 0x200) != 0 )
goto LABEL_20;
MiPteInShadowRange((UINT64)v17);
v7 = 2i64;
PfnDb = MmGetPfnDb();
LABEL_6:
v9 = (v6 >> 12) & 0xFFFFFFFFFi64;
PageIrql = (UINT8 *)(6 * v9);
}
while( (p_u4[6 * v9]._bf_0 & 0x4000000000000i64) == 0 );
v10 = &PfnDb[v9];
CurrentIrql = KeGetCurrentIrql();
__writecr8(v7);
LODWORD(v19) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v10->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v19);
while( v10->u2._bf_0 < 0 );
}
*v3 = CurrentIrql;
if( *v4 != v17[0] )
{
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
continue;
}
break;
}
if( (*v4 & 1) == 0 )
{
if( (*(_BYTE *)(&v10->u3 + 1) & 7u) >= 6 )
{
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
MmAccessFault(2ui64, ProtoPte, 0, 0i64);
continue;
}
LABEL_29:
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(CurrentIrql);
LABEL_20:
result = 0i64;
*v3 = 17;
return result;
}
break;
}
if( (v10->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) == 1 )
goto LABEL_29;
if( !MiAreChargesNeededToLockPage(v10) || MiChargeForLockedPage(v10, 1ui64) )
++v10->u3.ReferenceCount;
v12 = *v3;
v13 = (_MMPTE *)(v10->PteLong | 0x8000000000000000ui64);
v14 = *((_BYTE *)&v10->u3 + 2);
for( LODWORD(SpinCount) = 0; (v14 & 0x20) != 0; v14 = *((_BYTE *)&v10->u3 + 2) )
{
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( (_BYTE)v12 != 17 )
__writecr8(v12);
LODWORD(SpinCount) = 0;
while( (*(_BYTE *)(&v10->u3 + 1) & 0x20) != 0 )
KeYieldProcessorEx(&SpinCount);
MiLockPageInline(v10);
}
*((_BYTE *)&v10->u3 + 2) = v14 | 0x20;
if( (v10->u2._bf_0 & 0x4000000000000000i64) == 0 && (v13->u.Long & 0x20) == 0 )
MiWriteValidPteVolatile(v13, 1ui64);
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
return v10;
}Referenced by:
MiAnyProtosAreMapped
MiFlushSectionInternal
MiIsSubsectionClean
MiPurgeFileOnlyPfn
MiPurgeSubsection
MiWalkEntireImage
MmPurgeSection