MiHandleCollidedFault
INT64 __fastcall MiHandleCollidedFault(INT64 a1, _MMPTE *a2, INT64 a3, INT64 a4, INT64 a5, _DWORD *a6){
unsigned int v9;
__int64 v10;
unsigned __int64 v11;
INT64 result;
_DWORD *v13;
UNICODE_STRING *v14;
UINT8 v15;
WCHAR *v16;
int v17;
_MMSUPPORT_INSTANCE *v18;
UINT64 v19;
char v20;
INT64 v21;
UINT *a7;
int WsIrql;
if( (*((_BYTE *)KeGetCurrentThread() + 1304) & 4) != 0 )
{
v9 = -1073741663;
LABEL_9:
_InterlockedAnd64((volatile signed __int64 *)(a4 + 24), 0x7FFFFFFFFFFFFFFFui64);
if( a3 )
{
LOBYTE(a2) = 17;
MiUnlockProtoPoolPage((_MMPFN *)a3, (UINT64)a2);
}
*a6 = 0;
return v9;
}
v10 = *(_QWORD *)(a1 + 16);
if( (v10 & 1) != 0 )
{
v11 = v10 & 0xFFFFFFFFFFFFFFFEui64;
if( *(_BYTE *)v11 == 5 && (*(_DWORD *)(v11 + 56) & 4) != 0 )
{
v9 = -1073741801;
goto LABEL_9;
}
}
if( (*(_BYTE *)(a1 + 69) & 8) != 0 )
{
v9 = -1073740748;
goto LABEL_9;
}
v13 = a6;
result = MiIssueFlowThroughFault(a1, a2, a3, *(_QWORD *)a4 - 32i64, a4, a5, a6);
if( *v13 != 1 )
{
LOBYTE(v17) = MI_PFN_IS_PROTO((UNICODE_STRING *)a4, v14, v15, v16);
if( v17 )
MiObtainProtoReference(a3, 1);
WsIrql = 0;
LOBYTE(v18) = 2;
v9 = MiWaitForCollidedFaultComplete((_MMPFN *)a1, (_MMPFN *)a4, (VOID *)a3, v18, (UINT8)&WsIrql, v21, a7);
if( WsIrql != 1 )
{
if( a3 )
{
MiLockNestedPageAtDpcInline(a3);
MiRemoveLockedPageChargeAndDecRef((_MMPFN *)a3);
_InterlockedAnd64((volatile signed __int64 *)(a3 + 24), 0x7FFFFFFFFFFFFFFFui64);
}
if( !v9 )
{
MiAddLockedPageCharge(a4, 3);
v20 = *(_BYTE *)(a4 + 34);
*(_QWORD *)(a4 + 24) ^= (*(_QWORD *)(a4 + 24) ^ (*(_QWORD *)(a4 + 24) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
*(_BYTE *)(a4 + 34) = v20 & 0xF8 | 6;
MiRemoveLockedPageChargeAndDecRef((_MMPFN *)a4);
return 0i64;
}
_InterlockedAnd64((volatile signed __int64 *)(a4 + 24), 0x7FFFFFFFFFFFFFFFui64);
if( a3 )
{
LOBYTE(v19) = 17;
MiUnlockProtoPoolPage((_MMPFN *)a3, v19);
}
}
return v9;
}
return result;
}Referenced by:
MiResolveTransitionFault