MiLargePageFault
NTSTATUS __stdcall MiLargePageFault(UINT64 FaultStatus, PVOID VirtualAddress, PVOID TrapInformation, INT8 PreviousMode){
unsigned __int64 PteBase;
unsigned int v7;
__int64 v8;
unsigned __int64 v9;
signed __int64 v10;
__int64 v11;
INT64 v12;
UINT64 v13;
UINT64 v14;
INT64 v15;
__int64 v16;
_BYTE *v17;
unsigned __int64 v18;
_QWORD *VirtualFaultPageInfo;
__int64 v20;
unsigned __int64 v21;
__int64 i;
__int16 v23;
__int64 v24;
UINT64 v26[2];
int result;
__int16 result_4;
int v29;
__int64 v30;
__int64 v31;
memset((INT64)&result, 0i64);
PteBase = (unsigned __int64)MmGetPteBase();
v7 = 1;
v8 = 0x200000i64;
v9 = (__int64)(((__int64)(((_QWORD)VirtualAddress << 25) - (PteBase << 25)) >> 16 << 25) - (PteBase << 25)) >> 16;
while( v9 >= PteBase && v9 <= (unsigned __int64)MmGetPteLimit() )
{
++v7;
v9 = (__int64)((v9 << 25) - (PteBase << 25)) >> 16;
v8 <<= 9;
}
v10 = MI_READ_PTE_LOCK_FREE((INT64)VirtualAddress);
v11 = *(_QWORD *)(FaultStatus + 16);
v12 = v10;
v26[0] = v10;
if( (v11 & 1) != 0 && *(_BYTE *)(v11 & 0xFFFFFFFFFFFFFFFEui64) == 1 )
return 0;
if( (*(_DWORD *)(FaultStatus + 80) & 0x20) == 0 )
{
if( (*(_BYTE *)(FaultStatus + 8) & 2) != 0 )
{
if( (v10 & 0x800) == 0 )
return -1073741819;
if( (unsigned int)MiNoFaultFound(
FaultStatus,
(volatile signed __int64 *)VirtualAddress,
*(_QWORD *)FaultStatus,
v11,
0,
v10) )
{
result = 1;
v13 = *(_QWORD *)FaultStatus & -v8;
result_4 = 0;
v30 = 0i64;
v29 = 20;
v31 = 0i64;
MiInsertTbFlushEntry((INT64)&result, v13, 1i64, v7);
MiFlushTbList((__int64)&result);
}
}
v14 = v12;
if( (*(_BYTE *)(FaultStatus + 8) & 0x10) == 0 )
{
LABEL_24:
v16 = *(_QWORD *)(FaultStatus + 16);
if( (v16 & 1) != 0 )
{
v17 = (_BYTE *)(v16 & 0xFFFFFFFFFFFFFFFEui64);
if( *v17 == 5 )
{
if( (unsigned int)MiValidVirtualizationFault(
(unsigned __int64 *)FaultStatus,
(__int64)v17,
(__int64)VirtualAddress) )
{
v18 = *(_QWORD *)FaultStatus;
VirtualFaultPageInfo = (_QWORD *)MiGetVirtualFaultPageInfo((INT64)v17, *(_QWORD *)FaultStatus);
MiPteInShadowRange((UINT64)v26);
v20 = (v14 >> 12) & 0xFFFFFFFFFi64;
v21 = v18 >> 12;
for( i = 1i64; v7; --v7 )
{
v23 = v21;
v21 >>= 9;
v24 = i * (v23 & 0x1FF);
i <<= 9;
v20 += v24;
}
*VirtualFaultPageInfo ^= (v20 ^ *VirtualFaultPageInfo) & 0xFFFFFFFFFFFFFi64;
}
}
}
return 0;
}
if( v12 >= 0 )
{
if( (*(_DWORD *)(FaultStatus + 80) & 0x40) == 0 )
MiCheckSystemNxFault(FaultStatus, v12, 7ui64);
goto LABEL_24;
}
if( MiCanGrantExecute(*((_QWORD *)KeGetCurrentThread() + 23), *(_QWORD *)FaultStatus) )
{
MiPteInShadowRange((UINT64)v26);
if( ((*((_QWORD *)MmGetPfnDb() + 6 * (((unsigned __int64)v12 >> 12) & 0xFFFFFFFFFi64) + 5) >> 50) & 1) != 0 )
{
v14 = v26[0] & 0x7FFFFFFFFFFFFFFFi64;
v15 = v26[0] & 0x7FFFFFFFFFFFFFFFi64;
v26[0] &= ~0x8000000000000000ui64;
if( (MiFlags & 0x100) != 0 || (MiFlags & 0x200) != 0 )
{
v14 |= 0x20ui64;
v15 = v14;
v26[0] = v14;
}
MiWriteValidPteNewProtection((INT64 *)VirtualAddress, v15);
if( (MiFlags & 0x100) == 0 && (MiFlags & 0x200) == 0 )
KeFlushSingleTb(*(_QWORD *)FaultStatus, 1i64, 0i64);
goto LABEL_24;
}
}
}
return -1073741819;
}Referenced by:
MiInPagePageTable
MiUserFault