MiSharePages

char *__fastcall MiSharePages(__int64 a1, _QWORD *a2, _LIST_ENTRY *a3, _MI_PAGE_COMBINING_SUPPORT **a4, int a5){
  _LIST_ENTRY *v5; 
  __int64 v8; 
  _QWORD *v10; 
  _MMSUPPORT_INSTANCE *v11; 
  _KTBFLUSH_TYPE v12; 
  unsigned __int64 v13; 
  UINT64 *v14; 
  _MI_TB_FLUSH_LIST *v15; 
  __int64 v16; 
  int v17; 
  _EPROCESS *v18; 
  int v19; 
  _MMSUPPORT_INSTANCE *v20; 
  char v21; 
  UINT64 v22; 
  unsigned __int8 v23; 
  unsigned __int8 v24; 
  unsigned __int8 v25; 
  unsigned __int64 v26; 
  int v27; 
  int v28; 
  int v29; 
  _MI_COMBINE_BLOCK *PrivatePfn; 
  UINT64 v31; 
  _MMPTE *PteBase; 
  UINT64 v33; 
  _MMPTE *v34; 
  _MMPTE *v35; 
  INT64 v36; 
  unsigned __int64 v37; 
  _MMPFN *v38; 
  int v39; 
  char v40; 
  unsigned int v41; 
  __int64 v42; 
  _UNICODE_STRING *v43; 
  UINT8 v44; 
  wchar_t *v45; 
  int v46; 
  __int64 bf_0; 
  __int64 v48; 
  VOID *v49; 
  _MMPTE *v50; 
  _MMVAD *v51; 
  _MMVAD *Address; 
  int v53; 
  unsigned int v54; 
  __int64 *v55; 
  UINT64 v56; 
  UINT64 v57; 
  NTSTATUS IsZero; 
  __int64 v59; 
  __int64 v60; 
  __int64 v61; 
  __int64 v62; 
  __int64 v63; 
  UINT64 v64; 
  _MI_COMBINE_BLOCK *CombineProto; 
  __int64 v66; 
  __int64 v67; 
  _LIST_ENTRY *Flink; 
  __int64 v69; 
  _MMPFN *v70; 
  __int64 v71; 
  bool v72; 
  char v73; 
  unsigned __int64 v74; 
  UINT64 v75; 
  unsigned __int64 *v76; 
  __int64 v77; 
  _MI_PAGE_COMBINING_SUPPORT *v78; 
  _MI_ARBITRARY_PAGE_MAP *v79; 
  unsigned __int64 Long; 
  int v81; 
  char v82; 
  __int64 v83; 
  __int64 v84; 
  unsigned __int64 v85; 
  int v86; 
  UINT64 v87; 
  _MI_COMBINE_BLOCK v88; 
  UINT64 v89; 
  unsigned int v90; 
  INT64 *v91; 
  unsigned __int64 v92; 
  BOOL v93; 
  _MI_COMBINE_PAGE_LISTHEAD *v94; 
  _RTL_BALANCED_NODE *Root; 
  UINT64 v96; 
  unsigned int v97; 
  __int64 *v98; 
  int i; 
  __int64 v100; 
  __int64 v101; 
  _MI_COMBINE_BLOCK *v102; 
  __int64 v103; 
  __int64 v104; 
  unsigned __int64 v105; 
  _MI_COMBINE_BLOCK *v106; 
  UINT64 *v107; 
  char *result; 
  char v109; 
  char v110; 
  _MMSUPPORT_INSTANCE *v111; 
  UINT64 v112; 
  UINT64 *v113; 
  unsigned __int8 v115; 
  _MI_COMBINE_CANDIDATE InputPfn[3]; 
  int v117; 
  unsigned int v118; 
  int v119; 
  _MI_PAGE_COMBINING_SUPPORT *Pcs; 
  UINT64 HashValue; 
  __int64 v122; 
  int v123; 
  NTSTATUS v124; 
  UINT64 *v125; 
  _MI_TB_FLUSH_LIST *TbFlushList; 
  int v127; 
  _DWORD StandbyOnly[3]; 
  _QWORD *v129; 
  _EPROCESS *Process; 
  UINT64 v131; 
  INT64 v132; 
  _MI_ARBITRARY_PAGE_MAP *PageMap; 
  UINT64 SpinCount; 
  INT64 v135; 
  __int64 v136; 
  _KTHREAD *Thread; 
  INT64 *v138; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  __int128 v140; 
  _DWORD *v141; 
  __int128 v142; 
  __int128 v143; 
  __int64 v144; 
  _KAPC_STATE ApcState; 
  _BYTE v146[184]; 
  char v147[208]; 
  __int64 v148; 
  __int64 v149; 
  __int64 v150[5]; 
  __int64 v151; 

  *(_QWORD *)&StandbyOnly[1] = a1;
  v5 = a3;
  v144 = 0i64;
  v141 = 0i64;
  v8 = 0i64;
  v135 = 0i64;
  v138 = 0i64;
  v142 = 0i64;
  v143 = 0i64;
  memset(&ApcState, 0, sizeof(ApcState));
  v140 = 0i64;
  memset(v146, 0i64, sizeof(v146));
  memset(v147, 0i64, 0xB8u);
  v10 = *(_QWORD **)(a1 + 24);
  PageMap = *(_MI_ARBITRARY_PAGE_MAP **)(a1 + 16);
  InputPfn[0] = *(_MI_COMBINE_CANDIDATE *)(a1 + 60);
  Pcs = *a4;
  v11 = (_MMSUPPORT_INSTANCE *)a2[4];
  *(_QWORD *)&InputPfn[1] = 0i64;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v129 = v10;
  v118 = 0;
  v122 = 0i64;
  v111 = v11;
  v12 = MiTbFlushType(v11);
  v13 = a2[3];
  v14 = (UINT64 *)a2[6];
  v123 = v12;
  v119 = 0;
  v124 = 0;
  v136 = a1 + 64;
  v15 = (_MI_TB_FLUSH_LIST *)v147;
  TbFlushList = (_MI_TB_FLUSH_LIST *)v147;
  if( v13 <= 0x14 )
  {
    LODWORD(v16) = v13;
  }
  else
  {
    v16 = 509i64;
    if( v13 < 0x1FD )
      v16 = v13;
    TbFlushList = (_MI_TB_FLUSH_LIST *)MiAllocatePool(64i64, 8 * v16 + 24, 0x73576D4Dui64);
    v15 = TbFlushList;
    if( !TbFlushList )
    {
      v15 = (_MI_TB_FLUSH_LIST *)v147;
      TbFlushList = (_MI_TB_FLUSH_LIST *)v147;
      LODWORD(v16) = 20;
    }
  }
  v17 = v123;
  v15[3] = 0;
  *((_WORD *)v15 + 2) = 0;
  *((_QWORD *)v15 + 2) = 0i64;
  *((_QWORD *)v15 + 3) = 0i64;
  *v15 = v17;
  v15[2] = v16;
  v18 = (_EPROCESS *)a2[5];
  Process = v18;
  if( v18 && v18 != KeGetCurrentThread()->ApcState.Process )
  {
    KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 522, &LockHandle);
    v124 = MiPrepareAttachThread(v18, &v18->Vm.Instance);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    if( !v124 )
      goto LABEL_187;
    KeForceAttachProcess(v18);
  }
  Thread = (_ETHREAD *)KeGetCurrentThread();
  --Thread->Tcb.KernelApcDisable;
  v19 = a5;
  v20 = v111;
  while( 2 )
  {
    v21 = 0;
    v148 = 0i64;
    v149 = 0i64;
    v22 = 0i64;
    v150[0] = 0i64;
    v23 = 0;
    v151 = 0i64;
    v112 = 0i64;
    v109 = 0;
    MiLockWorkingSetShared();
    v25 = v24;
    v115 = v24;
    if( Process && ((Process->Flags & 0xC00) < 0xC00 || v20->ExitOutswapGate || MiIsStoreProcess(Process)) )
    {
      MiUnlockWorkingSetShared(v20, v25);
      KeLeaveCriticalRegionThread(&Thread->Tcb);
      v15 = TbFlushList;
      goto LABEL_186;
    }
    while( 1 )
    {
      v26 = v23;
      v23 = 0;
      v125 = v14;
      if( (_BYTE)v26 != 1 )
        v23 = v26;
      v27 = 0;
      v110 = v23;
      if( (_BYTE)v26 != 1 )
        v27 = v119 + 1;
      v119 = v27;
      if( v21 )
      {
        v109 = 0;
        LOBYTE(v26) = 1;
        goto LABEL_31;
      }
      if( (v27 & 7) != 0 )
        goto LABEL_28;
      LOBYTE(v28) = MiWorkingSetIsContended((INT64)v20);
      if( v28 )
      {
        LOBYTE(v26) = 1;
        goto LABEL_31;
      }
      if( v22 && (unsigned int)MiPageTableLockIsContended((__int64)v20, v22) )
      {
        LOBYTE(v26) = 1;
      }
      else
      {
LABEL_28:
        if( (unsigned int)KeShouldYieldProcessor() )
        {
          LOBYTE(v26) = 1;
        }
        else
        {
          MiFlushTbListEarly(TbFlushList, (_BYTE *)2);
          v26 = v29 != 0;
        }
      }
LABEL_31:
      if( !v14 )
        break;
      if( (_BYTE)v26 )
        goto LABEL_167;
      PrivatePfn = (_MI_COMBINE_BLOCK *)v14[4];
      v31 = v14[1];
      v113 = (UINT64 *)v14[2];
      HashValue = *v14;
      v131 = v31;
      if( (unsigned __int64)PrivatePfn >= 0x100 )
      {
        v127 = PrivatePfn[10] & 0x1F;
      }
      else
      {
        v127 = (int)PrivatePfn;
        PrivatePfn = 0i64;
      }
      PteBase = MmGetPteBase();
      v33 = (UINT64)PteBase + ((v31 >> 9) & 0x7FFFFFFFF8i64);
      v132 = v33;
      v34 = (_MMPTE *)((char *)PteBase + ((v33 >> 9) & 0x7FFFFFFFF8i64));
      if( (_MMPTE *)v112 == v34 )
        goto LABEL_41;
      if( v112 )
      {
        v20 = v111;
        v21 = 1;
        v109 = 1;
        v22 = v112;
      }
      else
      {
        v35 = MiLockLowestValidPageTable(
                (INT64)v111,
                (INT64 *)((char *)PteBase + ((v31 >> 9) & 0x7FFFFFFFF8i64)),
                &v138);
        v112 = (UINT64)v35;
        if( v35 == v34 )
        {
LABEL_41:
          if( !MiRecheckVaVm((_MMSUPPORT_INSTANCE *)v26, (VOID *)v31) )
            goto LABEL_53;
          v36 = *(_QWORD *)v33;
          MiPteInShadowRange(v33);
          v135 = v36;
          if( (v36 & 1) != 0 )
          {
            LODWORD(v37) = MI_READ_PTE_LOCK_FREE((INT64)&v135);
            if( (MmGetPfnDb()[(v37 >> 12) & 0xFFFFFFFFFi64].u4._bf_0 & 0x4000000000000i64) == 0 )
              goto LABEL_53;
            v38 = &MmGetPfnDb()[(v37 >> 12) & 0xFFFFFFFFFi64];
            LODWORD(SpinCount) = 0;
            while( _interlockedbittestandset64((volatile signed __int32 *)&v38->u2, 0x3Fui64) )
            {
              do
                KeYieldProcessorEx(&SpinCount);
              while( v38->u2._bf_0 < 0 );
            }
          }
          else
          {
            if( (v36 & 0x400) != 0 )
              goto LABEL_53;
            if( (v36 & 0x800) == 0 )
              goto LABEL_53;
            v38 = MiLockTransitionLeafPage(v33, 0i64);
            if( !v38 )
              goto LABEL_53;
          }
          StandbyOnly[0] = MiCombineCandidate(Pcs, (_MMPFN *)(unsigned int)InputPfn[0]);
          v39 = StandbyOnly[0];
          if( !StandbyOnly[0] )
          {
            _InterlockedAnd64(&v38->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_53:
            MiDereferenceCombineBlock(a3, PrivatePfn);
            goto LABEL_54;
          }
          v40 = *(_BYTE *)(&v38->u3 + 1) & 7;
          v41 = (*((_DWORD *)&v38->3 + 4) >> 5) & 0x1F;
          v117 = 3;
          *(_QWORD *)&InputPfn[1] = v125[3];
          LODWORD(v42) = MiSearchNumaNodeTable((PVOID)(v38 - MmGetPfnDb()));
          if( *(_DWORD *)(v42 + 8) != v19 )
          {
            _InterlockedAnd64(&v38->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_57:
            MiDereferenceCombineBlock(a3, PrivatePfn);
            v23 = v110;
            goto LABEL_54;
          }
          _InterlockedAnd64(&v38->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
          if( v40 == 6 )
          {
            if( v132 != (v38->PteLong | 0x8000000000000000ui64) )
              goto LABEL_57;
            LOBYTE(v46) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v38, v43, v44, v45);
            if( v46 )
              goto LABEL_57;
            bf_0 = v38->u4._bf_0;
            if( (bf_0 & 0x1000000000i64) != 0 )
              goto LABEL_57;
            if( (*((_BYTE *)&v38->u3 + 3) & 8) != 0 )
              goto LABEL_57;
            v48 = bf_0 & 0xFFFFFFFFFi64;
            if( v48 == 0xFFFFFFFFDi64 )
              goto LABEL_57;
            v49 = (VOID *)v131;
            if( (MiGetWsleContents(v48, v131) & 0xF) == 8 )
              goto LABEL_57;
            if( v38->u3.ReferenceCount != 1 )
              goto LABEL_57;
            v51 = 0i64;
            if( v39 == 1 )
            {
              Address = MiLocateAddress(v49);
              if( !Address )
                goto LABEL_57;
              if( MiVadPageSizes[((unsigned __int64)Address->Core.u.LongFlags >> 18) & 3] == 16 )
                goto LABEL_57;
              LOBYTE(v53) = MiVadSupportsPrivateCommit((INT64)Address);
              if( !v53 )
                goto LABEL_57;
            }
            v54 = (*((_DWORD *)&v38->3 + 4) >> 5) & 0x1F;
            if( v54 != v127 )
              goto LABEL_57;
            if( (v36 & 0x42) != 0 )
            {
              if( v118 < 8 )
              {
                v55 = v150;
LABEL_87:
                MiInsertTbFlushEntry(TbFlushList, v49, 1ui64, 0i64);
                v59 = (__int64)v125;
                v60 = *v55;
                v23 = v110;
                *v55 = (__int64)v125;
                *(_QWORD *)(v59 + 16) = v60;
                goto LABEL_54;
              }
              MiMakeCombineCandidateClean(v50, v51);
              *(_WORD *)&v146[4] = 0;
              *(_QWORD *)&v146[16] = 0i64;
              *(_QWORD *)&v146[24] = 0i64;
              *(_QWORD *)&v146[8] = 1i64;
              *(_DWORD *)v146 = v123;
              MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)v146, v49, 1ui64, 0i64);
              MiFlushTbList((_MI_TB_FLUSH_LIST *)v146);
              v50 = (_MMPTE *)v132;
              v56 = HashValue;
              goto LABEL_75;
            }
            v56 = HashValue;
            if( HashValue == *(&stru_140C4DB30 + 501) )
            {
              if( ((*((_DWORD *)&v38->3 + 4) >> 5) & 0x18) == 0 && (v36 & 0x20) != 0 && v118 < 3 )
              {
                v55 = &v151;
                goto LABEL_87;
              }
LABEL_75:
              v20 = v111;
              if( v56 != *(&stru_140C4DB30 + 501) || !MiPageMightBeZero((INT64)v111, (INT64)v38, (INT64)v50) )
                goto LABEL_90;
              HIDWORD(SpinCount) = 0;
              while( _interlockedbittestandset64((volatile signed __int32 *)&v38->u2, 0x3Fui64) )
              {
                do
                  KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
                while( v38->u2._bf_0 < 0 );
              }
              IsZero = MiConfirmPageIsZero(v38, v57);
              _InterlockedAnd64(&v38->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
              if( !IsZero )
                goto LABEL_90;
              *(_QWORD *)&v146[16] = 0i64;
              *(_QWORD *)&v146[24] = 0i64;
              *(_QWORD *)&v146[8] = 1i64;
              *(_DWORD *)v146 = v123;
              *(_WORD *)&v146[4] = 4;
              MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)v146, v49, 1ui64, 0i64);
              MiFreeWsleList(v111, (_MMWSLE_FLUSH_LIST *)v146, 0i64);
              ++v122;
              ++v129[1];
              MiDereferenceCombineBlock(a3, PrivatePfn);
              v23 = v110;
              v14 = v113;
              v22 = v112;
              v21 = v109;
            }
            else
            {
              v20 = v111;
LABEL_90:
              v23 = v110;
              if( (v54 & 0x18) != 0 )
                v23 = 1;
              v110 = v23;
              if( *(_QWORD *)&InputPfn[1] == *(&stru_140C4DB30 + 236)
                || v39 != 1
                || *(_QWORD *)&InputPfn[1] == v20[4].AgeDistribution[7] && (Process->MitigationFlags2 & 0x1000) == 0 )
              {
                v61 = -1i64;
                if( PrivatePfn )
                {
                  LODWORD(v66) = v117;
LABEL_111:
                  v69 = (__int64)v125;
                  goto LABEL_112;
                }
                LODWORD(v62) = MiComputeHash64((UINT64 *)v131);
                if( v62 != v64 )
                  goto LABEL_54;
                if( v63 == *(&stru_140C4DB30 + 236) )
                {
                  if( !MiHashIsCommon(*(_MI_COMBINE_CONTROL_BLOCK **)&StandbyOnly[1], v64) )
                    goto LABEL_54;
                  v64 = HashValue;
                }
                CombineProto = MiAllocateCombineProto(Pcs, v64, v54, (UINT64)&InputPfn[1]);
                PrivatePfn = CombineProto;
                if( !CombineProto )
                {
                  PrivatePfn = (_MI_COMBINE_BLOCK *)MiPopCombineBlock(a3);
                  if( !PrivatePfn )
                    goto LABEL_54;
                  v66 = MiProtectionToCacheAttribute(v54);
                  v67 = *(_QWORD *)(v136 + 8 * v66);
                  if( !v67 || *(_DWORD *)(v67 + 44) >= *(_DWORD *)(v67 + 40) )
                  {
                    Flink = a3->Flink;
                    if( a3->Flink->Blink != a3 )
                      __fastfail(3u);
                    *(_QWORD *)PrivatePfn = Flink;
                    *((_QWORD *)PrivatePfn + 1) = a3;
                    Flink->Blink = (_LIST_ENTRY *)PrivatePfn;
                    a3->Flink = (_LIST_ENTRY *)PrivatePfn;
                    goto LABEL_54;
                  }
                  PrivatePfn[10] = v54 | PrivatePfn[10] & 0xFFFFFFE0;
                  *((_QWORD *)PrivatePfn + 8) = *(_QWORD *)&InputPfn[1];
                  v61 = *(_QWORD *)(v67 + 8 * ((unsigned __int64)*(unsigned int *)(v67 + 44) >> 12) + 48);
                  goto LABEL_111;
                }
                v69 = (__int64)v125;
                LODWORD(v66) = v117;
                v125[4] = (UINT64)CombineProto;
LABEL_112:
                v70 = MiConvertPrivateToProto(
                        v111,
                        (_MMPTE *)v132,
                        (_MMPTE *)PrivatePfn,
                        (_MI_PAGE_COMBINING_SUPPORT *)(unsigned int)InputPfn[0],
                        (_MI_TB_FLUSH_LIST *)Pcs,
                        (UINT64)TbFlushList);
                if( !v70 )
                  goto LABEL_53;
                ++v129[1];
                if( v61 == -1 )
                {
                  PrivatePfn = 0i64;
                  ++v122;
                }
                else
                {
                  MiIncrementCombineMdl(*(__int64 *)&StandbyOnly[1], v66);
                }
                v71 = v148;
                *(_QWORD *)(v69 + 8) = v70;
                v72 = v61 != -1;
                *(_QWORD *)(v69 + 16) = v71;
                v148 = v69;
LABEL_152:
                if( v72 )
                {
                  v87 = HashValue;
                  v88 = PrivatePfn[10];
                  v89 = HashValue & 0xF;
                  *((_QWORD *)PrivatePfn + 3) = HashValue;
                  *(_QWORD *)&v140 = v87;
                  v90 = v88 & 0x1F;
                  v91 = (INT64 *)((char *)Pcs + 16 * (unsigned int)v89);
                  DWORD2(v140) = v90;
                  v141 = PrivatePfn + 16;
                  v92 = (unsigned __int8)ExAcquireSpinLockExclusive(v91 + 13);
                  v93 = 0;
                  v94 = &Pcs->CombinePageListHeads[v89];
                  Root = v94->Table.Root;
                  if( v94->Table.Root )
                  {
                    while( 1 )
                    {
                      while( 1 )
                      {
                        v96 = (UINT64)Root[1].Children[0];
                        if( HashValue > v96 )
                          break;
                        if( HashValue >= v96 )
                        {
                          v97 = *(_DWORD *)&Root[1]._bf_0 & 0x1F;
                          if( v90 > v97
                            || v90 >= v97
                            && (PrivatePfn == (_MI_COMBINE_BLOCK *)-64i64
                             || *((_QWORD *)PrivatePfn + 8) >= Root[2].ParentValue) )
                          {
                            break;
                          }
                        }
                        if( !Root->Children[0] )
                          goto LABEL_165;
                        Root = Root->Children[0];
                      }
                      if( !Root->Children[1] )
                        break;
                      Root = Root->Children[1];
                    }
                    v93 = 1;
                  }
LABEL_165:
                  RtlAvlInsertNodeEx(&v94->Table.Root, (UINT64)Root, v93, (_RTL_BALANCED_NODE *)PrivatePfn);
                  ExReleaseSpinLockExclusiveFromDpcLevel(v91 + 13);
                  __writecr8(v92);
                  v23 = v110;
                }
LABEL_54:
                v14 = v113;
                v22 = v112;
                v21 = v109;
                v20 = v111;
              }
              else
              {
                MiDereferenceCombineBlock(a3, PrivatePfn);
                v14 = v113;
                v22 = v112;
                v21 = v109;
              }
            }
          }
          else
          {
            v73 = 0;
            MiGetUltraMapping((_MI_ZERO_THREAD_CONTEXT *)(*(_QWORD *)&StandbyOnly[1] + 208i64), 3i64);
            v75 = StandbyOnly[0];
            v76 = (unsigned __int64 *)((char *)&MmGetPteBase()->u.Long + ((v74 >> 9) & 0x7FFFFFFFF8i64));
            v20 = v111;
            if( *(_QWORD *)&InputPfn[1] == *(&stru_140C4DB30 + 236)
              || StandbyOnly[0] != 1
              || (LODWORD(v77) = MiGetCombineDomain(1i64, (INT64)v111), *(_QWORD *)&InputPfn[1] == v77)
              && (Process->MitigationFlags2 & 0x1000) == 0 )
            {
              if( v76 )
              {
                v78 = Pcs;
                v79 = PageMap;
                *((_QWORD *)PageMap + 9) = v76;
                *((_QWORD *)v79 + 8) = v38;
                if( !MiMapArbitraryPage(v78, v79, InputPfn[0], v75) )
                {
                  Long = ZeroPte.u.Long;
                  LOBYTE(v81) = MiPteInShadowRange((UINT64)v76);
                  if( v81
                    && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
                    && (ZeroPte.u.Long & 1) != 0 )
                  {
                    Long = ZeroPte.u.Long | 0x8000000000000000ui64;
                  }
                  *v76 = Long;
                  goto LABEL_57;
                }
                v82 = v110;
                if( (v41 & 0x18) != 0 )
                  v82 = 1;
                v110 = v82;
                v83 = -1i64;
                if( !PrivatePfn )
                {
                  if( !MiPerformCombineScan(
                          *(_MI_COMBINE_CONTROL_BLOCK **)&StandbyOnly[1],
                          PageMap,
                          (_MI_PAGE_CRCS *)(*(_QWORD *)&InputPfn[1] == *(&stru_140C4DB30 + 236)))
                    || (_QWORD)v142 != HashValue )
                  {
                    goto LABEL_145;
                  }
                  PrivatePfn = MiAllocateCombineProto(Pcs, HashValue, v41, (UINT64)&InputPfn[1]);
                  if( !PrivatePfn )
                  {
                    PrivatePfn = (_MI_COMBINE_BLOCK *)MiPopCombineBlock(a3);
                    if( PrivatePfn )
                    {
                      v117 = MiProtectionToCacheAttribute(v41);
                      v84 = *(_QWORD *)(v136 + 8i64 * v117);
                      if( v84 )
                      {
                        if( *(_DWORD *)(v84 + 44) < *(_DWORD *)(v84 + 40) )
                        {
                          PrivatePfn[10] = v41 | PrivatePfn[10] & 0xFFFFFFE0;
                          *((_QWORD *)PrivatePfn + 8) = *(_QWORD *)&InputPfn[1];
                          v83 = *(_QWORD *)(v84 + 8 * ((unsigned __int64)*(unsigned int *)(v84 + 44) >> 12) + 48);
                          goto LABEL_141;
                        }
                      }
                    }
LABEL_145:
                    v72 = 0;
LABEL_146:
                    MiReleaseArbitraryPage(PageMap);
                    v85 = ZeroPte.u.Long;
                    LOBYTE(v86) = MiPteInShadowRange((UINT64)v76);
                    if( v86
                      && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
                      && (ZeroPte.u.Long & 1) != 0 )
                    {
                      v85 = ZeroPte.u.Long | 0x8000000000000000ui64;
                    }
                    *v76 = v85;
                    if( !v73 )
                      goto LABEL_57;
                    v23 = v110;
                    goto LABEL_152;
                  }
                  v125[4] = (UINT64)PrivatePfn;
                }
LABEL_141:
                if( !MiConvertStandbyToProto(
                        v111,
                        Pcs,
                        PageMap,
                        (_MI_COMBINE_BLOCK *)(unsigned int)InputPfn[0],
                        (_MMPFN *)PrivatePfn,
                        (_MMPTE *)v38,
                        v132) )
                  goto LABEL_145;
                ++v129[1];
                if( v83 == -1 )
                {
                  PrivatePfn = 0i64;
                  v73 = 1;
                  ++v122;
                  v72 = 0;
                }
                else
                {
                  MiIncrementCombineMdl(*(__int64 *)&StandbyOnly[1], v117);
                  v72 = 1;
                  v73 = 1;
                }
                goto LABEL_146;
              }
            }
            MiDereferenceCombineBlock(a3, PrivatePfn);
            v23 = v110;
            v14 = v113;
            v22 = v112;
            v21 = v109;
          }
        }
        else
        {
          v20 = v111;
          MiUnlockPageTable((INT64)v111, (UINT64)v35);
          v22 = 0i64;
          v112 = 0i64;
          MiDereferenceCombineBlock(a3, PrivatePfn);
          v14 = v113;
          v21 = v109;
        }
      }
    }
    ++v118;
