MiRaisedIrqlFault
NTSTATUS __stdcall MiRaisedIrqlFault(
UINT64 FaultStatus,
PVOID VirtualAddress,
PVOID TrapInformation,
_MMPTE **PteHierarchy){
void *v5;
__int64 v6;
ULONG_PTR v7;
unsigned __int64 PdeBase;
unsigned __int64 PdeLimit;
_MMPTE *PteBase;
_BYTE *v12;
ULONG_PTR v13;
__int64 v14;
INT64 *i;
INT64 v16;
volatile signed __int64 *v17;
INT64 v18;
unsigned __int64 v19;
__int64 v20;
_MMPFN *PfnDb;
unsigned __int64 v22;
INT64 a2;
v5 = *(void **)(FaultStatus + 16);
if( ((unsigned __int8)v5 & 1) == 0 && KeInvalidAccessAllowed(v5) == 1 )
return -1073741819;
if( (*(_DWORD *)(FaultStatus + 80) & 0x20) != 0 )
KeBugCheckEx(0x50u, *(_QWORD *)FaultStatus, *(_QWORD *)(FaultStatus + 8), *(_QWORD *)(FaultStatus + 16), 0xEui64);
v6 = *((_QWORD *)KeGetCurrentPrcb() + 4095);
if( v6 && *(_DWORD *)(v6 + 12480) )
{
v7 = *(_QWORD *)FaultStatus;
if( KeGetCurrentIrql() != 2 )
KeBugCheckEx(0x50u, v7, *(_QWORD *)(FaultStatus + 8), KeGetCurrentIrql(), 0xAui64);
PdeBase = (unsigned __int64)MmGetPdeBase();
PdeLimit = (unsigned __int64)MmGetPdeLimit();
if( v7 < PdeBase || v7 > PdeLimit )
{
PteBase = MmGetPteBase();
if( (v7 < (unsigned __int64)PteBase + ((PdeBase >> 9) & 0x7FFFFFFFF8i64)
|| v7 > (unsigned __int64)PteBase + ((PdeLimit >> 9) & 0x7FFFFFFFF8i64))
&& (v7 < PdeBase + ((PdeBase >> 18) & 0x3FFFFFF8) || v7 > PdeBase + ((PdeLimit >> 18) & 0x3FFFFFF8)) )
{
KeBugCheckEx(0x50u, v7, *(_QWORD *)(FaultStatus + 8), *(_QWORD *)(FaultStatus + 16), 0xBui64);
}
}
return -1073741819;
}
v12 = (_BYTE *)(*(_QWORD *)(FaultStatus + 16) & 0xFFFFFFFFFFFFFFFEui64);
if( (*(_QWORD *)(FaultStatus + 16) & 1i64) != 0 && *v12 == 1 )
return -1073741819;
if( (*(_QWORD *)(FaultStatus + 16) & 1i64) == 0 )
{
if( KeInvalidAccessAllowed(*(PVOID *)(FaultStatus + 16)) != 1 )
goto LABEL_24;
return -1073741819;
}
if( *v12 == 3 || *v12 == 6 )
return -1073741819;
LABEL_24:
if( MiTransientCombineAddress((unsigned __int64)KeGetCurrentThread(), *(_QWORD *)FaultStatus) )
return -1073741819;
v13 = *(_QWORD *)FaultStatus;
if( *(_QWORD *)FaultStatus >= 0xFFFF800000000000ui64 )
{
v14 = 3i64;
for( i = (INT64 *)(FaultStatus + 48); ; --i )
{
v16 = MI_READ_PTE_LOCK_FREE(*i);
if( (v16 & 1) == 0 )
goto LABEL_36;
if( (v16 & 0x80u) != 0i64 )
{
if( (*(_BYTE *)(FaultStatus + 8) & 2) != 0 && (v16 & 0x800) == 0 )
KeBugCheckEx(0xBEu, v13, v16, *(_QWORD *)(FaultStatus + 16), 0xFui64);
MiCheckSystemNxFault(FaultStatus, v16, 3ui64);
v22 = *(_QWORD *)FaultStatus;
if( *(_QWORD *)FaultStatus >= (unsigned __int64)MmGetPteBase() && v22 <= (unsigned __int64)MmGetPteLimit() )
KeBugCheckEx(0x50u, v22, *(_QWORD *)(FaultStatus + 8), *(_QWORD *)(FaultStatus + 16), 8ui64);
return 0;
}
if( !v14 )
break;
--v14;
}
v17 = (volatile signed __int64 *)((char *)MmGetPteBase() + ((v13 >> 9) & 0x7FFFFFFFF8i64));
v18 = MI_READ_PTE_LOCK_FREE((INT64)v17);
a2 = v18;
v19 = v18;
if( (v18 & 1) != 0 )
{
if( (*(_BYTE *)(FaultStatus + 8) & 2) != 0 )
{
if( (v18 & 0x200) != 0 )
return -805306362;
if( (v18 & 0x800) == 0 )
KeBugCheckEx(0xBEu, v13, v18, *(_QWORD *)(FaultStatus + 16), 0xAui64);
}
MiCheckSystemNxFault(FaultStatus, a2, 0i64);
MiPteInShadowRange((UINT64)&a2);
v20 = (v19 >> 12) & 0xFFFFFFFFFi64;
PfnDb = MmGetPfnDb();
if( *((_WORD *)PfnDb + 24 * v20 + 16) > 1u
|| (*((_BYTE *)PfnDb + 48 * v20) & 1) == 0
|| (*((_BYTE *)PfnDb + 48 * v20 + 35) & 8) != 0 )
{
MiNoFaultFound(FaultStatus, v17, *(_QWORD *)FaultStatus, *(_QWORD *)(FaultStatus + 16), 1u, a2);
return 0;
}
}
LABEL_36:
if( MiGenerateAccessViolation((UINT64 *)FaultStatus) )
return -1073741819;
}
return -805306362;
}Referenced by:
MmAccessFault