MiAccessCheck
NTSTATUS __stdcall MiAccessCheck(
MMPTE *PointerPte,
INT64 WriteOperation,
INT8 PreviousMode,
INT64 Protection,
PVOID TrapInformation,
INT8 PageLockHeld){
int v6;
INT64 v9;
INT64 v10;
char v11;
_MMPTE *PteBase;
unsigned __int64 v14;
_MMPFN *v15;
v6 = Protection;
if( PreviousMode == 1 )
{
PteBase = MmGetPteBase();
if( PointerPte > (_MMPTE *)((char *)PteBase + 0x3FFFFFFF78i64) || PointerPte < PteBase )
return -1073741819;
}
v9 = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
v10 = v9;
if( (v9 & 1) != 0 )
{
if( WriteOperation && (v9 & 0xA00) == 0 )
return -1073741819;
return 0;
}
v11 = v6;
if( *((char *)&MiReadWrite + (v6 & 7)) - (WriteOperation != 0) < 10 )
return -1073741819;
if( (v6 & 0xFFFFFFF8) != 16
|| ((unsigned __int8)TrapInformation & 1) != 0
&& *(_BYTE *)((unsigned __int64)TrapInformation & 0xFFFFFFFFFFFFFFFEui64) == 1 )
{
return 0;
}
if( !(unsigned int)MiAllowGuardFault(TrapInformation) )
return -1073741819;
if( (v10 & 0xC00) == 2048 )
{
if( PageLockHeld == 1 )
{
v14 = v10;
if( qword_140C4DC80 )
{
if( (v10 & 0x10) != 0 )
v14 = v10 & 0xFFFFFFFFFFFFFFEFui64;
else
v14 = v10 & ~qword_140C4DC80;
}
v15 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * ((v14 >> 12) & 0xFFFFFFFFFi64));
}
else
{
v15 = MiLockTransitionLeafPage(PointerPte, 0i64);
v10 = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
if( v15 )
*((_QWORD *)v15 + 2) = *((_QWORD *)v15 + 2) & 0xFFFFFFFFFFFFFC1Fui64 | (32i64 * (v11 & 0xF));
}
*(_QWORD *)PointerPte = v10 & 0xFFFFFFFFFFFFFC1Fui64 | (32i64 * (v11 & 0xF));
if( !PageLockHeld )
{
if( v15 )
_InterlockedAnd64((volatile signed __int64 *)v15 + 3, 0x7FFFFFFFFFFFFFFFui64);
}
}
else
{
*(_QWORD *)PointerPte = v10 & 0xFFFFFFFFFFFFFC1Fui64 | (32i64 * (v6 & 0xF));
}
return -2147483647;
}Referenced by:
MiDispatchFault