LABEL_167:
    v98 = v150;
    v131 = (UINT64)v150;
    for( i = 2; i <= 3; ++i )
    {
      v100 = *v98;
      if( *v98 )
      {
        do
        {
          v101 = *(_QWORD *)(v100 + 16);
          if( MiCrcStillIntact(Pcs, v111, (_MI_PAGE_CRCS *)(unsigned int)InputPfn[0], (_MI_COMBINE_DEFER_TYPE)v100) )
          {
            *(_QWORD *)(v100 + 16) = v14;
            v14 = (UINT64 *)v100;
          }
          else
          {
            v102 = *(_MI_COMBINE_BLOCK **)(v100 + 32);
            if( (unsigned __int64)v102 >= 0x100 )
              MiDereferenceCombineBlock(a3, v102);
          }
          v100 = v101;
        }
        while( v101 );
        v98 = (__int64 *)v131;
      }
      *v98 = 0i64;
      v98 += 5;
      v131 = (UINT64)v98;
    }
    v15 = TbFlushList;
    v19 = a5;
    MiFlushTbList(TbFlushList);
    v20 = v111;
    if( v112 )
      MiUnlockPageTable((INT64)v111, v112);
    MiUnlockWorkingSetShared(v111, v115);
    v103 = v148;
    if( v148 )
    {
      do
      {
        v104 = *(_QWORD *)(v103 + 8);
        v105 = MiLockPageInline((_MMPFN *)v104);
        *(_BYTE *)(v104 + 34) = *(_BYTE *)(v104 + 34) & 0xF8 | 6;
        MiDecrementShareCount((_MMPFN *)v104);
        _InterlockedAnd64((volatile signed __int64 *)(v104 + 24), 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(v105);
        v103 = *(_QWORD *)(v103 + 16);
      }
      while( v103 );
      v19 = a5;
      v20 = v111;
    }
    if( v14 )
    {
      v5 = a3;
      continue;
    }
    break;
  }
  KeLeaveCriticalRegionThread(&Thread->Tcb);
  v5 = a3;
LABEL_186:
  v18 = Process;
  v10 = v129;
  v8 = v122;
LABEL_187:
  if( v14 )
  {
    do
    {
      v106 = (_MI_COMBINE_BLOCK *)v14[4];
      v107 = (UINT64 *)v14[2];
      if( (unsigned __int64)v106 >= 0x100 )
        MiDereferenceCombineBlock(v5, v106);
      v14 = v107;
    }
    while( v107 );
  }
  if( v124 == 1 )
  {
    KeForceDetachProcess(&ApcState, 0);
    MiAttachThreadDone(&v18->Vm.Instance);
  }
  result = v147;
  if( v15 != (_MI_TB_FLUSH_LIST *)v147 )
    result = (char *)ExFreePoolWithTag(v15, 0);
  *v10 += v8;
  return result;
}

Referenced by:

MiProcessCrcList