MmCheckCachedPageStates

VOID __fastcall MmCheckCachedPageStates(
        VOID *SystemCacheAddress,
        UINT64 NumberOfBytes,
        UINT64 Flags,
        UINT8 *ReturnResult){
  unsigned int v5; 
  ULONG_PTR v6; 
  _MMPFN *v7; 
  _MMPTE *PteBase; 
  UINT64 v9; 
  UINT64 v10; 
  char *v11; 
  UINT64 v12; 
  __int64 v13; 
  UINT64 CurrentPrcb; 
  INT64 *v15; 
  __int64 v16; 
  char *v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  ULONG_PTR v20; 
  __int64 v21; 
  unsigned __int64 v22; 
  INT64 v23; 
  __int64 v24; 
  __int64 v25; 
  signed __int32 v26; 
  UINT64 Page; 
  UINT64 v28; 
  _RTL_BITMAP_EX *v29; 
  unsigned __int64 v30; 
  _MI_PFN_CACHE_ATTRIBUTE v31; 
  BOOL v32; 
  UINT8 v33; 
  INT64 v34; 
  UINT64 *v35; 
  UINT64 v36; 
  UINT64 v37; 
  __int64 v38; 
  UINT8 CurrentIrql; 
  UINT64 v40; 
  UINT8 v41; 
  WCHAR *v42; 
  int v43; 
  INT64 v44; 
  char v45; 
  int IsPfnCommitNotCharged; 
  char v47; 
  __int64 v48; 
  ULONG_PTR *v49; 
  signed __int32 v50; 
  signed __int32 v51; 
  MMPTE *v52; 
  char v53; 
  int v54; 
  INT64 v55; 
  unsigned __int64 v56; 
  char *v57; 
  bool v58; 
  __int64 *v59; 
  __int64 v60; 
  unsigned __int64 v61; 
  struct _SLIST_ENTRY *TransitionHeatBatch; 
  __int64 v63; 
  unsigned __int64 v64; 
  unsigned __int64 v65; 
  _MMPFN *v66; 
  __int64 PfnPriority; 
  WORK_QUEUE_TYPE v68; 
  PVOID v69; 
  int v70; 
  UINT64 v71; 
  __int64 v72; 
  __int64 v73; 
  char v74; 
  _MMPTE *v75; 
  _MMPTE *Pml4eBase; 
  unsigned __int64 v77; 
  int v78; 
  unsigned __int64 v79; 
  __int64 v80; 
  unsigned __int64 v81; 
  unsigned __int64 v82; 
  unsigned __int64 v83; 
  _MMPTE *PxeUserLimit; 
  INT64 PteShadow; 
  unsigned __int64 v86; 
  INT64 v87; 
  _ETHREAD *CurrentThread; 
  int v89; 
  unsigned int v90; 
  unsigned int v91; 
  __int64 v92; 
  NTSTATUS v93; 
  int v94; 
  unsigned __int64 v95; 
  INT64 v96; 
  UINT64 v97; 
  unsigned __int8 v98; 
  unsigned __int64 v99; 
  UINT64 v100; 
  __int16 v101; 
  __int16 v102; 
  struct _KPRCB *v103; 
  WCHAR *v104; 
  UNICODE_STRING *v105; 
  char v106; 
  int v107; 
  unsigned __int64 v108; 
  unsigned __int64 v109; 
  unsigned __int64 v110; 
  int v111; 
  __int64 v112; 
  __int64 v113; 
  __int64 v114; 
  signed __int32 v115; 
  UINT8 PageIrql; 
  char i; 
  unsigned int BatchCount; 
  char BatchCount_4; 
  int v120; 
  INT64 ValidPte; 
  _MMPTE *PoINTerPte; 
  int v123; 
  UINT64 v124; 
  ULONG_PTR BugCheckParameter1; 
  INT64 v126; 
  char *v127; 
  _RTL_BITMAP_EX *v128; 
  UINT64 SpinCount; 
  UINT64 v130; 
  _MMPFN *PfnToDiscard; 
  unsigned __int64 v132; 
  UINT64 v133; 
  UINT64 v134; 
  UINT64 v135; 
  __int64 v136; 
  _MI_PARTITION *Partition; 
  INT64 v138; 
  INT64 v139[2]; 
  UINT8 *v140; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  __int64 v142[16]; 
  v140 = ReturnResult;
  v120 = Flags;
  PfnToDiscard = 0i64;
  ValidPte = 0i64;
  v126 = 0i64;
  BatchCount_4 = 1;
  *(_OWORD *)v139 = 0i64;
  v123 = 0;
  v5 = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v6 = 0i64;
  BatchCount = 0;
  v7 = 0i64;
  PageIrql = 17;
  v133 = 0i64;
  PteBase = MmGetPteBase();
  v9 = (UINT64)PteBase + (((unsigned __int64)SystemCacheAddress >> 9) & 0x7FFFFFFFF8i64);
  PoINTerPte = (_MMPTE *)v9;
  v132 = (unsigned __int64)PteBase
       + ((((unsigned __int64)SystemCacheAddress + NumberOfBytes - 1) >> 9) & 0x7FFFFFFFF8i64);
  v134 = *(_QWORD *)((char *)PteBase + ((v9 >> 9) & 0x7FFFFFFFF8i64));
  v10 = v134;
  MiPteInShadowRange((UINT64)&v134);
  v11 = (char *)MmGetPfnDb() + 48 * ((v10 >> 12) & 0xFFFFFFFFFi64);
  v127 = v11;
  v12 = *(_QWORD *)((char *)MmGetPdeBase() + (((unsigned __int64)SystemCacheAddress >> 18) & 0x3FFFFFF8));
  v135 = v12;
  MiPteInShadowRange((UINT64)&v135);
  v13 = *((_QWORD *)MmGetPfnDb() + 6 * ((v12 >> 12) & 0xFFFFFFFFFi64) + 2);
  if( v13 )
    v13 += 40 * (((unsigned __int64)SystemCacheAddress >> 18) & 7);
  CurrentPrcb = *(_QWORD *)(v13 + 24);
  v15 = (INT64 *)(CurrentPrcb & 0xFFFFFFFFFFFFFFFEui64);
  if( (CurrentPrcb & 1) == 0 )
    v15 = (INT64 *)CurrentPrcb;
  v138 = *v15;
  v16 = 0i64;
  Partition = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * (*(_WORD *)(v138 + 60) & 0x3FF));
  while( 1 )
  {
    v17 = (char *)MmGetPfnDb() + 40;
    if( v9 > v132 )
      break;
    v18 = *(_QWORD *)v9;
    LODWORD(v19) = 0;
    CurrentPrcb = *(_QWORD *)v9;
    if( (*(_QWORD *)v9 & 1) != 0 )
    {
      if( (v120 & 4) == 0 )
        goto LABEL_196;
      if( PageIrql != 17 )
      {
        MiUnlockProtoPoolPage(v7, PageIrql);
        PageIrql = 17;
      }
LABEL_11:
      MiMarkPteDirty((MMPTE *)v9);
      goto LABEL_196;
    }
    ValidPte = *(_QWORD *)v9;
    if( (v18 & 1) != 0 )
    {
      if( (v120 & 4) == 0 )
        goto LABEL_196;
      if( PageIrql != 17 )
      {
        MiUnlockProtoPoolPage(v7, PageIrql);
        PageIrql = 17;
      }
      goto LABEL_11;
    }
    v20 = v6;
    v19 = (v18 >> 3) & 1;
    v21 = v18;
    v136 = v19;
    if( qword_140C4DC80 && (v18 & 0x10) == 0 )
      v21 = v18 & ~qword_140C4DC80;
    CurrentPrcb = PageIrql;
    v22 = v20 & 0xFFFFFFFFFFFFF000ui64;
    v6 = v21 >> 16;
    BugCheckParameter1 = v6;
    if( PageIrql != 17 )
    {
      if( (v6 & 0xFFFFFFFFFFFFF000ui64) == v22 )
        goto LABEL_91;
      MiUnlockProtoPoolPage(v7, PageIrql);
      PageIrql = 17;
    }
    if( (v6 & 0xFFFFFFFFFFFFF000ui64) != v22 && BatchCount )
    {
      MiMakeSystemCacheRangeValid((_MMPTE *)(v9 - 8i64 * BatchCount), (_MMPTE *)v142, BatchCount, (_MMPFN *)v11);
      BatchCount = 0;
    }
    v23 = *(_QWORD *)v6;
    v126 = v23;
    if( (v23 & 1) == 0 && ((v23 & 0x400) != 0 || (v23 & 0x800) == 0) )
    {
      v7 = 0i64;
LABEL_30:
      if( qword_140C4DC80 && (v23 & 0x10) == 0 )
        v23 &= ~qword_140C4DC80;
      v24 = v23 >> 16;
      if( !MiControlAreaUsingExtents(v138) && (v120 & 1) != 0 )
      {
        MiInitializePageColorBase(0i64, (*(_DWORD *)(v25 + 56) >> 20) & 0x3F, (INT64)v139);
        v26 = _InterlockedExchangeAdd((volatile signed __int32 *)v139[0], 1u);
        Page = MiGetPage(Partition, v139[1] & v26 | HIDWORD(v139[1]), 2ui64);
        v28 = Page;
        if( Page != -1i64 )
        {
          v29 = (_RTL_BITMAP_EX *)((char *)MmGetPfnDb() + 48 * Page);
          v128 = v29;
          v30 = MI_READ_PTE_LOCK_FREE((INT64)&v126);
          v31 = (unsigned int)MiProtectionToCacheAttribute((v30 >> 5) & 0x1F);
          v32 = MiPfnZeroingNeeded((INT64)v29, (unsigned int)v31);
          v33 = PageIrql;
          if( v32 )
          {
            if( PageIrql != 17 )
            {
              MiUnlockProtoPoolPage(v7, PageIrql);
              v33 = 17;
              PageIrql = 17;
            }
            MiZeroPhysicalPage(v28, 1ui64, v31);
            v29[1].SizeOfBitMap &= 0xFFFFFFFFFFFFFC1Fui64;
          }
          v6 = BugCheckParameter1;
          if( v33 != 17 )
            goto LABEL_180;
          v7 = MiLockProtoPoolPage((_MMPTE *)BugCheckParameter1, &PageIrql);
          if( !v7 )
          {
            do
            {
              MmAccessFault(2ui64, (PVOID)v6, 0, 0i64);
              v7 = MiLockProtoPoolPage((_MMPTE *)v6, &PageIrql);
            }
            while( !v7 );
            v29 = v128;
          }
          v34 = MI_READ_PTE_LOCK_FREE(v6);
          v126 = v34;
          if( (v34 & 1) == 0 && ((v34 & 0x800) == 0 || (v34 & 0x400) != 0) )
          {
LABEL_180:
            MiReferenceControlAreaPfn((_CONTROL_AREA *)v138, (_SUBSECTION *)v24, 1ui64);
            v86 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v126) >> 5) & 0x1F;
            MiInitializePfn(v29, (UINT64 *)v6, v86);
            v87 = v28;
            v9 = (UINT64)PoINTerPte;
            ValidPte = MiMakeValidPte((UINT64)PoINTerPte, v87, (unsigned int)v86 | 0x20000000);
            *(_QWORD *)v6 = ValidPte;
            v16 = 0i64;
            goto LABEL_210;
          }
          MiUnlockProtoPoolPage(v7, PageIrql);
          MiReleaseFreshPage((_MMPFN *)v29);
          v9 = (UINT64)PoINTerPte;
          PageIrql = 17;
          goto LABEL_127;
        }
        v9 = (UINT64)PoINTerPte;
      }
      if( (v120 & 2) == 0 )
      {
        if( PageIrql != 17 )
        {
          MiUnlockProtoPoolPage(v7, PageIrql);
          PageIrql = 17;
        }
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        v89 = *((unsigned __int8 *)CurrentThread + 1308);
        v90 = *((_DWORD *)CurrentThread + 322);
        *((_BYTE *)CurrentThread + 1308) = 1;
        v91 = v89 + 4 * v90;
        v92 = (__int64)(v132 - v9) >> 3;
        if( (unsigned int)v92 > v90 )
        {
          if( (unsigned int)v92 > 0xF )
            LODWORD(v92) = 15;
          *((_DWORD *)CurrentThread + 322) = v92;
        }
        v93 = MmAccessFault(0i64, (PVOID)((__int64)((v9 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16), 0, 0i64);
        if( v93 < 0 )
        {
          v94 = v123;
          if( v123 >= 0 )
            v94 = v93;
          v123 = v94;
        }
        *((_DWORD *)CurrentThread + 322) = v91 >> 2;
        *((_BYTE *)CurrentThread + 1308) = v91 & 3;
      }
      BatchCount_4 = 0;
      goto LABEL_195;
    }
    v35 = (UINT64 *)((char *)MmGetPteBase() + ((v6 >> 9) & 0x7FFFFFFFF8i64));
    while( 2 )
    {
      v124 = *v35;
      v36 = v124 & 1;
      do
      {
        if( !v36 )
          goto LABEL_61;
        v37 = v124;
        if( (v124 & 0x200) != 0 )
          goto LABEL_61;
        MiPteInShadowRange((UINT64)&v124);
        v38 = (v37 >> 12) & 0xFFFFFFFFFi64;
      }
      while( (*((_QWORD *)MmGetPfnDb() + 6 * v38 + 5) & 0x4000000000000i64) == 0 );
      v7 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * v38);
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(2ui64);
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)v7 + 6, 0x3Fui64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *((__int64 *)v7 + 3) < 0 );
      }
      v40 = *v35;
      v124 = v40;
      if( (v40 & 1) == 0 || (v40 & 0x200) != 0 || v38 != ((v40 >> 12) & 0xFFFFFFFFFi64) )
      {
        _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
        if( CurrentIrql != 17 )
          __writecr8(CurrentIrql);
LABEL_61:
        MmAccessFault(2ui64, (PVOID)BugCheckParameter1, 0, 0i64);
        continue;
      }
      break;
    }
    if( !(unsigned int)MiAreChargesNeededToLockPage((INT64)v7) )
      goto LABEL_78;
    LOBYTE(v43) = MI_PFN_IS_PROTO((UNICODE_STRING *)v7, (UNICODE_STRING *)CurrentPrcb, v41, v42);
    if( v43 && (*((_DWORD *)v7 + 4) & 0x400i64) != 0 )
    {
      v45 = 1;
    }
    else
    {
      IsPfnCommitNotCharged = MiIsPfnCommitNotCharged(v44);
      v45 = v47;
      if( IsPfnCommitNotCharged )
        v45 = 1;
    }
    v48 = (*((_QWORD *)v7 + 5) >> 39) & 0x3FFi64;
    v49 = *(ULONG_PTR **)(qword_140C4E388 + 8 * v48);
    if( v45 && !(unsigned int)MiChargeCommit(*(_MI_PARTITION **)(qword_140C4E388 + 8 * v48), 1ui64, 4ui64) )
      goto LABEL_79;
    if( v49 == &MiSystemPartition )
    {
      CurrentPrcb = (UINT64)KeGetCurrentPrcb();
      v50 = *(_DWORD *)(CurrentPrcb + 33564);
      while( v50 )
      {
        if( v50 == -1 )
          break;
        v51 = v50;
        v50 = _InterlockedCompareExchange((volatile signed __int32 *)(CurrentPrcb + 33564), v50 - 1, v50);
        if( v51 == v50 )
          goto LABEL_78;
      }
    }
    if( (unsigned int)MiChargePartitionResidentAvailable((INT64)v49, 1ui64, 0xFFFFFFFFi64) )
    {
LABEL_78:
      ++*((_WORD *)v7 + 16);
    }
    else if( v45 )
    {
      MiReturnCommit((_MI_PARTITION *)v49, 1ui64);
    }
