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