MiMakeProtoAddressValid
_MMPFN *__stdcall MiMakeProtoAddressValid(VOID *VirtualAddress){
UINT64 *v2;
UINT64 v3;
__int64 v4;
_MMPFN *v5;
UINT8 v6;
UINT64 v7;
unsigned __int64 v8;
UINT64 v10;
v2 = (unsigned __int64 *)((char *)&MmGetPteBase()->u.Long + (((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64));
while( 1 )
{
do
{
v3 = *v2;
v10 = v3;
if( (v3 & 1) == 0 )
goto LABEL_9;
MiPteInShadowRange((UINT64)&v10);
v4 = (v3 >> 12) & 0xFFFFFFFFFi64;
}
while( (MmGetPfnDb()[v4].u4._bf_0 & 0x4000000000000i64) == 0 );
if( (v10 & 0x200) == 0 )
break;
LABEL_9:
MmAccessFault(2ui64, VirtualAddress, 0, 0i64);
}
v5 = &MmGetPfnDb()[v4];
v6 = MiLockPageInline(v5);
v7 = *v2;
v8 = v6;
v10 = v7;
if( (v7 & 1) == 0 || (v7 & 0x200) != 0 || v4 != ((v7 >> 12) & 0xFFFFFFFFFi64) )
{
_InterlockedAnd64(&v5->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v6);
goto LABEL_9;
}
MiAddLockedPageCharge(v5, 1ui64);
_InterlockedAnd64(&v5->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v8);
return v5;
}Referenced by:
MiLockProtoPage