LABEL_79:
    if( CurrentIrql == 17 )
    {
      MiLockOwnedProtoPage((INT64)v7, 0x11u);
    }
    else
    {
      v52 = (MMPTE *)(*((_QWORD *)v7 + 1) | 0x8000000000000000ui64);
      PageIrql = CurrentIrql;
      v53 = *((_BYTE *)v7 + 34);
      i = 0;
      v128 = (_RTL_BITMAP_EX *)v52;
      if( (v53 & 0x20) != 0 )
      {
        do
        {
          _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
          __writecr8(CurrentIrql);
          v54 = 0;
          for( i = *((_BYTE *)v7 + 34); (i & 0x20) != 0; i = *((_BYTE *)v7 + 34) )
          {
            ++v54;
            _mm_pause();
          }
          MiLockPageInline((INT64)v7);
          v53 = *((_BYTE *)v7 + 34);
        }
        while( (v53 & 0x20) != 0 );
        v52 = (MMPTE *)v128;
      }
      *((_BYTE *)v7 + 34) = v53 | 0x20;
      if( (*((_QWORD *)v7 + 3) & 0x4000000000000000i64) == 0 && (*(_BYTE *)v52 & 0x20) == 0 )
        MiWriteValidPteVolatile(v52, 1ui64);
      _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
    }
    v11 = v127;
    v16 = 0i64;
    v6 = BugCheckParameter1;
    LODWORD(v19) = v136;
    v9 = (UINT64)PoINTerPte;
    v17 = (char *)MmGetPfnDb() + 40;
