MiWaitForCollidedFaultComplete

INT64 __fastcall MiWaitForCollidedFaultComplete(
        _MMPFN *CollidedPfn,
        _MMPFN *LockedPfn,
        VOID *FaultingAddress,
        _MMSUPPORT_INSTANCE *Vm,
        int *WsIrql,
        UINT64 PageIrql,
        UINT *MandatoryRetry){
  int *v8; 
  UINT64 v11; 
  int v12; 
  __int64 v13; 
  int v14; 
  MMPTE *v15; 
  void *v16; 
  void *v18; 
  unsigned int v19; 
  MMPTE *PointerPteContents; 
  UINT64 v21; 
  LOBYTE(v21) = (_BYTE)Vm;
  v8 = WsIrql;
  PointerPteContents = (MMPTE *)(*((_QWORD *)LockedPfn + 1) | 0x8000000000000000ui64);
  MI_READ_PTE_LOCK_FREE((INT64)PointerPteContents);
  v12 = *v8;
  v13 = *(_QWORD *)LockedPfn - 32i64;
  if( !*v8 )
  {
    if( (unsigned int)MiAddLockedPageCharge((INT64)LockedPfn, 2) )
    {
      v14 = *v8;
    }
    else
    {
      *v8 = 1;
      v14 = 1;
    }
    v12 = v14;
    if( !v14 && FaultingAddress && *((_WORD *)FaultingAddress + 16) >= 0x7FFFu )
    {
      *v8 = 1;
      MiRemoveLockedPageChargeAndDecRef(LockedPfn);
      v12 = *v8;
    }
  }
  if( v12 == 1 && FaultingAddress )
  {
    MiLockNestedPageAtDpcInline((INT64)FaultingAddress);
    MiRemoveLockedPageChargeAndDecRef((_MMPFN *)FaultingAddress);
    _InterlockedAnd64((volatile signed __int64 *)FaultingAddress + 3, 0x7FFFFFFFFFFFFFFFui64);
  }
  _InterlockedAdd((volatile signed __int32 *)(v13 + 176), 1u);
  _InterlockedAnd64((volatile signed __int64 *)LockedPfn + 3, 0x7FFFFFFFFFFFFFFFui64);
  if( FaultingAddress )
  {
    LOBYTE(v11) = v21;
    MiUnlockProtoPoolPage((_MMPFN *)FaultingAddress, v11);
  }
  else
  {
    __writecr8((unsigned __int8)v21);
  }
  v15 = 0i64;
  if( *((_QWORD *)CollidedPfn + 7) )
    v15 = (MMPTE *)MiReleaseFaultState((INT64)CollidedPfn + 56, 0x11u, 0i64);
  if( *(_QWORD *)(v13 + 216) )
  {
    LODWORD(v18) = KeAbPreAcquire((PVOID)v13, 0i64, 0i64);
    v16 = v18;
    if( v18 )
      KeAbPreWait(v18);
  }
  else
  {
    v16 = 0i64;
  }
  KeWaitForSingleObject((PVOID)(v13 + 56), WrPageIn, 0, 0, 0i64);
  if( v16 )
  {
    KeAbPreAcquire((PVOID)v13, v16, 0i64);
    KeAbPostReleaseEx((PVOID)v13, v16);
  }
  MiFreeInPageSupportBlock((PSLIST_ENTRY)v13);
  if( *((_QWORD *)CollidedPfn + 7) )
    MiRelockFaultState((__int64)CollidedPfn + 56, v15);
  if( *v8 == 1 )
    return 3221226548i64;
  if( FaultingAddress )
  {
    MiRelockProtoPoolPage((INT64)FaultingAddress, (UINT8 *)&v21);
    LODWORD(WsIrql) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)LockedPfn + 6, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx((UINT64 *)&WsIrql);
      while( *((__int64 *)LockedPfn + 3) < 0 );
    }
  }
  else
  {
    MiLockPageInline((INT64)LockedPfn);
  }
  if( (*((_QWORD *)LockedPfn + 3) & 0x4000000000000000i64) == 0 )
  {
    if( (unsigned int)MiIsFaultPteIntact(CollidedPfn, *(MMPTE **)CollidedPfn, PointerPteContents)
      && MiImagePageOk(*(_QWORD *)CollidedPfn, (INT64)LockedPfn) )
    {
      return 0i64;
    }
    MiRemoveLockedPageChargeAndDecRef(LockedPfn);
    return 3221226548i64;
  }
  v19 = (*((_BYTE *)LockedPfn + 35) & 0x10) != 0 ? 0xFFFFFBE3 : 0;
  MiRemoveLockedPageChargeAndDecRef(LockedPfn);
  return v19 - 1073740748;
}

Referenced by:

MiFlushSectionInternal
MiHandleCollidedFault
MiTranslatePageForCopy
MiWalkEntireImage