MiMakeSystemCacheRangeValid

VOID __stdcall MiMakeSystemCacheRangeValid(
        _MMPTE *PointerPte,
        _MMPTE *NewPtes,
        UINT64 BatchCount,
        _MMPFN *ContainingPfn){
  _MMPFN *v5; 
  _MMPTE *PteBase; 
  unsigned __int64 v7; 
  UINT64 v8; 
  __int64 v9; 
  volatile __int32 *v10; 
  UINT8 CurrentIrql; 
  int v12; 
  UINT64 v13; 
  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;} v14; 
  unsigned __int64 v15; 
  unsigned int v16; 
  unsigned __int64 v17; 
  unsigned __int8 v18; 
  _MMSUPPORT_INSTANCE *v19; 
  INT64 v20; 
  _MMPTE *v21; 
  __int64 v22; 
  __int64 v23; 
  _MMSUPPORT_INSTANCE *v24; 
  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;} v25; 
  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;} v26; 
  _MMPTE *v27; 
  UINT8 v28; 
  wchar_t *v29; 
  _MMPFN *v30; 
  _UNICODE_STRING *v31; 
  unsigned int v32; 
  int v33; 
  int v34; 
  int v35; 
  UINT64 v36; 
  int v37; 
  CHAR v38; 
  _MMPTE *v39; 
  __int64 v40; 
  __int64 v41; 
  _MMPTE *v42; 
  UINT64 v43; 
  unsigned __int64 v44; 
  _MMPFN *v45; 
  unsigned __int64 v46; 
  __int64 v47; 
  __int64 v48; 
  _CONTROL_AREA *v49; 
  UINT64 v50; 
  UINT64 v51; 
  UINT64 v52; 
  _ETHREAD *CurrentThread; 
  _PFSN_TRACE_HEADER *v54; 
  _PFSN_TRACE_HEADER *v55; 
  int v56; 
  signed __int64 Object; 
  signed __int64 v58; 
  _MMPTE PteContents; 
  _MI_FAULT_VA_LIST *VirtualFaultInfo; 
  __int64 v61; 
  __int64 v62; 
  INT64 v63[2]; 
  UINT64 v64; 
  _MMPTE *v65; 
  unsigned int v66; 
  UINT64 Long; 
  UINT64 SpinCount; 
  UINT64 v69; 
  _MMSUPPORT_INSTANCE *v70; 
  __int64 v71; 
  _MMPFN *v72; 
  __int64 v73; 
  _MMPTE *PteAddress[2]; 
  __int128 v75; 
  __int128 v76; 
  __int128 v77; 
  __int128 v78; 
  __int128 v79; 
  __int128 v80; 
  __int128 v81; 
  __int64 v82[16]; 

  v72 = ContainingPfn;
  v66 = BatchCount;
  Long = 0i64;
  v82[0] = 0i64;
  v64 = 0i64;
  *(_OWORD *)v63 = 0i64;
  v5 = ContainingPfn;
  v65 = PointerPte;
  *(_OWORD *)PteAddress = 0i64;
  PteBase = MmGetPteBase();
  v75 = 0i64;
  v76 = 0i64;
  v77 = 0i64;
  v78 = 0i64;
  v79 = 0i64;
  v80 = 0i64;
  v81 = 0i64;
  v73 = (_QWORD)PteBase << 25;
  v7 = (__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)PteBase << 25)) >> 16;
  v8 = (UINT64)PteBase + (((unsigned __int64)PointerPte >> 9) & 0x7FFFFFFFF8i64);
  if( (*(&stru_140C50B28 + 7312) & 7u) < 6 )
  {
    v10 = (volatile __int32 *)((char *)&stru_140C4DB30 + 6544);
    if( (*(&stru_140C50B28 + 7312) & 7) != 2 )
      v10 = (volatile __int32 *)((char *)&stru_140C50B28 + 7320);
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    _m_prefetchw((const void *)v10);
    v12 = *v10 & 0x7FFFFFFF;
    if( v12 != _InterlockedCompareExchange(v10, v12 + 1, v12) )
      ExpWaitForSpinLockSharedAndAcquire((INT64 *)v10, CurrentIrql);
    if( *((_DWORD *)v10 + 1) )
      _InterlockedExchange(v10 + 1, 0);
    LOBYTE(v9) = CurrentIrql;
    v71 = CurrentIrql;
  }
  else
  {
    v9 = KeGetCurrentIrql();
    v71 = v9;
    __writecr8(2ui64);
  }
  MiLockPageTableInternal((INT64)&stru_140C50B28 + 7128, v8, 0i64);
  v13 = *(unsigned __int64 *)((char *)&MmGetPdeBase()->u.Long + ((v7 >> 18) & 0x3FFFFFF8));
  v69 = v13;
  MiPteInShadowRange((UINT64)&v69);
  v14.Long = (unsigned __int64)MmGetPfnDb()[(v13 >> 12) & 0xFFFFFFFFFi64].OriginalPte.u;
  if( v14.Long )
    v14.Long += 40 * ((v7 >> 18) & 7);
  v15 = *(_QWORD *)(v14.Long + 24);
  v16 = v66;
  BYTE4(v63[1]) = v9;
  v17 = v15 & 0xFFFFFFFFFFFFFFFEui64;
  v64 = v8;
  if( (v15 & 1) == 0 )
    v17 = v15;
  v18 = BYTE5(v63[1]) | 4;
  BYTE5(v63[1]) |= 4u;
  v19 = (_MMSUPPORT_INSTANCE *)(*(_QWORD *)(*(&stru_140C4DB30 + 267)
                                          + 8i64 * (*(_WORD *)(*(_QWORD *)v17 + 60i64) & 0x3FF))
                              + 7232i64);
  v70 = v19;
  v20 = (INT64)v19;
  v63[0] = (INT64)v19;
  if( v66 )
  {
    v21 = (_MMPTE *)((char *)v65 - (char *)NewPtes);
    v22 = v66;
    v23 = 0i64;
    v65 = (_MMPTE *)((char *)v65 - (__int64)NewPtes);
    v61 = v66;
    v24 = v19;
    while( 1 )
    {
      PteAddress[v23] = 0i64;
      v25.Long = (unsigned __int64)NewPtes->u;
      v26.Long = (unsigned __int64)NewPtes->u;
      if( NewPtes >= MmGetPml4eBase() && NewPtes <= MmGetPxeUserLimit() )
      {
        v22 = v61;
        v21 = v65;
      }
      Long = NewPtes->u.Long;
      if( !v26.Long )
        goto LABEL_46;
      if( (v26.Long & 1) != 0 )
        break;
      PteAddress[v23] = (_MMPTE *)1;
      NewPtes->u.Long = v25.Long | 1;
LABEL_46:
      v21 = v65;
      ++v23;
      ++NewPtes;
      v61 = --v22;
      if( !v22 )
      {
        v8 = v64;
        v20 = v63[0];
        v5 = v72;
        v19 = v70;
        v16 = v66;
        goto LABEL_48;
      }
    }
    v27 = (_MMPTE *)((char *)NewPtes + (_QWORD)v21);
    if( (*((_BYTE *)&NewPtes->u.Long + (_QWORD)v21) & 1) != 0 )
      goto LABEL_44;
    MiPteInShadowRange((UINT64)&Long);
    v30 = &MmGetPfnDb()[(v26.Long >> 12) & 0xFFFFFFFFFi64];
    v82[v23] = v30->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
    if( (v18 & 4) == 0 || (v18 & 1) != 0 || (v18 & 2) != 0 )
    {
      v34 = 0;
      goto LABEL_40;
    }
    v31 = (_UNICODE_STRING *)WORD1(v63[1]);
    v32 = (unsigned int)v27;
    if( !WORD1(v63[1]) )
    {
LABEL_35:
      WORD1(v63[1]) = 1;
      LOWORD(v63[1]) = (v32 >> 3) & 0x1FF;
      LOBYTE(v35) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v30, v31, v28, v29);
      if( v35 )
        v18 &= ~0x10u;
      else
        v18 |= 0x10u;
      v34 = 4;
      BYTE5(v63[1]) = v18;
LABEL_40:
      LODWORD(VirtualFaultInfo) = v34;
      if( MiAllocateWsle(v24, v27, v30, 0i64, (_MMPTE)v26.Long, VirtualFaultInfo) )
      {
        if( (v82[v23] & 0x400) != 0 && PfSnNumActiveTraces )
          PteAddress[v23] = (_MMPTE *)(v30->PteLong | 0x8000000000000000ui64);
        goto LABEL_45;
      }
LABEL_44:
      PteAddress[v23] = (_MMPTE *)1;
LABEL_45:
      v22 = v61;
      goto LABEL_46;
    }
    if( WORD1(v63[1]) + LOWORD(v63[1]) == (((unsigned int)v27 >> 3) & 0x1FF) )
    {
      LOBYTE(v33) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v30, (_UNICODE_STRING *)0x1FF, v28, v29);
      if( v33 )
      {
        if( (v18 & 0x10) == 0 )
          goto LABEL_33;
      }
      else if( (v18 & 0x10) != 0 )
      {
        goto LABEL_33;
      }
    }
    MiEmptyDeferredWorkingSetEntries((INT64)v63);
    v18 = BYTE5(v63[1]);