LABEL_91:
    if( (*(_BYTE *)v9 & 1) != 0 )
      goto LABEL_196;
    v23 = *(_QWORD *)v6;
    v126 = v23;
    if( (v23 & 1) == 0 && ((v23 & 0x400) != 0 || (v23 & 0x800) == 0) )
      goto LABEL_30;
    while( 1 )
    {
      while( 1 )
      {
        v55 = *(_QWORD *)v6;
        if( (*(_QWORD *)v6 & 1) == 0 )
          break;
        v56 = *(_QWORD *)v6;
LABEL_105:
        CurrentPrcb = 6 * ((v56 >> 12) & 0xFFFFFFFFFi64);
        if( (*(_QWORD *)&v17[48 * ((v56 >> 12) & 0xFFFFFFFFFi64)] & 0x4000000000000i64) != 0 )
        {
          v57 = (char *)MmGetPfnDb() + 48 * ((v56 >> 12) & 0xFFFFFFFFFi64);
          HIDWORD(SpinCount) = 0;
          if( _interlockedbittestandset64((volatile signed __int32 *)v57 + 6, 0x3Fui64) )
          {
            do
            {
              do
                KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
              while( *((__int64 *)v57 + 3) < 0 );
            }
            while( _interlockedbittestandset64((volatile signed __int32 *)v57 + 6, 0x3Fui64) );
            v17 = (char *)MmGetPfnDb() + 40;
          }
          if( *(_QWORD *)v6 == v55 )
            goto LABEL_113;
          _InterlockedAnd64((volatile signed __int64 *)v57 + 3, 0x7FFFFFFFFFFFFFFFui64);
        }
      }
      if( (v55 & 0x400) != 0 || (v55 & 0x800) == 0 )
        break;
      if( !v55 || !qword_140C4DC80 || (v55 & qword_140C4DC80) != 0 )
      {
        v56 = *(_QWORD *)v6;
        if( qword_140C4DC80 && (v55 & 0x10) == 0 )
          v56 = v55 & ~qword_140C4DC80;
        goto LABEL_105;
      }
    }
    v57 = 0i64;
