MiSharePages

VOID __fastcall MiSharePages(INT64 a1, _QWORD *a2, INT64 *a3, _QWORD *a4, INT64 a5){
  INT64 *v5; 
  __int64 v8; 
  _QWORD *v10; 
  INT64 v11; 
  int v12; 
  unsigned __int64 v13; 
  UINT64 *v14; 
  INT64 *v15; 
  int v16; 
  INT64 v17; 
  int v18; 
  INT64 v19; 
  int v20; 
  INT64 v21; 
  char v22; 
  UINT64 v23; 
  unsigned __int8 v24; 
  UINT8 v25; 
  INT64 v26; 
  int v27; 
  INT64 v28; 
  INT64 v29; 
  int v30; 
  INT64 *v31; 
  UINT64 v32; 
  _MMPTE *PteBase; 
  unsigned __int64 v34; 
  MMPTE *v35; 
  MMPTE *v36; 
  INT64 v37; 
  unsigned __int64 v38; 
  _MMPFN *v39; 
  int v40; 
  __int64 v41; 
  unsigned int v42; 
  __int64 v43; 
  UNICODE_STRING *v44; 
  UINT8 v45; 
  WCHAR *v46; 
  int v47; 
  __int64 v48; 
  __int64 v49; 
  UINT64 v50; 
  INT64 v51; 
  INT64 v52; 
  RTL_BALANCED_NODE *Address; 
  unsigned int v54; 
  __int64 *v55; 
  UINT64 v56; 
  BOOL IsZero; 
  __int64 v58; 
  __int64 v59; 
  __int64 v60; 
  VOID *v61; 
  UINT64 v62; 
  __int64 v63; 
  UINT64 v64; 
  INT64 *CombineProto; 
  __int64 v66; 
  __int64 v67; 
  INT64 v68; 
  __int64 v69; 
  INT64 v70; 
  __int64 v71; 
  bool v72; 
  char v73; 
  unsigned __int64 UltraMapping; 
  INT64 v75; 
  _QWORD *v76; 
  int v77; 
  INT64 CombineDomain; 
  _MI_PAGE_COMBINING_SUPPORT *v79; 
  _QWORD *v80; 
  int v81; 
  char v82; 
  INT64 a8; 
  __int64 v84; 
  UINT64 v85; 
  int v86; 
  UINT64 v87; 
  unsigned int v88; 
  volatile LONG *v89; 
  unsigned __int64 v90; 
  bool v91; 
  unsigned __int64 *v92; 
  __int64 v93; 
  UINT64 v94; 
  unsigned int v95; 
  __int64 *v96; 
  int i; 
  __int64 v98; 
  __int64 v99; 
  _QWORD *v100; 
  __int64 v101; 
  UINT64 v102; 
  unsigned __int64 v103; 
  _QWORD *v104; 
  UINT64 *v105; 
  INT64 v106; 
  ULONG_PTR BugCheckParameter2; 
  CHAR a7; 
  char v109; 
  char v110; 
  CHAR *a1a; 
  UINT64 v112; 
  UINT64 *v113; 
  UINT8 v115; 
  unsigned int InputPfn[3]; 
  int a2a; 
  unsigned int a2_4; 
  int v119; 
  _MI_PAGE_COMBINING_SUPPORT *Pcs; 
  UINT64 v121; 
  __int64 v122; 
  int v123; 
  int v124; 
  UINT64 *v125; 
  INT64 a6; 
  int v127; 
  _DWORD a4a[3]; 
  _QWORD *v129; 
  __int64 v130; 
  UINT64 v131; 
  INT64 v132; 
  INT64 a3a; 
  UINT64 SpinCount; 
  INT64 v135; 
  INT64 v136; 
  _ETHREAD *CurrentThread; 
  INT64 *v138; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  __int128 v140; 
  _QWORD *v141; 
  INT64 v142[2]; 
  __int128 v143; 
  __int64 v144; 
  KAPC_STATE ApcState; 
  int result; 
  __int16 result_4; 
  __int64 v148; 
  __int64 v149; 
  __int64 v150; 
  INT64 v151[26]; 
  __int64 v152; 
  __int64 v153; 
  __int64 v154[5]; 
  __int64 v155; 
  *(_QWORD *)&a4a[1] = a1;
  v5 = a3;
  v144 = 0i64;
  v141 = 0i64;
  v8 = 0i64;
  v135 = 0i64;
  v138 = 0i64;
  *(_OWORD *)v142 = 0i64;
  v143 = 0i64;
  memset(&ApcState, 0, sizeof(ApcState));
  v140 = 0i64;
  memset((INT64)&result, 0i64);
  memset((INT64)v151, 0i64);
  v10 = *(_QWORD **)(a1 + 24);
  a3a = *(_QWORD *)(a1 + 16);
  InputPfn[0] = *(_DWORD *)(a1 + 60);
  Pcs = (_MI_PAGE_COMBINING_SUPPORT *)*a4;
  v11 = a2[4];
  *(_QWORD *)&InputPfn[1] = 0i64;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v129 = v10;
  a2_4 = 0;
  v122 = 0i64;
  a1a = (CHAR *)v11;
  v12 = MiTbFlushType(v11);
  v13 = a2[3];
  v14 = (UINT64 *)a2[6];
  v123 = v12;
  v119 = 0;
  v124 = 0;
  v136 = a1 + 64;
  v15 = v151;
  a6 = (INT64)v151;
  if( v13 <= 0x14 )
  {
    v16 = v13;
  }
  else
  {
    v16 = 509;
    if( v13 < 0x1FD )
      v16 = v13;
    LODWORD(v17) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
    a6 = v17;
    v15 = (INT64 *)v17;
    if( !v17 )
    {
      v15 = v151;
      a6 = (INT64)v151;
      v16 = 20;
    }
  }
  v18 = v123;
  *((_DWORD *)v15 + 3) = 0;
  *((_WORD *)v15 + 2) = 0;
  v15[2] = 0i64;
  v15[3] = 0i64;
  *(_DWORD *)v15 = v18;
  *((_DWORD *)v15 + 2) = v16;
  v19 = a2[5];
  v130 = v19;
  if( v19 && v19 != *((_QWORD *)KeGetCurrentThread() + 23) )
  {
    KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
    v124 = MiPrepareAttachThread(v19, v19 + 1664);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    if( !v124 )
      goto LABEL_179;
    KeForceAttachProcess((PVOID)v19);
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v20 = a5;
  v21 = (INT64)a1a;
  while( 2 )
  {
    v22 = 0;
    v152 = 0i64;
    v153 = 0i64;
    v23 = 0i64;
    v154[0] = 0i64;
    v24 = 0;
    v155 = 0i64;
    v112 = 0i64;
    v109 = 0;
    v25 = MiLockWorkingSetShared(v21);
    v115 = v25;
    if( v130
      && ((*(_DWORD *)(v130 + 1124) & 0xC00u) < 0xC00 || *(_QWORD *)(v21 + 104) || (unsigned int)MiIsStoreProcess(v130)) )
    {
      MiUnlockWorkingSetShared(v21, v25);
      KeLeaveCriticalRegionThread((__int64)CurrentThread);
      v15 = (INT64 *)a6;
      goto LABEL_178;
    }
    while( 1 )
    {
      v26 = v24;
      v24 = 0;
      v125 = v14;
      if( (_BYTE)v26 != 1 )
        v24 = v26;
      v27 = 0;
      v110 = v24;
      if( (_BYTE)v26 != 1 )
        v27 = v119 + 1;
      v119 = v27;
      if( v22 )
      {
        v109 = 0;
        LOBYTE(v26) = 1;
        goto LABEL_31;
      }
      if( (v27 & 7) != 0 )
        goto LABEL_28;
      if( MiWorkingSetIsContended(v21) )
      {
        LOBYTE(v26) = 1;
        goto LABEL_31;
      }
      if( v23 && (MiPageTableLockIsContended(v21, v23, v28, v29, v106, BugCheckParameter2, a7), v30) )
      {
        LOBYTE(v26) = 1;
      }
      else
      {
LABEL_28:
        if( KeShouldYieldProcessor() )
          LOBYTE(v26) = 1;
        else
          v26 = (unsigned int)MiFlushTbListEarly(a6, 2) != 0;
      }
LABEL_31:
      if( !v14 )
        break;
      if( (_BYTE)v26 )
        goto LABEL_159;
      v31 = (INT64 *)v14[4];
      v32 = v14[1];
      v113 = (UINT64 *)v14[2];
      v121 = *v14;
      v131 = v32;
      if( (unsigned __int64)v31 >= 0x100 )
      {
        v127 = v31[5] & 0x1F;
      }
      else
      {
        v127 = (int)v31;
        v31 = 0i64;
      }
      PteBase = MmGetPteBase();
      v34 = (unsigned __int64)PteBase + ((v32 >> 9) & 0x7FFFFFFFF8i64);
      v132 = v34;
      v35 = (_MMPTE *)((char *)PteBase + ((v34 >> 9) & 0x7FFFFFFFF8i64));
      if( (MMPTE *)v112 == v35 )
        goto LABEL_41;
      if( v112 )
      {
        v21 = (INT64)a1a;
        v22 = 1;
        v109 = 1;
        v23 = v112;
      }
      else
      {
        v36 = MiLockLowestValidPageTable((INT64)a1a, (INT64 *)((char *)PteBase + ((v32 >> 9) & 0x7FFFFFFFF8i64)), &v138);
        v112 = (UINT64)v36;
        if( v36 == v35 )
        {
LABEL_41:
          if( !(unsigned int)MiRecheckVaVm(v26, v32) )
            goto LABEL_53;
          v37 = *(_QWORD *)v34;
          v135 = v37;
          if( (v37 & 1) != 0 )
          {
            v38 = MI_READ_PTE_LOCK_FREE((INT64)&v135);
            if( (*((_QWORD *)MmGetPfnDb() + 6 * ((v38 >> 12) & 0xFFFFFFFFFi64) + 5) & 0x4000000000000i64) == 0 )
              goto LABEL_53;
            v39 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * ((v38 >> 12) & 0xFFFFFFFFFi64));
            LODWORD(SpinCount) = 0;
            while( _interlockedbittestandset64((volatile signed __int32 *)v39 + 6, 0x3Fui64) )
            {
              do
                KeYieldProcessorEx(&SpinCount);
              while( *((__int64 *)v39 + 3) < 0 );
            }
          }
          else
          {
            if( (v37 & 0x400) != 0 )
              goto LABEL_53;
            if( (v37 & 0x800) == 0 )
              goto LABEL_53;
            v39 = MiLockTransitionLeafPage((_MMPTE *)v34, 0i64);
            if( !v39 )
              goto LABEL_53;
          }
          a4a[0] = MiCombineCandidate(Pcs, (_MMPFN *)InputPfn[0]);
          v40 = a4a[0];
          if( !a4a[0] )
          {
            _InterlockedAnd64((volatile signed __int64 *)v39 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_53:
            MiDereferenceCombineBlock(a3, v31);
            goto LABEL_54;
          }
          v41 = *((_BYTE *)v39 + 34) & 7;
          v42 = (*((_DWORD *)v39 + 4) >> 5) & 0x1F;
          a2a = 3;
          *(_QWORD *)&InputPfn[1] = v125[3];
          LODWORD(v43) = MiSearchNumaNodeTable((PVOID)((v39 - MmGetPfnDb()) / 48));
          if( *(_DWORD *)(v43 + 8) != v20 )
          {
            _InterlockedAnd64((volatile signed __int64 *)v39 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_57:
            MiDereferenceCombineBlock(a3, v31);
            v24 = v110;
            goto LABEL_54;
          }
          _InterlockedAnd64((volatile signed __int64 *)v39 + 3, 0x7FFFFFFFFFFFFFFFui64);
          if( (_BYTE)v41 == 6 )
          {
            if( v132 != (*((_QWORD *)v39 + 1) | 0x8000000000000000ui64) )
              goto LABEL_57;
            LOBYTE(v47) = MI_PFN_IS_PROTO((UNICODE_STRING *)v39, v44, v45, v46);
            if( v47 )
              goto LABEL_57;
            v48 = *((_QWORD *)v39 + 5);
            if( (v48 & 0x1000000000i64) != 0 )
              goto LABEL_57;
            if( (*((_BYTE *)v39 + 35) & 8) != 0 )
              goto LABEL_57;
            v49 = v48 & 0xFFFFFFFFFi64;
            if( v49 == 0xFFFFFFFFDi64 )
              goto LABEL_57;
            v50 = v131;
            if( (MiGetWsleContents(v49, v131) & 0xF) == 8 )
              goto LABEL_57;
            if( *((_WORD *)v39 + 16) != 1 )
              goto LABEL_57;
            v52 = 0i64;
            if( v40 == 1 )
            {
              Address = MiLocateAddress(v50);
              if( !Address
                || MiVadPageSizes[((unsigned __int64)LODWORD(Address[2].Children[0]) >> 18) & 3] == 16
                || !MiVadSupportsPrivateCommit((INT64)Address) )
              {
                goto LABEL_57;
              }
            }
            v54 = (*((_DWORD *)v39 + 4) >> 5) & 0x1F;
            if( v54 != v127 )
              goto LABEL_57;
            if( (v37 & 0x42) != 0 )
            {
              if( a2_4 < 8 )
              {
                v55 = v154;
LABEL_87:
                MiInsertTbFlushEntry(a6, v50, 1i64, 0i64);
                v58 = (__int64)v125;
                v59 = *v55;
                v24 = v110;
                *v55 = (__int64)v125;
                *(_QWORD *)(v58 + 16) = v59;
                goto LABEL_54;
              }
              MiMakeCombineCandidateClean(v51, v52);
              result_4 = 0;
              v149 = 0i64;
              v150 = 0i64;
              v148 = 1i64;
              result = v123;
              MiInsertTbFlushEntry((INT64)&result, v50, 1i64, 0i64);
              MiFlushTbList((__int64)&result);
              v51 = v132;
              v56 = v121;
              goto LABEL_75;
            }
            v56 = v121;
            if( v121 == qword_140C4EAD8 )
            {
              if( ((*((_DWORD *)v39 + 4) >> 5) & 0x18) == 0 && (v37 & 0x20) != 0 && a2_4 < 3 )
              {
                v55 = &v155;
                goto LABEL_87;
              }
LABEL_75:
              v21 = (INT64)a1a;
              if( v56 != qword_140C4EAD8 || !(unsigned int)MiPageMightBeZero((INT64)a1a, (INT64)v39, v51) )
                goto LABEL_90;
              HIDWORD(SpinCount) = 0;
              while( _interlockedbittestandset64((volatile signed __int32 *)v39 + 6, 0x3Fui64) )
              {
                do
                  KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
                while( *((__int64 *)v39 + 3) < 0 );
              }
              IsZero = MiConfirmPageIsZero((INT64)v39);
              _InterlockedAnd64((volatile signed __int64 *)v39 + 3, 0x7FFFFFFFFFFFFFFFui64);
              if( !IsZero )
                goto LABEL_90;
              v149 = 0i64;
              v150 = 0i64;
              v148 = 1i64;
              result = v123;
              result_4 = 4;
              MiInsertTbFlushEntry((INT64)&result, v50, 1i64, 0i64);
              MiFreeWsleList((INT64)a1a, (INT64)&result, 0);
              ++v122;
              ++v129[1];
              MiDereferenceCombineBlock(a3, v31);
              v24 = v110;
              v14 = v113;
              v23 = v112;
              v22 = v109;
            }
            else
            {
              v21 = (INT64)a1a;
LABEL_90:
              v24 = v110;
              if( (v54 & 0x18) != 0 )
                v24 = 1;
              v110 = v24;
              if( *(_QWORD *)&InputPfn[1] == qword_140C4E290
                || v40 != 1
                || *(_QWORD *)&InputPfn[1] == *(_QWORD *)(v21 + 864) && (*(_DWORD *)(v130 + 2516) & 0x1000) == 0 )
              {
                v60 = -1i64;
                if( v31 )
                {
                  LODWORD(v66) = a2a;
LABEL_111:
                  v69 = (__int64)v125;
                  goto LABEL_112;
                }
                v61 = (VOID *)v131;
                v62 = MiComputeHash64((UINT64 *)v131);
                if( v62 != v64 )
                  goto LABEL_54;
                if( v63 == qword_140C4E290 )
                {
                  if( !MiHashIsCommon(*(INT64 *)&a4a[1], v64, v61) )
                    goto LABEL_54;
                  v64 = v121;
                }
                LODWORD(v106) = 0;
                CombineProto = MiAllocateCombineProto((INT64)Pcs, v64, v54, &InputPfn[1], v106);
                v31 = CombineProto;
                if( !CombineProto )
                {
                  v31 = MiPopCombineBlock((_QWORD **)a3);
                  if( !v31 )
                    goto LABEL_54;
                  v66 = (int)MiProtectionToCacheAttribute(v54);
                  v67 = *(_QWORD *)(v136 + 8 * v66);
                  if( !v67 || *(_DWORD *)(v67 + 44) >= *(_DWORD *)(v67 + 40) )
                  {
                    v68 = *a3;
                    if( *(INT64 **)(*a3 + 8) != a3 )
                      __fastfail(3u);
                    *v31 = v68;
                    v31[1] = (INT64)a3;
                    *(_QWORD *)(v68 + 8) = v31;
                    *a3 = (INT64)v31;
                    goto LABEL_54;
                  }
                  *((_DWORD *)v31 + 10) = v54 | v31[5] & 0xFFFFFFE0;
                  v31[8] = *(_QWORD *)&InputPfn[1];
                  v60 = *(_QWORD *)(v67 + 8 * ((unsigned __int64)*(unsigned int *)(v67 + 44) >> 12) + 48);
                  goto LABEL_111;
                }
                v69 = (__int64)v125;
                LODWORD(v66) = a2a;
                v125[4] = (UINT64)CombineProto;
LABEL_112:
                v70 = MiConvertPrivateToProto((INT64)a1a, v132, (__int64)v31, InputPfn[0], &Pcs->Partition, a6, v60);
                if( !v70 )
                  goto LABEL_53;
                ++v129[1];
                if( v60 == -1 )
                {
                  v31 = 0i64;
                  ++v122;
                }
                else
                {
                  MiIncrementCombineMdl(*(INT64 *)&a4a[1], (unsigned int)v66);
                }
                v71 = v152;
                *(_QWORD *)(v69 + 8) = v70;
                v72 = v60 != -1;
                *(_QWORD *)(v69 + 16) = v71;
                v152 = v69;
LABEL_144:
                if( v72 )
                {
                  v85 = v121;
                  v86 = *((_DWORD *)v31 + 10);
                  v87 = v121 & 0xF;
                  v31[3] = v121;
                  *(_QWORD *)&v140 = v85;
                  v88 = v86 & 0x1F;
                  v89 = (volatile LONG *)((char *)Pcs + 16 * (unsigned int)v87);
                  DWORD2(v140) = v88;
                  v141 = v31 + 8;
                  v90 = ExAcquireSpinLockExclusive(v89 + 26);
                  v91 = 0;
                  v92 = (unsigned __int64 *)&Pcs->CombinePageListHeads[v87];
                  v93 = *v92;
                  if( *v92 )
                  {
                    while( 1 )
                    {
                      while( 1 )
                      {
                        v94 = *(_QWORD *)(v93 + 24);
                        if( v121 > v94 )
                          break;
                        if( v121 >= v94 )
                        {
                          v95 = *(_DWORD *)(v93 + 40) & 0x1F;
                          if( v88 > v95
                            || v88 >= v95
                            && (v31 == (INT64 *)-64i64 || (unsigned __int64)v31[8] >= *(_QWORD *)(v93 + 64)) )
                          {
                            break;
                          }
                        }
                        if( !*(_QWORD *)v93 )
                          goto LABEL_157;
                        v93 = *(_QWORD *)v93;
                      }
                      if( !*(_QWORD *)(v93 + 8) )
                        break;
                      v93 = *(_QWORD *)(v93 + 8);
                    }
                    v91 = 1;
                  }
LABEL_157:
                  RtlAvlInsertNodeEx(v92, v93, v91, v31);
                  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v89 + 13);
                  __writecr8(v90);
                  v24 = v110;
                }
LABEL_54:
                v14 = v113;
                v23 = v112;
                v22 = v109;
                v21 = (INT64)a1a;
              }
              else
              {
                MiDereferenceCombineBlock(a3, v31);
                v14 = v113;
                v23 = v112;
                v22 = v109;
              }
            }
          }
          else
          {
            v73 = 0;
            UltraMapping = MiGetUltraMapping((unsigned __int64 *)(*(_QWORD *)&a4a[1] + 208i64), 3u, 1i64, 0);
            v75 = a4a[0];
            v76 = (_QWORD *)((char *)MmGetPteBase() + ((UltraMapping >> 9) & 0x7FFFFFFFF8i64));
            v77 = 1;
            v21 = (INT64)a1a;
            if( *(_QWORD *)&InputPfn[1] == qword_140C4E290
              || a4a[0] != 1
              || (CombineDomain = MiGetCombineDomain(1i64, (INT64)a1a), *(_QWORD *)&InputPfn[1] == CombineDomain)
              && (*(_DWORD *)(v130 + 2516) & 0x1000) == 0 )
            {
              if( v76 )
              {
                v79 = Pcs;
                v80 = (_QWORD *)a3a;
                LODWORD(v106) = v77;
                *(_QWORD *)(a3a + 72) = v76;
                v80[8] = v39;
                MiMapArbitraryPage(v79, v80, InputPfn[0], v75, v106);
                if( !v81 )
                {
                  *v76 = ZeroPte;
                  goto LABEL_57;
                }
                v82 = v110;
                if( (v42 & 0x18) != 0 )
                  v82 = 1;
                v110 = v82;
                a8 = -1i64;
                if( !v31 )
                {
                  if( !(unsigned int)MiPerformCombineScan(
                                        *(INT64 *)&a4a[1],
                                        a3a,
                                        *(_QWORD *)&InputPfn[1] == qword_140C4E290,
                                        v142)
                    || v142[0] != v121 )
                  {
                    goto LABEL_141;
                  }
                  LODWORD(v106) = 0;
                  v31 = MiAllocateCombineProto((INT64)Pcs, v121, v42, &InputPfn[1], v106);
                  if( !v31 )
                  {
                    v31 = MiPopCombineBlock((_QWORD **)a3);
                    if( v31 )
                    {
                      a2a = MiProtectionToCacheAttribute(v42);
                      v84 = *(_QWORD *)(v136 + 8i64 * a2a);
                      if( v84 )
                      {
                        if( *(_DWORD *)(v84 + 44) < *(_DWORD *)(v84 + 40) )
                        {
                          *((_DWORD *)v31 + 10) = v42 | v31[5] & 0xFFFFFFE0;
                          v31[8] = *(_QWORD *)&InputPfn[1];
                          a8 = *(_QWORD *)(v84 + 8 * ((unsigned __int64)*(unsigned int *)(v84 + 44) >> 12) + 48);
                          goto LABEL_137;
                        }
                      }
                    }
LABEL_141:
                    v72 = 0;
LABEL_142:
                    MiReleaseArbitraryPage(a3a);
                    *v76 = ZeroPte;
                    if( !v73 )
                      goto LABEL_57;
                    v24 = v110;
                    goto LABEL_144;
                  }
                  v125[4] = (UINT64)v31;
                }
LABEL_137:
                if( !(unsigned int)MiConvertStandbyToProto(
                                      a1a,
                                      Pcs,
                                      a3a,
                                      InputPfn[0],
                                      (INT64)v31,
                                      (UINT64)v39,
                                      v132,
                                      a8) )
                  goto LABEL_141;
                ++v129[1];
                if( a8 == -1 )
                {
                  v31 = 0i64;
                  v73 = 1;
                  ++v122;
                  v72 = 0;
                }
                else
                {
                  MiIncrementCombineMdl(*(INT64 *)&a4a[1], (unsigned int)a2a);
                  v72 = 1;
                  v73 = 1;
                }
                goto LABEL_142;
              }
            }
            MiDereferenceCombineBlock(a3, v31);
            v24 = v110;
            v14 = v113;
            v23 = v112;
            v22 = v109;
          }
        }
        else
        {
          v21 = (INT64)a1a;
          MiUnlockPageTable((INT64)a1a, (UINT64)v36);
          v23 = 0i64;
          v112 = 0i64;
          MiDereferenceCombineBlock(a3, v31);
          v14 = v113;
          v22 = v109;
        }
      }
    }
    ++a2_4;
LABEL_159:
    v96 = v154;
    v131 = (UINT64)v154;
    for( i = 2; i <= 3; ++i )
    {
      v98 = *v96;
      if( *v96 )
      {
        do
        {
          v99 = *(_QWORD *)(v98 + 16);
          if( (unsigned int)MiCrcStillIntact(Pcs, (__int64)a1a, InputPfn[0], v98, i) )
          {
            *(_QWORD *)(v98 + 16) = v14;
            v14 = (UINT64 *)v98;
          }
          else
          {
            v100 = *(_QWORD **)(v98 + 32);
            if( (unsigned __int64)v100 >= 0x100 )
              MiDereferenceCombineBlock(a3, v100);
          }
          v98 = v99;
        }
        while( v99 );
        v96 = (__int64 *)v131;
      }
      *v96 = 0i64;
      v96 += 5;
      v131 = (UINT64)v96;
    }
    v15 = (INT64 *)a6;
    v20 = a5;
    MiFlushTbList(a6);
    v21 = (INT64)a1a;
    if( v112 )
      MiUnlockPageTable((INT64)a1a, v112);
    MiUnlockWorkingSetShared((INT64)a1a, v115);
    v101 = v152;
    if( v152 )
    {
      do
      {
        v102 = *(_QWORD *)(v101 + 8);
        v103 = (unsigned __int8)MiLockPageInline(v102);
        *(_BYTE *)(v102 + 34) = *(_BYTE *)(v102 + 34) & 0xF8 | 6;
        MiDecrementShareCount(v102);
        _InterlockedAnd64((volatile signed __int64 *)(v102 + 24), 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(v103);
        v101 = *(_QWORD *)(v101 + 16);
      }
      while( v101 );
      v20 = a5;
      v21 = (INT64)a1a;
    }
    if( v14 )
    {
      v5 = a3;
      continue;
    }
    break;
  }
  KeLeaveCriticalRegionThread((__int64)CurrentThread);
  v5 = a3;
LABEL_178:
  v19 = v130;
  v10 = v129;
  v8 = v122;
LABEL_179:
  if( v14 )
  {
    do
    {
      v104 = (_QWORD *)v14[4];
      v105 = (UINT64 *)v14[2];
      if( (unsigned __int64)v104 >= 0x100 )
        MiDereferenceCombineBlock(v5, v104);
      v14 = v105;
    }
    while( v105 );
  }
  if( v124 == 1 )
  {
    KeForceDetachProcess(&ApcState, 0);
    MiAttachThreadDone((_MMSUPPORT_INSTANCE *)(v19 + 1664));
  }
  if( v15 != v151 )
    ExFreePoolWithTag(v15, 0);
  *v10 += v8;
}

Referenced by:

MiProcessCrcList