MiTryLockProtoPoolPageAtDpc
_MMPFN *__stdcall MiTryLockProtoPoolPageAtDpc(_MMPTE *ProtoPte, UINT64 PageLockHeld){
_MMPFN **v2;
__int64 v3;
__int64 v4;
_MMPFN **v5;
_MMPTE *v7;
_MMPTE v8;
UINT64 v9;
__int64 v10;
int v11;
_MMPFN *v12;
_MMPTE v13;
char v14;
_MMPTE v16;
*v2 = 0i64;
v4 = v3;
v5 = v2;
v7 = (_MMPTE *)((char *)MmGetPteBase() + (((unsigned __int64)ProtoPte >> 9) & 0x7FFFFFFFF8i64));
v16.u.Long = v7->u.Long;
v8.u.Long = v16.u.Long;
if( (v16.u.Long & 1) == 0 )
return(_MMPFN *)3221435187i64;
MiPteInShadowRange((UINT64)&v16);
v10 = (v8.u.Long >> 12) & 0xFFFFFFFFFi64;
if( (((unsigned __int64)MmGetPfnDb()[v10].u4._bf_0 >> 50) & 1) == 0 )
return(_MMPFN *)3221225557i64;
v11 = 0;
v12 = &MmGetPfnDb()[v10];
if( _interlockedbittestandset64((volatile signed __int32 *)&v12->u2, 0x3Fui64) )
return(_MMPFN *)3221225557i64;
if( (v12->u2._bf_0 & 0x4000000000000000i64) != 0
|| (v13.u.Long = v7->u.Long, v16.u.Long = v13.u.Long, (v13.u.Long & 1) == 0)
|| (v13.u.Long & 0x200) != 0
|| v10 != ((v13.u.Long >> 12) & 0xFFFFFFFFFi64)
|| (*(_BYTE *)(&v12->u3 + 1) & 0x20) != 0 )
{
v11 = -1073741739;
}
else
{
if( (v16.u.Long & 0x20) == 0 )
MiWriteValidPteVolatile(v7, 1ui64);
if( !v4 || (v11 = (unsigned int)MiTryLockLeafPage(ProtoPte, v9), v11 >= 0) )
{
MiAddLockedPageCharge(v12, 1ui64);
v14 = *((_BYTE *)&v12->u3 + 2) | 0x20;
*v5 = v12;
*((_BYTE *)&v12->u3 + 2) = v14;
}
}
_InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
return(_MMPFN *)(unsigned int)v11;
}Referenced by:
MiCopyDataPageToImagePage
MiCopyFileOnlyGlobalSubsectionPage
MiCopyHeaderIfResident
MiGetPageProtection