MiHandleCollidedFault
NTSTATUS __stdcall MiHandleCollidedFault(_MMPFN *CollidedPfn, _MMPTE *a2, _MMPFN *a3, INT64 a4, INT64 a5, UINT64 *a6){
NTSTATUS v9;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v10;
unsigned __int64 v11;
NTSTATUS result;
UINT64 *v13;
_UNICODE_STRING *v14;
UINT8 v15;
wchar_t *v16;
int v17;
_MMSUPPORT_INSTANCE *v18;
char v19;
UINT8 PageIrql;
UINT64 *MandatoryRetry;
int v22;
if( ((__int64)KeGetCurrentThread()[1].Queue & 4) != 0 )
{
v9 = -1073741663;
LABEL_9:
_InterlockedAnd64((volatile signed __int64 *)(a4 + 24), 0x7FFFFFFFFFFFFFFFui64);
if( a3 )
MiUnlockProtoPoolPage((ULONG_PTR)a3, 0x11u);
*(_DWORD *)a6 = 0;
return v9;
}
v10.Long = (unsigned __int64)CollidedPfn->OriginalPte.u;
if( (v10.Long & 1) != 0 )
{
v11 = v10.Long & 0xFFFFFFFFFFFFFFFEui64;
if( *(_BYTE *)v11 == 5 && (*(_DWORD *)(v11 + 56) & 4) != 0 )
{
v9 = -1073741801;
goto LABEL_9;
}
}
if( (*((_BYTE *)&CollidedPfn[1].3 + 21) & 8) != 0 )
{
v9 = -1073740748;
goto LABEL_9;
}
v13 = a6;
result = MiIssueFlowThroughFault(CollidedPfn, a2, (_UNICODE_STRING *)a4, (_MMSUPPORT_INSTANCE *)a5, (__int64)a6);
if( *(_DWORD *)v13 != 1 )
{
LOBYTE(v17) = MI_PFN_IS_PROTO((_UNICODE_STRING *)a4, v14, v15, v16);
if( v17 )
MiObtainProtoReference(a3, 1ui64);
v22 = 0;
LOBYTE(v18) = 2;
v9 = MiWaitForCollidedFaultComplete(CollidedPfn, (_MMPFN *)a4, a3, v18, (UINT8)&v22, PageIrql, MandatoryRetry);
if( v22 != 1 )
{
if( a3 )
{
MiLockNestedPageAtDpcInline(a3);
MiRemoveLockedPageChargeAndDecRef(a3);
_InterlockedAnd64(&a3->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}
if( !v9 )
{
MiAddLockedPageCharge((_MMPFN *)a4, 3ui64);
v19 = *(_BYTE *)(a4 + 34);
*(_QWORD *)(a4 + 24) ^= (*(_QWORD *)(a4 + 24) ^ (*(_QWORD *)(a4 + 24) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
*(_BYTE *)(a4 + 34) = v19 & 0xF8 | 6;
MiRemoveLockedPageChargeAndDecRef((_MMPFN *)a4);
return 0;
}
_InterlockedAnd64((volatile signed __int64 *)(a4 + 24), 0x7FFFFFFFFFFFFFFFui64);
if( a3 )
MiUnlockProtoPoolPage((ULONG_PTR)a3, 0x11u);
}
return v9;
}
return result;
}Referenced by:
MiResolveTransitionFault