MmAccessFault
NTSTATUS __stdcall MmAccessFault(UINT64 FaultStatus, PVOID VirtualAddress, INT8 PreviousMode, PVOID TrapInformation){
ULONG_PTR v5;
PVOID v6;
ULONG_PTR v7;
unsigned __int64 v8;
_MMPTE *PteBase;
int v10;
unsigned int v11;
NTSTATUS FileExtents;
_MMPTE *v13;
UINT64 v14;
INT64 v15;
UINT64 v16;
INT64 v17;
char v18;
INT64 v19;
_ETHREAD *CurrentThread;
_ETHREAD *v22;
__int64 v23;
__int64 v24;
UINT64 v25;
NTSTATUS v26;
__int64 v27;
INT64 v28;
unsigned __int64 v29;
RTL_BALANCED_NODE *Address;
UINT64 v31;
_MMPTE *ProtoPteAddress;
char *v33;
__int64 v34;
char v35;
INT64 v36;
unsigned int v37;
int v38;
INT64 v39;
int v40;
_MMSUPPORT_INSTANCE *BugCheckParameter4;
UINT64 v42;
INT64 a7[2];
INT64 result[3];
__int128 v45;
UINT64 v46;
INT64 a2[2];
INT64 a4;
__int64 v49;
unsigned __int64 v50;
unsigned __int64 v51;
__int64 v52;
INT64 v53[2];
UINT64 v54[2];
__int128 P;
__int128 BugCheckParameter2;
__int128 a1;
a7[0] = 0i64;
v5 = (ULONG_PTR)TrapInformation;
v6 = VirtualAddress;
v7 = FaultStatus;
if( (FaultStatus & 9) == 9 )
KeBugCheckEx(0x1Au, 0x61941ui64, (ULONG_PTR)VirtualAddress, FaultStatus, (ULONG_PTR)TrapInformation);
if( (__int64)VirtualAddress >> 47 != -1 && (__int64)VirtualAddress >> 47 != 0 )
{
if( PreviousMode == 1 )
return -1073741819;
if( ((unsigned __int8)TrapInformation & 1) != 0 )
{
v37 = *(unsigned __int8 *)((unsigned __int64)TrapInformation & 0xFFFFFFFFFFFFFFFEui64);
if( (unsigned __int8)v37 <= 6u )
{
v38 = 74;
if( _bittest(&v38, v37) )
return -1073741819;
}
}
else if( KeInvalidAccessAllowed(TrapInformation) == 1 )
{
return -1073741819;
}
KeBugCheckEx(0x50u, (ULONG_PTR)v6, v7, v5, 4ui64);
}
if( (FaultStatus & 0x8000) != 0 )
{
if( PreviousMode == 1 )
return MiHandleEnclaveFault((UINT64)VirtualAddress);
else
return -1073740638;
}
*(_OWORD *)v53 = 0i64;
*(_OWORD *)v54 = 0i64;
v8 = ((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64;
PteBase = MmGetPteBase();
P = 0i64;
BugCheckParameter2 = 0i64;
a1 = 0i64;
v49 = (__int64)PteBase + v8;
v50 = (unsigned __int64)PteBase + ((((unsigned __int64)PteBase + v8) >> 9) & 0x7FFFFFFFF8i64);
v51 = (unsigned __int64)PteBase + ((v50 >> 9) & 0x7FFFFFFFF8i64);
v52 = (__int64)PteBase + ((v51 >> 9) & 0x7FFFFFFFF8i64);
v10 = 0;
if( (v7 & 0x40) != 0 )
{
v10 = 32;
v7 &= ~2ui64;
}
a2[1] = v7;
a2[0] = (INT64)v6;
a4 = (INT64)TrapInformation;
LODWORD(v54[1]) = ((unsigned __int8)v10 ^ (unsigned __int8)(PreviousMode << 6)) & 0x40 ^ v10;
if( KeGetCurrentIrql() > 1u )
return MiRaisedIrqlFault((UINT64)a2, PteBase, (PVOID)0x7FFFFFFFF8i64, (_MMPTE **)TrapInformation);
while( 1 )
{
v11 = 4096;
if( (unsigned __int64)v6 < 0xFFFF800000000000ui64
|| (v26 = MiSystemFault((INT64)a2), FileExtents = v26, v26 == 192) )
{
FileExtents = MiUserFault((UINT64 *)a2);
if( FileExtents != -1073741802 )
goto LABEL_19;
}
else if( v26 != -1073741802 )
{
goto LABEL_26;
}
FileExtents = MiDispatchFault(
(UINT64)a2,
a7,
v13,
v14,
BugCheckParameter4,
v42,
(VOID *)a7[0],
(_MMVAD *)a7[1],
result[0],
(_MMINPAGE_SUPPORT **)result[1]);
if( FileExtents == -1073741802 )
{
v29 = a2[0];
if( a2[0] < 0xFFFF800000000000ui64
&& *((_QWORD *)&P + 1) != ProtoPte
&& (!qword_140C4DB80 || *((_QWORD *)&P + 1) != qword_140C4DB80) )
{
Address = (RTL_BALANCED_NODE *)P;
if( !(_QWORD)P )
{
Address = MiLocateAddress(a2[0]);
v29 = a2[0];
*(_QWORD *)&P = Address;
}
v31 = 4i64;
if( (v54[1] & 0x100) != 0 )
v31 = 2i64;
ProtoPteAddress = MiGetProtoPteAddress((_MMVAD *)Address, v29 >> 12, v31, (_SUBSECTION **)&BugCheckParameter2);
if( !ProtoPteAddress )
{
MiReleaseFaultSynchronization((INT64)a2);
*((_QWORD *)&P + 1) = 0i64;
FileExtents = -1073741819;
goto LABEL_39;
}
if( *((_MMPTE **)&P + 1) != ProtoPteAddress )
*((_QWORD *)&P + 1) = ProtoPteAddress;
MiRetainSubsection(BugCheckParameter2);
}
LODWORD(v54[1]) &= ~0x100u;
FileExtents = 0;
}
else
{
v15 = a7[0];
if( a7[0] )
{
v27 = *(_QWORD *)(a7[0] + 256);
v11 = *(_DWORD *)(a7[0] + 312);
if( v27 )
v11 = *(_DWORD *)(v27 + 40);
if( PreviousMode == 1 )
*(_DWORD *)(a7[0] + 192) |= 0x40000u;
if( (*(_DWORD *)(v15 + 192) & 1) != 0 && *(int *)(v15 + 80) >= 0 )
{
FileExtents = MiFaultGetFileExtents((INT64)a2, v15);
*((_QWORD *)&P + 1) = 0i64;
goto LABEL_19;
}
FileExtents = MiIssueHardFault((INT64)a2, v15);
}
*((_QWORD *)&P + 1) = 0i64;
}
if( (v54[1] & 0x10) != 0 )
{
memset((INT64)result, 0i64);
v45 = *(_OWORD *)v53;
v46 = v54[0];
MiUnlockSystemVa((INT64)result);
LODWORD(v54[1]) &= ~0x10u;
}
else
{
v16 = v54[0];
v17 = v53[0];
if( v54[0] )
{
if( WORD1(v53[1]) )
{
MiEmptyDeferredWorkingSetEntries((INT64)v53);
v16 = v54[0];
}
MiUnlockPageTableInternal(v17, v16);
v18 = BYTE5(v53[1]) | 2;
v54[0] = 0i64;
BYTE5(v53[1]) |= 2u;
}
else
{
v18 = BYTE5(v53[1]);
}
if( (v18 & 1) != 0 )
MiUnlockWorkingSetExclusive(v17, BYTE4(v53[1]));
else
MiUnlockWorkingSetShared(v17, BYTE4(v53[1]));
}
LABEL_19:
if( (v54[1] & 1) != 0 )
MiDeprioritizeVad((UINT64 *)P, a2[0]);
if( *((_QWORD *)&BugCheckParameter2 + 1) )
{
if( *((_QWORD *)&BugCheckParameter2 + 1) == -1i64 )
{
MiReplenishTransitionPageHeatList();
}
else
{
MiProcessTransitionHeatBatch(*((INT64 *)&BugCheckParameter2 + 1));
MiFreeTransitionPageHeatList(*((PSLIST_ENTRY *)&BugCheckParameter2 + 1));
}
*((_QWORD *)&BugCheckParameter2 + 1) = 0i64;
}
if( (_QWORD)a1 )
{
v36 = (v54[1] & 0x40) != 0 ? 0i64 : 0x20000i64;
MiReplenishSlabAllocator(
a1,
*(_QWORD *)(qword_140C4E388 + 8i64 * (*(_WORD *)(*(_QWORD *)BugCheckParameter2 + 60i64) & 0x3FF)),
*((UINT64 *)&a1 + 1),
v36);
*(_QWORD *)&a1 = 0i64;
}
else if( (a4 & 1) != 0 && *(_BYTE *)(a4 & 0xFFFFFFFFFFFFFFFEui64) == 5 )
{
v39 = *(_QWORD *)((a4 & 0xFFFFFFFFFFFFFFFEui64) + 48);
if( v39 )
MiReplenishSlabAllocator(
v39,
*(_QWORD *)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(v53[0] + 174)),
1ui64,
0i64);
}
v19 = v53[0];
if( (*(_BYTE *)(v53[0] + 184) & 7) != 0 )
{
if( (*(_DWORD *)(v53[0] + 4) & 0xFFF) == 0 )
goto LABEL_63;
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( *((char *)CurrentThread + 195) >= 16
&& (*((_DWORD *)CurrentThread + 325) & 0xC) == 0
&& (*((_DWORD *)CurrentThread + 325) & 2) == 0 )
{
v19 = v53[0];
if( (__int64)(*(_QWORD *)(v53[0] + 120) - *(_QWORD *)(v53[0] + 112)) > 100 )
{
LABEL_63:
v28 = *(_QWORD *)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(v19 + 174));
if( v28 && !(unsigned int)MiSufficientAvailablePages(v28, 0x420ui64) )
KeDelayExecutionThread(0, 0, (PLARGE_INTEGER)&MiShortTime);
}
}
}
LABEL_26:
if( !FileExtents )
goto LABEL_29;
if( FileExtents == -1073740748 )
{
FileExtents = 0;
goto LABEL_29;
}
if( FileExtents >= 0 )
goto LABEL_29;
LABEL_39:
if( (unsigned int)MiIsRetryIoStatus((unsigned int)FileExtents, v11) )
{
v22 = (_ETHREAD *)KeGetCurrentThread();
if( (*((_BYTE *)v22 + 1304) & 4) != 0 || (*((_DWORD *)v22 + 325) & 0xC) != 0 )
{
FileExtents = -1073741801;
}
else if( (a4 & 1) != 0
&& *(_BYTE *)(a4 & 0xFFFFFFFFFFFFFFFEui64) == 5
&& (*(_DWORD *)((a4 & 0xFFFFFFFFFFFFFFFEui64) + 56) & 0xC) != 0 )
{
FileExtents = -1073741608;
}
else
{
v23 = *(unsigned __int16 *)(v53[0] + 174);
v24 = *(_QWORD *)(qword_140C4E388 + 8 * v23);
if( SLOBYTE(v54[1]) < 0
|| !(unsigned int)MiSufficientAvailablePages(*(_QWORD *)(qword_140C4E388 + 8 * v23), 0x420ui64)
|| *(_QWORD *)(v24 + 7168) < 0x400ui64 )
{
KeDelayExecutionThread(0, 0, (PLARGE_INTEGER)&MiShortTime);
}
v25 = *(_QWORD *)(v24 + 7104);
if( v25 )
--v25;
if( v25 < 0x9F )
{
v40 = *((_DWORD *)KeGetCurrentThread() + 325);
if( (v40 & 0xC) != 8
&& (v25 < 0x20 && (ULONG_PTR *)v24 == &MiSystemPartition
|| ((v40 & 2) == 0 || v25 < 0x21) && (*(_DWORD *)(v24 + 4) & 0x20) == 0) )
{
MiWaitForFreePage((_MI_PARTITION *)v24, v25);
}
}
FileExtents = 0;
}
}
LABEL_29:
if( (v54[1] & 2) != 0 )
MiCopyOnWriteCheckConditions(v53[0], 3221225495i64);
if( (v54[1] & 4) != 0 )
MiCopyOnWriteCheckConditions(v53[0], 3221226548i64);
if( !*((_QWORD *)&P + 1) )
break;
v33 = (char *)(v5 & 0xFFFFFFFFFFFFFFFEui64);
if( (v5 & 1) == 0 )
goto LABEL_82;
if( *v33 == 1 )
goto LABEL_89;
if( (v5 & 1) == 0 )
goto LABEL_82;
v35 = *v33;
if( *v33 == 2 )
{
LABEL_89:
v33[1] = 1;
LABEL_82:
v5 = 0i64;
goto LABEL_83;
}
if( v35 == 5 || v35 != 6 )
goto LABEL_82;
LABEL_83:
v34 = BugCheckParameter2;
MiInitializePageFaultPacket(2i64, *((UINT64 *)&P + 1), 0, v5, (INT64)a2);
LODWORD(v54[1]) |= 8u;
v6 = (PVOID)a2[0];
*(_QWORD *)&BugCheckParameter2 = v34;
}
if( (_QWORD)BugCheckParameter2 )
MiReleaseFaultCharges((PVOID)BugCheckParameter2);
return FileExtents;
}Referenced by:
ExpSvmServicePageFault
KiPageFault
MiCheckProtoPtePageState
MiCommitExistingVad
MiDeletePerSessionProtos
MiDeleteSubsectionPages
MiEliminateStaleExtents
MiEnableLargeSubsection
MiFaultInProbeAddress
MiGetNextPageTablePte
MiInPagePageTable
MiInPageSingleKernelStack
MiInitializeDynamicPfns
MiInitializeImageProtos
MiInitializeProtoPfn
MiInitializePrototypePtes
MiLockCode
MiLockDriverPageRange
MiLockPagedAddress
MiMakeDriverPagesPrivate
MiMakeImageReadOnly
MiMakeProtoAddressValid
MiMakeSystemAddressValid
MiPfPutPagesInTransition
MiPrefetchVirtualMemory
MiProbeLeafPteAccess
MiPurgeImageSection
MiReleaseOutSwapReservations
MiSectionCreated
MiSetProtectionOnSection
MiUpdateImportRelocationsOnDriverPrivatePages
MiWalkEntireImage
MiWalkVaRange
MmCheckCachedPageStates
MmCopyToCachedPage
MmProtectPool
MmVirtualAccessFault