MiInvalidateCollidedIos

NTSTATUS __stdcall MiInvalidateCollidedIos(_MMINPAGE_SUPPORT *InPageSupport){
  _MMPFN *PfnDb; 
  NTSTATUS v2; 
  _QWORD *v4; 
  _MMINPAGE_SUPPORT *InitialInPageSupport; 
  _LIST_ENTRY *v6; 
  _LIST_ENTRY *v7; 
  _LIST_ENTRY *v8; 
  _MMPFN *v9; 
  _LIST_ENTRY *v10; 
  _LIST_ENTRY *v11; 
  _LIST_ENTRY *ListHead; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 
  INT64 v16; 
  __int64 v17; 
  _MDL *p_Mdl; 
  _MDL *v19; 
  unsigned __int64 v20; 
  __int64 Next; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  _MMPFN *v24; 
  unsigned __int64 v25; 
  _MMPFN *v26; 
  INT64 v27; 
  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;} v28; 
  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;} v29; 
  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;} v30; 
  int v31; 
  _MMPFN *v32; 

  PfnDb = MmGetPfnDb();
  v2 = 1;
  if( (InPageSupport->u1.e1._bf_0 & 0x10) != 0 )
  {
    ListHead = InPageSupport->ListHead;
    Flink = InPageSupport->ListHead[0].Flink;
    if( Flink->Blink != ListHead || (Blink = ListHead->Blink, Blink->Flink != ListHead) )
LABEL_29:
      __fastfail(3u);
    Blink->Flink = Flink;
    Flink->Blink = Blink;
    v16 = InPageSupport->Page[0];
    v17 = v16;
    InitialInPageSupport = InPageSupport->FlowThrough.InitialInPageSupport;
    v4 = (_QWORD *)(MmGetPfnDb()[v16].PteLong | 0x8000000000000000ui64);
    p_Mdl = &InitialInPageSupport->Mdl;
    if( InitialInPageSupport->PrefetchMdl )
      p_Mdl = InitialInPageSupport->PrefetchMdl;
    v19 = p_Mdl + 1;
    v20 = (((LODWORD(p_Mdl->StartVa) + p_Mdl->ByteOffset) & 0xFFF) + (unsigned __int64)p_Mdl->ByteCount + 4095) >> 12;
    Next = (__int64)p_Mdl[1].Next;
    v22 = (unsigned __int64)(&p_Mdl->ByteCount + 2 * v20);
    v2 = 0;
    v23 = PfnDb[Next].PteLong | 0x8000000000000000ui64;
    v24 = MmGetPfnDb();
    if( (unsigned __int64)v4 >= v23
      && (v25 = (__int64)((__int64)v4 - v23) >> 3, v25 < v20)
      && (v26 = &v24[*((_QWORD *)&v19->Next + v25)], v4 == (_QWORD *)(v26->PteLong | 0x8000000000000000ui64)) )
    {
LABEL_19:
      LODWORD(v27) = MI_READ_PTE_LOCK_FREE((INT64)v4);
      LODWORD(v28.Long) = MiUpdateTransitionPteFrame(v27, v16);
      v29.Long = v28.Long;
      v30.Long = v28.Long;
      LOBYTE(v31) = MiPteInShadowRange((UINT64)v4);
      if( v31 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v29.Long & 1) != 0 )
        v30.Long |= 0x8000000000000000ui64;
      *v4 = v30.Long;
      InPageSupport->PteContents.u = (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;})v29.Long;
      v32 = MmGetPfnDb();
      v2 = 1;
      v32[v17].OriginalPte.u.Long ^= (*((_DWORD *)&v32[v17].3 + 4) ^ *((_DWORD *)&v26->3 + 4)) & 0x3E0;
    }
    else
    {
      while( (unsigned __int64)v19 <= v22 )
      {
        v26 = &v24[(__int64)v19->Next];
        if( (_QWORD *)(v26->PteLong | 0x8000000000000000ui64) == v4 )
          goto LABEL_19;
        v19 = (_MDL *)((char *)v19 + 8);
      }
      v26 = &v24[v16];
      InitialInPageSupport->InjectRetry = 1;
    }
    MiReleaseInPageRefs(v26);
    PfnDb = MmGetPfnDb();
  }
  else
  {
    v4 = 0i64;
    InitialInPageSupport = InPageSupport;
  }
  v6 = InitialInPageSupport->ListHead[0].Flink;
  while( v6 != InitialInPageSupport->ListHead )
  {
    v7 = v6[19].Flink;
    v8 = v6;
    v6 = v6->Flink;
    v9 = &PfnDb[(_QWORD)v7];
    if( (InPageSupport->u1.e1._bf_0 & 0x10) == 0 || (_QWORD *)(v9->PteLong | 0x8000000000000000ui64) == v4 )
    {
      MiReleaseInPageRefs(v9);
      v10 = v8->Flink;
      if( v8->Flink->Blink != v8 )
        goto LABEL_29;
      v11 = v8->Blink;
      if( v11->Flink != v8 )
        goto LABEL_29;
      v11->Flink = v10;
      v10->Blink = v11;
      v8->Blink = v8;
      v8->Flink = v8;
      PfnDb = MmGetPfnDb();
    }
  }
  return v2;
}

Referenced by:

MiDeleteTransitionPte
MiFinishHardFault
MiPurgeImageSection