LABEL_33:
    v32 = (unsigned int)v27;
    if( WORD1(v63[1]) )
    {
      ++WORD1(v63[1]);
      v34 = 4;
      goto LABEL_40;
    }
    goto LABEL_35;
  }
LABEL_48:
  if( v8 )
  {
    if( WORD1(v63[1]) )
    {
      v36 = ((unsigned __int64)LOWORD(v63[1]) << 12) + ((((__int64)((v8 << 25) - v73) >> 16 << 25) - v73) >> 16);
      v37 = 2 * ((v18 >> 4) & 1);
      if( v36 < (unsigned __int64)MmGetPteBase() || v36 > (unsigned __int64)MmGetPteLimit() )
      {
        v38 = v37 | 5;
      }
      else
      {
        v38 = v37 | 4;
        if( (*(_BYTE *)(v20 + 184) & 7) != 0 )
          v38 = 2 * ((v18 & 0x10) != 0);
      }
      MiAddWorkingSetEntries(v20, v36, (UINT8 *)WORD1(v63[1]), v38);
      WORD1(v63[1]) = 0;
    }
    MiUnlockPageTableInternal(v20, v8);
    BYTE5(v63[1]) = v18 | 2;
    v64 = 0i64;
  }
  MiUnlockWorkingSetShared(v19, (unsigned __int8)v71);
  v62 = v16;
  v39 = &NewPtes[-v16];
  v65 = v39;
  if( v16 )
  {
    v40 = v16;
    v41 = 0i64;
    while( 1 )
    {
      v42 = PteAddress[v41];
      if( v42 == (_MMPTE *)1 )
        break;
      if( v42 )
      {
        v47 = v82[v41];
        if( *(&stru_140C4DB30 + 42) && (v47 & 0x10) == 0 )
          v47 &= ~*(&stru_140C4DB30 + 42);
        v48 = v47 >> 16;
        v49 = *(_CONTROL_AREA **)v48;
        v50 = (UINT64)MiReferenceControlAreaFile(*(_CONTROL_AREA **)v48);
        LODWORD(v51) = MiStartingOffset((_SUBSECTION *)v48, v42, 0xFFFFFFFFui64);
        v52 = v51;
        if( !*(_QWORD *)(v50 + 32) )
        {
          CurrentThread = (_ETHREAD *)KeGetCurrentThread();
          v54 = PfSnReferenceProcessTrace(CurrentThread->Tcb.ApcState.Process);
          v55 = v54;
          if( v54 )
          {
            if( (unsigned int)PfSnCheckLoggingForThread(CurrentThread, v54, 4ui64) )
            {
              LODWORD(PteContents.u.Long) = v56;
              PfSnLogPageFaultCommon(v55, (_FILE_OBJECT *)v50, *(_QWORD *)(v50 + 24), v52, PteContents.u.Long);
            }
            ExReleaseRundownProtection((_EX_RUNDOWN_REF *)v55 + 45);
          }
        }
        _m_prefetchw(&v49->FilePointer);
        Object = (signed __int64)v49->FilePointer.Object;
        if( (v50 ^ Object) >= 0xF )
        {
LABEL_77:
          ObDereferenceObjectDeferDelete(v50);
        }
        else
        {
          while( 1 )
          {
            v58 = Object;
            Object = _InterlockedCompareExchange64((volatile signed __int64 *)&v49->FilePointer, Object + 1, Object);
            if( v58 == Object )
              break;
            if( (v50 ^ Object) >= 0xF )
              goto LABEL_77;
          }
        }
        v39 = v65;
        goto LABEL_79;
      }
LABEL_80:
      ++v39;
      ++v41;
      --v40;
      v65 = v39;
      v62 = v40;
      if( !v40 )
        return;
    }
    LODWORD(v43) = MI_READ_PTE_LOCK_FREE((INT64)v39);
    Long = v43;
    LODWORD(v44) = MI_READ_PTE_LOCK_FREE((INT64)&Long);
    v45 = &MmGetPfnDb()[(v44 >> 12) & 0xFFFFFFFFFi64];
    v46 = MiLockPageInline(v45);
    MiDecrementShareCount(v45);
    _InterlockedAnd64(&v45->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)&v5->u2, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( v5->u2._bf_0 < 0 );
    }
    MiDecrementShareCount(v5);
    _InterlockedAnd64(&v5->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v46);
LABEL_79:
    v40 = v62;
    goto LABEL_80;
  }
}

Referenced by:

MmCheckCachedPageStates