MiInvalidateCollidedIos

__int64 __fastcall MiInvalidateCollidedIos(__int64 a1){
  _MMPFN *PfnDb; 
  unsigned int v2; 
  _QWORD *v4; 
  __int64 v5; 
  _QWORD *v6; 
  __int64 v7; 
  _QWORD *v8; 
  _MMPFN *v9; 
  __int64 v10; 
  _QWORD *v11; 
  __int64 v13; 
  __int64 v14; 
  _QWORD *v15; 
  INT64 v16; 
  __int64 v17; 
  _QWORD *v18; 
  unsigned __int64 v19; 
  __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  _MMPFN *v23; 
  unsigned __int64 v24; 
  char *v25; 
  INT64 v26; 
  INT64 updated; 
  _MMPFN *v28; 
  PfnDb = MmGetPfnDb();
  v2 = 1;
  if( (*(_DWORD *)(a1 + 192) & 0x10) != 0 )
  {
    v13 = a1 + 16;
    v14 = *(_QWORD *)(a1 + 16);
    if( *(_QWORD *)(v14 + 8) != v13 || (v15 = *(_QWORD **)(v13 + 8), *v15 != v13) )
LABEL_25:
      __fastfail(3u);
    *v15 = v14;
    *(_QWORD *)(v14 + 8) = v15;
    v16 = *(_QWORD *)(a1 + 320);
    v5 = *(_QWORD *)(a1 + 328);
    v4 = (_QWORD *)(*((_QWORD *)MmGetPfnDb() + 6 * v16 + 1) | 0x8000000000000000ui64);
    v17 = v5 + 272;
    if( *(_QWORD *)(v5 + 256) )
      v17 = *(_QWORD *)(v5 + 256);
    v18 = (_QWORD *)(v17 + 48);
    v19 = (((*(_DWORD *)(v17 + 32) + *(_DWORD *)(v17 + 44)) & 0xFFF)
         + (unsigned __int64)*(unsigned int *)(v17 + 40)
         + 4095) >> 12;
    v20 = 6i64 * *(_QWORD *)(v17 + 48);
    v21 = v17 + 40 + 8 * v19;
    v2 = 0;
    v22 = *((_QWORD *)PfnDb + v20 + 1) | 0x8000000000000000ui64;
    v23 = MmGetPfnDb();
    if( (unsigned __int64)v4 >= v22
      && (v24 = (__int64)((__int64)v4 - v22) >> 3, v24 < v19)
      && (v25 = (char *)v23 + 48 * v18[v24], v4 == (_QWORD *)(*((_QWORD *)v25 + 1) | 0x8000000000000000ui64)) )
    {
LABEL_19:
      v26 = MI_READ_PTE_LOCK_FREE((INT64)v4);
      updated = MiUpdateTransitionPteFrame(v26, v16);
      *v4 = updated;
      *(_QWORD *)(a1 + 168) = updated;
      v28 = MmGetPfnDb();
      v2 = 1;
      *((_QWORD *)v28 + 6 * v16 + 2) ^= (*((_DWORD *)v28 + 12 * v16 + 4) ^ *((_DWORD *)v25 + 4)) & 0x3E0;
    }
    else
    {
      while( (unsigned __int64)v18 <= v21 )
      {
        v25 = (char *)v23 + 48 * *v18;
        if( (_QWORD *)(*((_QWORD *)v25 + 1) | 0x8000000000000000ui64) == v4 )
          goto LABEL_19;
        ++v18;
      }
      v25 = (char *)v23 + 48 * v16;
      *(_DWORD *)(v5 + 180) = 1;
    }
    MiReleaseInPageRefs((_MMPFN *)v25);
    PfnDb = MmGetPfnDb();
  }
  else
  {
    v4 = 0i64;
    v5 = a1;
  }
  v6 = *(_QWORD **)(v5 + 16);
  while( v6 != (_QWORD *)(v5 + 16) )
  {
    v7 = v6[38];
    v8 = v6;
    v6 = (_QWORD *)*v6;
    v9 = (_MMPFN *)((char *)PfnDb + 48 * v7);
    if( (*(_DWORD *)(a1 + 192) & 0x10) == 0 || (_QWORD *)(*((_QWORD *)v9 + 1) | 0x8000000000000000ui64) == v4 )
    {
      MiReleaseInPageRefs(v9);
      v10 = *v8;
      if( *(_QWORD **)(*v8 + 8i64) != v8 )
        goto LABEL_25;
      v11 = (_QWORD *)v8[1];
      if( (_QWORD *)*v11 != v8 )
        goto LABEL_25;
      *v11 = v10;
      *(_QWORD *)(v10 + 8) = v11;
      v8[1] = v8;
      *v8 = v8;
      PfnDb = MmGetPfnDb();
    }
  }
  return v2;
}

Referenced by:

MiDeleteTransitionPte
MiFinishHardFault
MiPurgeImageSection