MiCheckSystemPageTables
NTSTATUS __stdcall MiCheckSystemPageTables(UINT64 *FaultStatus){
__int64 v2;
VOID ***i;
VOID *v4;
int v6;
UINT64 v7;
unsigned int v8;
int v9;
_MMPTE *v10;
PVOID BugCheckParameter4;
v2 = 3i64;
for( i = (VOID ***)(FaultStatus + 6); ; --i )
{
v4 = **i;
if( ((unsigned __int8)v4 & 1) == 0 )
KeBugCheckEx(0x50u, (PVOID)*FaultStatus, (PVOID)FaultStatus[1], (PVOID)FaultStatus[2], (PVOID)0xD);
if( (char)v4 < 0 )
break;
if( !--v2 )
return 0;
}
if( (FaultStatus[1] & 2) == 0 || ((unsigned __int16)v4 & 0x800) != 0 )
{
MiCheckSystemNxFault((UINT64)FaultStatus, v4, (VOID *)6, (_MMPTE)i, (UINT64)BugCheckParameter4);
v7 = FaultStatus[2];
if( (v7 & 1) != 0 )
{
v8 = *(unsigned __int8 *)(v7 & 0xFFFFFFFFFFFFFFFEui64);
if( (unsigned __int8)v8 <= 6u )
{
v9 = 74;
if( _bittest(&v9, v8) )
return 1;
}
}
else if( KeInvalidAccessAllowed((VOID *)v7) == 1 )
{
return 1;
}
v10 = (_MMPTE *)*FaultStatus;
if( *FaultStatus >= (unsigned __int64)MmGetPteBase() && v10 <= MmGetPteLimit() )
KeBugCheckEx(0x50u, v10, (PVOID)FaultStatus[1], (PVOID)FaultStatus[2], (PVOID)8);
return 1;
}
LOBYTE(v6) = MiGenerateAccessViolation(FaultStatus);
if( !v6 )
KeBugCheckEx(0xBEu, (PVOID)*FaultStatus, v4, (PVOID)FaultStatus[2], (PVOID)0x10);
return 2;
}Referenced by:
MiSystemFault