LABEL_113:
    v23 = *(_QWORD *)v6;
    v126 = *(_QWORD *)v6;
    if( !v57 )
      goto LABEL_30;
    if( (v23 & 1) == 0 )
    {
      if( (v57[34] & 0x20) == 0 && (v57[35] & 0x40) == 0 )
      {
        v59 = (__int64 *)(v57 + 16);
        v60 = *((_QWORD *)v57 + 2) >> 11;
        v61 = ((__int64)(v132 - v9) >> 3) + 1;
        if( (*((_QWORD *)v57 + 2) & 0x400i64) == 0 )
          v60 = *((_QWORD *)v57 + 2) >> 3;
        if( (v60 & 1) != 0 )
        {
          TransitionHeatBatch = (struct _SLIST_ENTRY *)MiMakeTransitionHeatBatch((INT64)v57);
          if( TransitionHeatBatch )
          {
            _InterlockedAnd64((volatile signed __int64 *)v57 + 3, 0x7FFFFFFFFFFFFFFFui64);
            MiUnlockProtoPoolPage(v7, PageIrql);
            PageIrql = 17;
            if( TransitionHeatBatch == (struct _SLIST_ENTRY *)-1i64 )
            {
              MiReplenishTransitionPageHeatList();
            }
            else
            {
              MiProcessTransitionHeatBatch((INT64)TransitionHeatBatch);
              MiFreeTransitionPageHeatList(TransitionHeatBatch);
            }
LABEL_127:
            v11 = v127;
            v16 = 0i64;
            v5 = BatchCount;
            v6 = 0i64;
            continue;
          }
        }
        if( (v57[34] & 7) != 2
          || v61 <= 1
          || MiIsPfnFromSlabAllocation((INT64)v57) && !*((_WORD *)v57 + 16) && *(__int64 *)v57 < 0 )
        {
          goto LABEL_147;
        }
        v63 = *v59;
        if( qword_140C4DC80 && (v63 & 0x10) == 0 )
          v63 &= ~qword_140C4DC80;
        if( (__int64)(*(_QWORD *)((v63 >> 16) + 8) + 8i64 * *(unsigned int *)((v63 >> 16) + 0x2C) - v6) >> 3 < v61 )
          v61 = (__int64)(*(_QWORD *)((v63 >> 16) + 8) + 8i64 * *(unsigned int *)((v63 >> 16) + 0x2C) - v6) >> 3;
        v64 = (unsigned __int64)(4096 - (unsigned int)(v6 & 0xFFF)) >> 3;
        if( v61 <= v64 )
          v64 = v61;
        v65 = 16 - BatchCount;
        if( v64 <= v65 )
          v65 = v64;
        if( v65 > 1 )
        {
          v66 = 0i64;
          PfnToDiscard = 0i64;
          PfnPriority = (unsigned int)MiGetPfnPriority((INT64)v57);
          LockHandle.LockQueue.Next = 0i64;
          LockHandle.LockQueue.Lock = (unsigned __int64 *volatile)((char *)Partition
                                                                 + 32 * PfnPriority
                                                                 + 8 * PfnPriority
                                                                 + 2464);
          KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, (PIO_WORKITEM_ROUTINE)LockHandle.LockQueue.Lock, v68, v69);
          v70 = MiUnlinkPageFromList((_MMPFN *)v57, 1ui64);
          if( v70 == 1 )
          {
            v71 = MiUnlinkStandbyBatch(
                    (_MMPFN *)&PfnToDiscard,
                    (_MMPTE *)(BugCheckParameter1 + 8),
                    (unsigned int)PfnPriority,
                    PoINTerPte,
                    v65 - 1,
                    &PfnToDiscard);
            v66 = PfnToDiscard;
            v133 = v71;
          }
          KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
          if( v66 )
          {
            MiDiscardTransitionPteEx((UINT64)v66, 0i64);
            v72 = 0x7FFFFFFFFFFFFFFFi64;
            _InterlockedAnd64((volatile signed __int64 *)v66 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_149:
            if( v70 )
            {
              v73 = *((_QWORD *)v57 + 1);
              v74 = v57[34] & 0xFE;
              ++*((_WORD *)v57 + 16);
              v57[34] = v74 | 6;
              v75 = (_MMPTE *)(v73 | 0x8000000000000000ui64);
              Pml4eBase = MmGetPml4eBase();
              v77 = (unsigned __int8)*v59 >> 5;
              v78 = (unsigned __int8)v57[34] >> 6;
              if( v78 != 1 )
              {
                if( v78 )
                {
                  if( v78 == 2 )
                    v77 = (unsigned int)v77 | 0x18;
                }
                else
                {
                  v77 = (unsigned int)v77 | 8;
                }
              }
              v79 = (unsigned __int64)MmGetPteBase();
              v80 = (((v57 - (char *)MmGetPfnDb()) / 48) & 0xFFFFFFFFFi64) << 12;
              v81 = v80 | MmProtectToPteMask[v77] & 0xFFFF000000000E7Fui64 | 0x21;
              v9 = (UINT64)PoINTerPte;
              if( (unsigned __int64)PoINTerPte < v79 || PoINTerPte > MmGetPteLimit() )
              {
                v82 = v80 | MmProtectToPteMask[v77] & 0xFFFF000000000E7Fui64 | 0x121;
              }
              else
              {
                if( PoINTerPte >= MmGetPdeBase() && PoINTerPte <= MmGetPdeLimit() )
                {
                  v81 = PoINTerPte == MmGetPxeSelfRef() ? v80 | MmProtectToPteMask[v77] & 0xFFFF000000000E7Fui64 | 0x8000000000000021ui64 : v80 & 0x7FFFFFFFFFFFFFFFi64 | MmProtectToPteMask[v77] & 0x7FFF000000000E7Fi64 | 0x21;
                  if( (unsigned int)MiUserPdeOrAbove((UINT64)PoINTerPte) )
                    v81 |= 4ui64;
                }
                if( v9 <= v79 + 0x3FFFFFFF78i64 )
                  v81 |= 4ui64;
                v82 = v81 | 0x100;
                if( !(unsigned int)MiIsAddressGlobal((__int64)((v9 << 25) - (v79 << 25)) >> 16) )
                  v82 = v77;
              }
              v83 = v82 & 0xFAFFFFFFFFFFFEFFui64 | ((word_140C4DD48 & 1 | 0xA000000000000i64) << 8);
              PxeUserLimit = MmGetPxeUserLimit();
              if( v75 >= Pml4eBase
                && v75 <= PxeUserLimit
                && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 )
              {
                v83 |= 0x8000000000000000ui64;
              }
              *(_QWORD *)v75 = v83;
              v6 = BugCheckParameter1;
              *((_QWORD *)v57 + 3) = *((_QWORD *)v57 + 3) & 0xC000000000000000ui64 | 1;
              PteShadow = *(_QWORD *)v6;
              if( v6 >= (unsigned __int64)Pml4eBase && v6 <= (unsigned __int64)PxeUserLimit )
                PteShadow = MiReadPteShadow((UNICODE_STRING *)v6, *(UNICODE_STRING **)v6, v77, (WCHAR *)v72);
              LODWORD(v19) = v136;
              ValidPte = PteShadow;
              goto LABEL_179;
            }
            MiDiscardTransitionPteEx((UINT64)v57, 0i64);
            _InterlockedAnd64((volatile signed __int64 *)v57 + 3, 0x7FFFFFFFFFFFFFFFui64);
            v9 = (UINT64)PoINTerPte;
            goto LABEL_127;
          }
        }
        else
        {
LABEL_147:
          v70 = MiUnlinkPageFromList((_MMPFN *)v57, 0i64);
        }
        v72 = 0x7FFFFFFFFFFFFFFFi64;
        goto LABEL_149;
      }
LABEL_116:
      _InterlockedAnd64((volatile signed __int64 *)v57 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_195:
      v16 = 0i64;
LABEL_196:
      v95 = 0i64;
      goto LABEL_197;
    }
    v58 = (v57[35] & 0x40) == 0;
    ValidPte = v23;
    if( !v58 )
      goto LABEL_116;
    *((_QWORD *)v57 + 3) ^= (*((_QWORD *)v57 + 3) ^ (*((_QWORD *)v57 + 3) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
LABEL_179:
    _InterlockedAnd64((volatile signed __int64 *)v57 + 3, 0x7FFFFFFFFFFFFFFFui64);
    v16 = 0i64;
    while( 1 )
    {
LABEL_210:
      v98 = KeGetCurrentIrql();
      __writecr8(2ui64);
      v11 = v127;
      LODWORD(v130) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)v11 + 6, 0x3Fui64) )
      {
        do
          KeYieldProcessorEx(&v130);
        while( *((__int64 *)v11 + 3) < 0 );
      }
      CurrentPrcb = *((_QWORD *)v11 + 3);
      *((_QWORD *)v11 + 3) = CurrentPrcb ^ ((CurrentPrcb + 1) ^ CurrentPrcb) & 0x3FFFFFFFFFFFFFFFi64;
      _InterlockedAnd64((volatile signed __int64 *)v11 + 3, 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v98);
      if( (v19 & 1) != 0 )
      {
        v99 = MI_READ_PTE_LOCK_FREE((INT64)&ValidPte);
        v100 = MiMakeValidPte(v9, (v99 >> 12) & 0xFFFFFFFFFi64, 536870913i64);
      }
      else
      {
        v100 = ValidPte;
        if( (v120 & 4) != 0 && (ValidPte & 0x42) == 0 && (ValidPte & 0x800) != 0 )
          v100 = ValidPte | 0x42;
      }
      v95 = v100 & 0xFFFFFFFFFFFFFEFBui64 | ((unsigned __int64)(word_140C4DD48 & 1) << 8);
LABEL_197:
      v9 += 8i64;
      ValidPte = v95;
      if( (unsigned int)v19 >= 2 )
      {
        v95 &= ~1ui64;
        ValidPte = v95;
      }
      v5 = BatchCount;
      if( BatchCount || v95 )
      {
        v142[BatchCount] = v95;
        BatchCount = ++v5;
        if( v5 == 16 )
        {
          if( PageIrql != 17 )
          {
            MiUnlockProtoPoolPage(v7, PageIrql);
            PageIrql = 17;
          }
          MiMakeSystemCacheRangeValid((_MMPTE *)(v9 - 128), (_MMPTE *)v142, 0x10ui64, (_MMPFN *)v11);
          v5 = 0;
          BatchCount = 0;
        }
      }
      if( !v133 )
        break;
      v96 = *(_QWORD *)(v6 + 8);
      v6 += 8i64;
      --v133;
      ValidPte = v96;
      v97 = *(_QWORD *)v9;
      v134 = v97;
      LODWORD(v19) = 0;
      if( (v97 & 1) != 0 )
      {
        LODWORD(v19) = 2;
      }
      else if( (v97 & 8) != 0 )
      {
        LODWORD(v19) = 1;
      }
    }
    PoINTerPte = (_MMPTE *)v9;
  }
  if( PageIrql != 17 )
  {
    HIDWORD(v130) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)v7 + 6, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx((UINT64 *)((char *)&v130 + 4));
      while( *((__int64 *)v7 + 3) < 0 );
    }
    *((_BYTE *)v7 + 34) &= ~0x20u;
    v101 = *((_WORD *)v7 + 16);
    if( !v101 )
      MiBadRefCount(v7, CurrentPrcb);
    v102 = v101 - 1;
    *((_WORD *)v7 + 16) = v102;
    if( !v102 && MiIsPfnFileOnly((INT64)v7) )
      goto LABEL_261;
    if( (unsigned int)MiAreChargesNeededToLockPage((INT64)v7) )
    {
      v104 = (WCHAR *)MmGetPteBase();
      v103 = (struct _KPRCB *)(v104 + 0x1FFFFFFFBCi64);
      v105 = (UNICODE_STRING *)(*((_QWORD *)v7 + 1) | 0x8000000000000000ui64);
      if( v105 > (UNICODE_STRING *)(v104 + 0x1FFFFFFFBCi64) || v105 < (UNICODE_STRING *)v104 )
      {
        v106 = *((_BYTE *)v7 + 35);
        if( (v106 & 0x20) != 0 )
        {
          *((_BYTE *)v7 + 35) = v106 & 0xDF;
          goto LABEL_260;
        }
      }
      LOBYTE(v107) = MI_PFN_IS_PROTO((UNICODE_STRING *)v7, v105, (UINT8)v103, v104);
      if( v107 && (*((_DWORD *)v7 + 4) & 0x400i64) != 0 )
      {
        v110 = 1i64;
        v111 = 1;
      }
      else if( v108 <= (unsigned __int64)v103 && v108 >= v109 && (*((_BYTE *)v7 + 35) & 0x20) != 0 )
      {
        v110 = 1i64;
        v111 = 1;
      }
      else
      {
        v110 = 1i64;
        if( v102 )
        {
          v111 = 0;
        }
        else
        {
          if( (*((_QWORD *)v7 + 3) & 0x4000000000000000i64) != 0 )
            v16 = 1i64;
          v128 = (_RTL_BITMAP_EX *)v16;
          v111 = v16;
        }
      }
      v112 = (*((_QWORD *)v7 + 5) >> 39) & 0x3FFi64;
      v113 = *(_QWORD *)(qword_140C4E388 + 8 * v112);
      if( v111 == 1 )
        MiReturnCommit(*(_MI_PARTITION **)(qword_140C4E388 + 8 * v112), 1ui64);
      if( (ULONG_PTR *)v113 != &MiSystemPartition )
        goto LABEL_258;
      v103 = KeGetCurrentPrcb();
      v114 = *((int *)v103 + 8391);
      if( (_DWORD)v114 == -1 )
        goto LABEL_258;
      if( (unsigned __int64)(v114 + 1) <= 0x100 )
      {
        do
        {
          v115 = _InterlockedCompareExchange((volatile signed __int32 *)v103 + 8391, v114 + 1, v114);
          v58 = (_DWORD)v114 == v115;
          LODWORD(v114) = v115;
          if( v58 )
            goto LABEL_259;
        }
        while( v115 != -1 && (unsigned __int64)(v115 + 1i64) <= 0x100 );
      }
      if( (int)v114 > 192
        && (_DWORD)v114 != -1
        && (_DWORD)v114 == _InterlockedCompareExchange((volatile signed __int32 *)v103 + 8391, 192, v114) )
      {
        v110 = (int)v114 - 192 + 1i64;
      }
      if( v110 )
LABEL_258:
        _InterlockedExchangeAdd64((volatile signed __int64 *)(v113 + 7168), v110);
LABEL_259:
      v5 = BatchCount;
LABEL_260:
      if( !v102 )
LABEL_261:
        MiPfnReferenceCountIsZero(v7, (v7 - MmGetPfnDb()) / 48, (UINT8 *)v103);
    }
    _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(PageIrql);
  }
  if( v5 )
    MiMakeSystemCacheRangeValid((_MMPTE *)(v9 - 8i64 * v5), (_MMPTE *)v142, v5, (_MMPFN *)v11);
  if( v140 )
    *v140 = BatchCount_4;
}

Referenced by:

CcFetchDataForRead
CcMapAndCopyInToCache
CcMapAndRead
CcMapDataForOverwrite
CcPinFileData
MiFinishHardFault