MiDecommitPages

VOID __stdcall MiDecommitPages(
        VOID *StartingAddress,
        _MMPTE *EndingPte,
        ULONG_PTR Process,
        _MMVAD_SHORT *Vad,
        UINT64 VadLockHeld,
        _MI_DELETE_VA_INFO *DeleteInfo){
  _MI_DELETE_VA_INFO *v6; 
  int v8; 
  __int64 v10; 
  unsigned __int64 v11; 
  VOID *v12; 
  __int64 EndingVpnHigh; 
  __int64 v14; 
  INT64 v15; 
  _MMPTE *PteBase; 
  union {unsigned int LongFlags1;_MMVAD_FLAGS1 VadFlags1;} v17; 
  unsigned __int64 v18; 
  __int64 LongFlags1; 
  unsigned __int64 v20; 
  union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v21; 
  unsigned __int64 LongFlags; 
  unsigned int v23; 
  __int64 v24; 
  __int64 v25; 
  int v26; 
  UINT64 v27; 
  unsigned __int64 v28; 
  int v29; 
  INT64 p_Vm; 
  unsigned __int8 v31; 
  _MMSUPPORT_SHARED *p_Shared; 
  char v33; 
  int v34; 
  UINT64 v35; 
  _MMPTE *v36; 
  _EPROCESS *v37; 
  int v38; 
  __int64 v39; 
  int v40; 
  __int64 v41; 
  __int64 v42; 
  unsigned __int64 v43; 
  VOID *v44; 
  UINT64 v45; 
  _MMSUPPORT_FULL *AnyMultiplexedVm; 
  NTSTATUS v47; 
  unsigned int v48; 
  _MMPTE *v49; 
  unsigned __int64 v50; 
  __int64 v51; 
  __int64 v52; 
  __int64 v53; 
  __int64 v54; 
  _MMPTE *v55; 
  __int64 v56; 
  _MMPTE v57; 
  VOID *v58; 
  char *v59; 
  char *v60; 
  unsigned __int64 v61; 
  int v62; 
  __int64 v63; 
  int v64; 
  _MMSUPPORT_INSTANCE *p_Instance; 
  _MMSUPPORT_SHARED *v66; 
  struct _KPRCB *CurrentPrcb; 
  volatile int DpcRequestSummary; 
  int v69; 
  int v70; 
  int v71; 
  _MI_PAGE_DELETE_RESULT v72; 
  int v73; 
  VOID *v74; 
  _MMCLONE_DESCRIPTOR *CloneAddress; 
  ULONG_PTR v76; 
  ULONG_PTR v77; 
  unsigned __int64 v78; 
  int v79; 
  bool v80; 
  _MMPTE v81; 
  _MMPFN *v82; 
  _MMPFN *v83; 
  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;} v84; 
  unsigned int v85; 
  unsigned __int64 EntireField; 
  _MI_PARTITION *v87; 
  unsigned __int64 v88; 
  _MMPAGING_FILE *v89; 
  unsigned __int64 v90; 
  unsigned __int64 v91; 
  int v92; 
  __int16 v93; 
  int v94; 
  UINT64 v95; 
  _MI_PARTITION *v96; 
  int v97; 
  INT64 v98; 
  __int64 v99; 
  __int64 v100; 
  __int16 v101; 
  unsigned __int64 v102; 
  INT64 v103; 
  int v104; 
  _ETHREAD *NextThread; 
  int v106; 
  int v107; 
  _EPROCESS *v108; 
  UINT64 Flags; 
  int v110; 
  __int64 v111; 
  _EPROCESS *CurrentProcess; 
  _MMPTE *v113; 
  int v114; 
  unsigned int v115; 
  unsigned __int64 WsInfo; 
  unsigned __int64 WsInfoa; 
  UINT64 v118; 
  NTSTATUS v119; 
  UINT64 v120; 
  _MI_PARTITION *Partition; 
  __int64 CurrentIrql; 
  _MMPTE *v123; 
  int LogAccess; 
  int LogAccess_4; 
  INT64 v126; 
  __int64 bf_0; 
  INT64 v128; 
  unsigned __int64 v129; 
  VOID *INCR; 
  __int64 v131; 
  unsigned __int64 Long; 
  __int128 v133; 
  INT64 v134[2]; 
  UINT64 NumberOfEntries[2]; 
  _QWORD v136[22]; 
  _MI_TB_FLUSH_LIST v137; 
  __int16 v138; 
  __int16 v139; 
  __int64 v140; 
  __int64 v141; 
  __int64 v142; 
  __int128 v143; 
  __int128 v144; 
  __int128 v145; 
  __int128 v146; 
  __int128 v147; 
  __int128 v148; 
  __int128 v149; 
  __int128 v150; 
  __int128 v151; 
  __int64 v152; 
  _MI_TB_FLUSH_LIST TbFlushList[48]; 
  _MI_TB_FLUSH_LIST v154; 
  __int16 v155; 
  __int16 v156; 
  __int64 v157; 
  __int64 v158; 
  __int64 v159; 
  char v160[2040]; 

  v6 = DeleteInfo;
  CurrentProcess = *(_EPROCESS **)&Process;
  v123 = EndingPte;
  v8 = 0;
  bf_0 = 0i64;
  v156 = 0;
  v126 = (INT64)Vad;
  memset(v160, 0i64, sizeof(v160));
  v157 = 256i64;
  v155 = 0;
  v154 = 1;
  *(_OWORD *)NumberOfEntries = 0i64;
  LODWORD(NumberOfEntries[1]) = 2;
  *(_OWORD *)v134 = 0i64;
  v158 = 0i64;
  v159 = 0i64;
  v111 = 1i64;
  v119 = 0;
  v10 = MiSwizzleInvalidPte(512i64);
  EndingVpnHigh = Vad->EndingVpnHigh;
  v14 = v10;
  v131 = v10;
  v15 = v10;
  PteBase = MmGetPteBase();
  v17.LongFlags1 = (unsigned int)Vad->u1;
  v18 = (unsigned __int64)&PteBase[(Vad->EndingVpn | (unsigned __int64)(EndingVpnHigh << 32)) & 0xFFFFFFFFFi64];
  LongFlags1 = v17.LongFlags1;
  LODWORD(LongFlags1) = v17.LongFlags1 & 0x7FFFFFFF;
  v20 = LongFlags1 | ((unsigned __int64)Vad->CommitChargeHigh << 31);
  v129 = v18;
  if( v20 == 0x7FFFFFFFEi64 )
  {
    v14 = MiSwizzleInvalidPte(32i64 * ((Vad->u.LongFlags >> 7) & 0x1F));
    v131 = v14;
    v15 = v14;
  }
  else if( (v17.LongFlags1 & 0x80000000) == 0 )
  {
    v21.LongFlags = (unsigned int)Vad->u;
    if( (v21.LongFlags & 0x100000) == 0 || (v21.LongFlags & 0x1000000) != 0 || (v21.LongFlags & 0x2000000) == 0 )
      v15 = 0i64;
    v129 = 0i64;
    v119 = MiVadPureReserve(Vad);
  }
  LongFlags = Vad->u.LongFlags;
  v23 = Vad->u.LongFlags & 0x500000;
  INCR = v12;
  v115 = 3;
  if( v23 == 5242880 )
  {
    v24 = (LongFlags >> 18) & 3;
    v25 = 16i64;
    v111 = MiVadPageSizes[v24];
    if( v111 != 16 )
      v25 = (__int64)v12;
    v115 = MiVadPageIndices[v24];
    INCR = (VOID *)v25;
    v11 = 2i64;
  }
  v26 = v11;
  v118 = 0i64;
  if( (_DWORD)VadLockHeld )
    v26 = 0;
  v27 = 0i64;
  LogAccess = v26;
  v28 = (unsigned __int64)PteBase + (((unsigned __int64)StartingAddress >> 9) & 0x7FFFFFFFF8i64);
  v114 = (int)v12;
  WsInfo = (unsigned __int64)StartingAddress & 0xFFFFFFFFFFFFF000ui64;
  v29 = (int)v12;
  p_Vm = (INT64)&CurrentProcess->Vm;
  v110 = 0;
  v113 = (_MMPTE *)&CurrentProcess->Vm;
  Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * CurrentProcess->Vm.Instance.PartitionId);
  v31 = CurrentProcess->Vm.Instance.Flags._bf_0 & 7;
  if( v31 < 6u )
  {
    if( v31 == 2 )
      p_Shared = (_MMSUPPORT_SHARED *)((char *)&stru_140C4DB30 + 6544);
    else
      p_Shared = &CurrentProcess->Vm.Shared;
    v33 = ExAcquireSpinLockShared((INT64 *)&p_Shared->WorkingSetLock);
    if( p_Shared->GoodCitizenWaiting )
      _InterlockedExchange(&p_Shared->GoodCitizenWaiting, 0);
    v29 = v114;
    LODWORD(v12) = 1;
    p_Vm = (INT64)&CurrentProcess->Vm;
    LOBYTE(CurrentIrql) = v33;
  }
  else
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(v11);
  }
  if( v28 > (unsigned __int64)v123 )
    goto LABEL_204;
  while( 1 )
  {
    v34 = 0;
    v35 = v28;
    if( v29 == 1 )
    {
      v34 = (int)v12;
LABEL_26:
      v36 = MmGetPteBase();
      goto LABEL_27;
    }
    if( v115 > 1 )
      goto LABEL_26;
    v36 = MmGetPteBase();
    v39 = 2 - v115;
    do
    {
      v35 = (UINT64)v36 + ((v35 >> 9) & 0x7FFFFFFFF8i64);
      --v39;
    }
    while( v39 );
LABEL_27:
    if( (v35 & 0xFFF) == 0 || v34 )
      break;
LABEL_65:
    v57.u.Long = *(_QWORD *)v35;
    Long = v57.u.Long;
    if( !v57.u.Long )
    {
      if( v28 > v129 )
        *(_QWORD *)&v6[1].ReducedCommitClonePages += v111;
      if( v15 )
      {
        LODWORD(v58) = MiGetUsedPtesHandle((PSLIST_ENTRY)((__int64)((v35 << 25) - ((_QWORD)v36 << 25)) >> 16));
        v59 = (char *)INCR;
        MiIncreaseUsedPtesCount(v58, (VOID *)(unsigned int)INCR);
        v60 = v59;
        do
        {
          v61 = v15;
          LOBYTE(v62) = MiPteInShadowRange(v35);
          if( v62 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v15 & 1) != 0 )
            v61 = v15 | 0x8000000000000000ui64;
          *(_QWORD *)v35 = v61;
          v35 += 8i64;
          --v60;
        }
        while( v60 );
        v14 = v131;
      }
LABEL_76:
      v63 = v111;
LABEL_77:
      v64 = 1;
      goto LABEL_78;
    }
    if( (v57.u.Long & 1) != 0 )
    {
      if( v111 != 1 )
        goto LABEL_88;
      LogAccess_4 = 0;
      if( (HIBYTE(*(unsigned __int64 *)((char *)&v36->u.Long + ((WsInfo >> 9) & 0x7FFFFFFFF8i64))) & 0xF) == 8
        || !MiAppendWsleCluster((INT64)v134, (INT64)v113, (UINT64 *)v28) )
      {
        MiTerminateWsle(v113, (_MMSUPPORT_INSTANCE *)WsInfo, 0i64, (UINT64)&LogAccess_4);
        MiInsertTbFlushEntry(&v154, (VOID *)WsInfo, 1ui64, 0i64);
        Long = v57.u.Long & 0xFFFFFFFFFFFFFBFEui64 | 0x400;
        *(_QWORD *)v28 = Long;
      }
      if( HIDWORD(v157) != (_DWORD)v157 - 1 )
        goto LABEL_76;
      MiDeletePteWsleCluster((INT64)v134, CurrentProcess, (_MMPTE)v15, v6);
      if( v71 )
        v8 = 1;
      v110 = v8;
      MiDeletePteList(&v154, CurrentProcess, (_MMPTE)v15, v6);
      v64 = 1;
LABEL_134:
      v80 = v70 == 0;
      v63 = v111;
      if( !v80 )
      {
        v8 = 1;
        v110 = 1;
      }
      goto LABEL_78;
    }
    if( (v57.u.Long & 0x400) != 0 )
    {
      if( MI_PROTO_FORMAT_COMBINED(v57) )
      {
        v72 = MiDecrementCombinedPte(v113);
LABEL_102:
        if( v72 == PageStillReferenced )
        {
          ++*(_QWORD *)&v6->ReducedCommitClonePages;
        }
        else if( v72 == PageCommitNotCharged )
        {
          ++*(_QWORD *)&v6[1].ResidentPages;
        }
      }
      else
      {
        LOBYTE(v73) = MiIsPrototypePteVadLookup(v57.u.Long);
        if( !v73 )
        {
          CloneAddress = MiLocateCloneAddress(CurrentProcess, v74);
          if( CloneAddress )
          {
            v72 = MiDecrementCloneBlockReference((ULONG_PTR)CloneAddress, v76, v77);
            goto LABEL_102;
          }
        }
      }
      v78 = v15;
      LOBYTE(v79) = MiPteInShadowRange(v28);
      if( v79 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v15 & 1) != 0 )
        v78 = v15 | 0x8000000000000000ui64;
      *(_QWORD *)v28 = v78;
      v80 = v15 == 0;
LABEL_132:
      v64 = 1;
      if( !v80 )
        goto LABEL_173;
      LOBYTE(v70) = MiReducePteUseCount(v28, 1u);
      goto LABEL_134;
    }
    if( (v57.u.Long & 0x800) != 0 )
    {
      if( v111 != 1 )
      {
LABEL_88:
        LOBYTE(v70) = MiDecommitLargePte(v126, v35, v15, (INT64)v6, (INT64)&v154);
        v64 = 1;
        goto LABEL_134;
      }
      bf_0 = 0i64;
      v81.u.Long = 0i64;
      v82 = MiLockTransitionLeafPage(v28, 0i64);
      v83 = v82;
      if( !v82 )
        goto LABEL_200;
      v84.Long = 0i64;
      v85 = 1;
      if( !v82->u3.ReferenceCount )
      {
        v81.u.Long = v82->OriginalPte.u.Long;
        EntireField = v82->u4.EntireField;
        v84.Long = v81.u.Long;
        bf_0 = v81.u.Hard._bf_0;
        v87 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * ((EntireField >> 39) & 0x3FF));
        Partition = v87;
        if( (v81.u.Long & 2) != 0 && !MI_IS_PTE_IN_WS_SWAP_SET((_MMPTE *)v87) )
          v85 = 0;
      }
      if( MiDeleteTransitionPte((_MMPTE *)v28, v83, 0x11u, 0i64) == PageStillReferenced )
        ++*(_QWORD *)&DeleteInfo->ReducedCommitClonePages;
      if( v84.Long )
        MiReleasePageFileSpace(Partition, v81, v85);
      _InterlockedExchangeAdd64(
        (volatile signed __int64 *)&CurrentProcess->NumberOfPrivatePages,
        0xFFFFFFFFFFFFFFFFui64);
      v88 = v15;
      if( !v85 )
      {
        v89 = Partition->Vp.PagingFile[LOWORD(v84.Long) >> 12];
        if( *(&stru_140C4DB30 + 42) && (v84.Long & 0x10) == 0 )
          v84.Long &= ~*(&stru_140C4DB30 + 42);
        LODWORD(v90) = MiTransferSoftwarePte(v14, (INT64)v89, HIDWORD(v84.Proto._bf_0));
        v88 = v90;
      }
      v91 = v88;
      LOBYTE(v92) = MiPteInShadowRange(v28);
      if( v92 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v88 & 1) != 0 )
        v91 = v88 | 0x8000000000000000ui64;
      *(_QWORD *)v28 = v91;
      v80 = v88 == 0;
      goto LABEL_132;
    }
    if( ((v57.u.Long >> 5) & 0x1F) == 16 )
    {
      v63 = v111;
      *(_QWORD *)&v6[1].ReducedCommitClonePages += v111;
      goto LABEL_77;
    }
    v93 = v57.u.Long;
    if( *(&stru_140C4DB30 + 42) && (v57.u.Long & 0x10) == 0 )
      v93 = LOWORD(v57.u.Long) & ~*(&stru_140C4DB30 + 168);
    if( (v93 & 0x400) != 0 || (v93 & 0x800) != 0 || (v93 & 4) != 0 )
      _InterlockedExchangeAdd64(
        (volatile signed __int64 *)&CurrentProcess->NumberOfPrivatePages,
        0xFFFFFFFFFFFFFFFFui64);
    v94 = 1;
    v95 = v15;
    v96 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * CurrentProcess->Vm.Instance.PartitionId);
    Partition = v96;
    if( ((v57.u.Long >> 1) & 1) != 0 && !MI_IS_PTE_IN_WS_SWAP_SET((_MMPTE *)v96) )
    {
      v94 = v97;
      v120 = v14;
      MiSetNonResidentPteHeat(&v120, 0i64);
      v95 = v120;
      if( (v14 & 0x400) == 0 )
      {
        v95 = v120 & 0xFFFFFFFFFFFFFFF9ui64;
        v120 &= 0xFFFFFFFFFFFFFFF9ui64;
      }
      if( v99 )
      {
        if( v95 )
          LODWORD(v100) = MiUpdatePageFileHighInPte(v95, v98);
        else
          v100 = MiSwizzleInvalidPte(v98 << 32);
        v95 = v100 ^ (unsigned __int16)(v100 ^ (v101 << 12)) & 0xF000 | 2;
        v120 = v95;
      }
    }
    v102 = v95;
    if( v28 >= (unsigned __int64)MmGetPml4eBase()
      && v28 <= (unsigned __int64)MmGetPxeUserLimit()
      && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
      && (v95 & 1) != 0 )
    {
      v102 = v95 | 0x8000000000000000ui64;
    }
    *(_QWORD *)v28 = v102;
    v128 = v57.u.Hard._bf_0;
    if( (v57.u.Long & 4) != 0 )
    {
      LODWORD(v103) = MI_READ_PTE_LOCK_FREE((INT64)&v128);
      if( !v94 )
        v103 &= ~2ui64;
    }
    else if( v94 && ((v57.u.Long >> 1) & 1) != 0 )
    {
      LODWORD(v103) = MI_READ_PTE_LOCK_FREE((INT64)&v128);
    }
    else
    {
      v103 = 0i64;
    }
    v128 = v103;
    if( v103 )
      MiReleasePageFileInfo(Partition, (_MMPTE)v103, 0i64);
    v64 = 1;
    if( v95 )
    {
      v8 = v110;
LABEL_173:
      v63 = v111;
      goto LABEL_78;
    }
    LOBYTE(v104) = MiReducePteUseCount(v28, 1u);
    v8 = v110;
    v80 = v104 == 0;
    v63 = v111;
    if( !v80 )
      v8 = 1;
    v110 = v8;
LABEL_78:
    v28 += 8 * v63;
    if( (v28 & 0x78) == 0 )
    {
      p_Instance = &CurrentProcess->Vm.Instance;
      v66 = (_MMSUPPORT_SHARED *)((char *)&stru_140C4DB30 + 6544);
      if( (CurrentProcess->Vm.Instance.Flags._bf_0 & 7) != 2 )
        v66 = &CurrentProcess->Vm.Shared;
      if( (v66->WorkingSetLock & 0x40000000) != 0 )
        goto LABEL_190;
    }
    CurrentPrcb = KeGetCurrentPrcb();
    DpcRequestSummary = CurrentPrcb->DpcRequestSummary;
    if( (DpcRequestSummary & 1) == 0 )
    {
      v69 = 0;
      if( (DpcRequestSummary & 0x1E) != 0 )
      {
        v64 = 2;
        goto LABEL_188;
      }
      if( CurrentPrcb->QuantumEnd )
      {
        v64 = 3;
        goto LABEL_188;
      }
      NextThread = CurrentPrcb->NextThread;
      if( NextThread && NextThread != CurrentPrcb->CurrentThread )
      {
        v64 = 4;
        goto LABEL_188;
      }
LABEL_181:
      if( CurrentPrcb->DpcWatchdogCount <= 7u )
        goto LABEL_199;
      if( v69 )
      {
LABEL_183:
        if( (DpcRequestSummary & 0x1E) != 0 )
        {
          v64 = 5;
          goto LABEL_188;
        }
        if( CurrentPrcb->CurrentThread != CurrentPrcb->IdleThread )
        {
          v64 = 6;
          goto LABEL_188;
        }
      }
      _disable();
      v64 = 0;
      CurrentPrcb->DpcWatchdogCount = 0;
      CurrentPrcb->DpcTimeCount = 0;
      KiResetGlobalDpcWatchdogProfiler((INT64)CurrentPrcb);
      _enable();
      goto LABEL_188;
    }
    v69 = 1;
    if( CurrentPrcb->DpcTimeCount <= 7 )
      goto LABEL_181;
    if( !CurrentPrcb->QuantumEnd )
      goto LABEL_183;
LABEL_188:
    if( v64 )
    {
      p_Instance = &CurrentProcess->Vm.Instance;
LABEL_190:
      MiDeletePteWsleCluster((INT64)v134, CurrentProcess, (_MMPTE)v15, DeleteInfo);
      if( v106 )
        v8 = 1;
      v110 = v8;
      if( HIDWORD(v157) )
      {
        MiDeletePteList(&v154, CurrentProcess, (_MMPTE)v15, DeleteInfo);
        if( v107 )
          v8 = 1;
        v110 = v8;
      }
      if( v118 )
      {
        MiUnlockPageTableInternal((INT64)p_Instance, v118);
        v118 = 0i64;
      }
      MiUnlockWorkingSetShared(p_Instance, (unsigned __int8)CurrentIrql);
      v114 = 1;
      MiLockWorkingSetShared();
    }
LABEL_199:
    WsInfo += v111 << 12;
LABEL_200:
    v6 = DeleteInfo;
    if( v28 > (unsigned __int64)v123 )
      goto LABEL_203;
    v29 = v114;
    LODWORD(v12) = 1;
    p_Vm = (INT64)&CurrentProcess->Vm;
  }
  memset(TbFlushList, 0i64, 0xB8u);
  if( v134[1] )
  {
    TbFlushList[0] = 1;
    *(_QWORD *)&TbFlushList[4] = 0i64;
    *(_QWORD *)&TbFlushList[6] = 0i64;
    LOWORD(TbFlushList[1]) = 0;
    TbFlushList[2] = 20;
    MiInsertTbFlushEntry(
      TbFlushList,
      (VOID *)(((v134[1] << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
      NumberOfEntries[0],
      0i64);
    MiTerminateWsleCluster((INT64)v134);
    v37 = CurrentProcess;
    MiDeletePteList(TbFlushList, CurrentProcess, (_MMPTE)v15, v6);
    if( v38 )
      v8 = 1;
    v110 = v8;
  }
  else
  {
    v37 = CurrentProcess;
  }
  if( HIDWORD(v157) )
  {
    MiDeletePteList(&v154, v37, (_MMPTE)v15, v6);
    if( v40 )
      v8 = 1;
    v110 = v8;
  }
  if( v118 )
  {
    MiUnlockPageTableInternal(p_Vm, v118);
    v118 = 0i64;
  }
  if( !v119 )
  {
    v35 = v28;
    if( v115 <= 1 )
    {
      v55 = MmGetPteBase();
      v56 = 2 - v115;
      do
      {
        v35 = (UINT64)v55 + ((v35 >> 9) & 0x7FFFFFFFF8i64);
        --v56;
      }
      while( v56 );
      v6 = DeleteInfo;
    }
    LODWORD(Flags) = LogAccess;
    MiMakeSystemAddressValid((VOID *)v35, 0i64, (*(_DWORD *)(v126 + 48) >> 12) & 0x3F, CurrentIrql, Flags);
    goto LABEL_64;
  }
  v133 = 0i64;
  memset((char *)v136 + 2, 0i64, 0xAEu);
  v41 = (_QWORD)MmGetPteBase() << 25;
  WsInfoa = (__int64)((v28 << 25) - v41) >> 16;
  v42 = (((_QWORD)v123 << 25) - v41) >> 16;
  LOWORD(v136[0]) = 2145;
  LODWORD(v43) = MiGetLeafVa(WsInfoa);
  if( v43 < 0xFFFF800000000000ui64 || v43 >= *(&stru_140C4DB30 + 937) && v43 <= *(&stru_140C4DB30 + 175) )
    AnyMultiplexedVm = &KeGetCurrentThread()->ApcState.Process->Vm;
  else
    AnyMultiplexedVm = (_MMSUPPORT_FULL *)MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemViews, v44);
  v47 = MiFastLockLeafPageTable((INT64)AnyMultiplexedVm, v45);
  if( v47 )
  {
    v48 = v47 - 1;
    LODWORD(v133) = v47 - 1;
    v49 = MmGetPteBase();
    v50 = (unsigned __int64)v49 + ((WsInfoa >> 9) & 0x7FFFFFFFF8i64);
    *((_QWORD *)&v133 + 1) = v50;
  }
  else
  {
    LOWORD(v136[0]) |= 4u;
    v136[21] = &v133;
    v136[2] = 0i64;
    v136[3] = AnyMultiplexedVm;
    BYTE2(v136[0]) = BYTE2(v136[0]) & 0xE3 | 4;
    v136[20] = MiGetNextPageTableTail;
    BYTE6(v136[0]) = CurrentIrql;
    v136[4] = (__int64)((v28 << 25) - v41) >> 16;
    v136[5] = v42;
    MiWalkPageTables((INT64)v136);
    v48 = v133;
    v50 = *((_QWORD *)&v133 + 1);
    v49 = MmGetPteBase();
  }
  v51 = *(_QWORD *)&DeleteInfo[1].ReducedCommitClonePages;
  if( v50 )
  {
    v52 = v50 - v28;
    v28 = v50;
    *(_QWORD *)&DeleteInfo[1].ReducedCommitClonePages = v51 + (v52 >> 3);
    v35 = v50;
    if( v48 )
    {
      v35 = (UINT64)v49 + ((v50 >> 9) & 0x7FFFFFFFF8i64);
      if( v48 > 1 )
      {
        v53 = v48 - 1;
        do
        {
          v35 = (UINT64)v49 + ((v35 >> 9) & 0x7FFFFFFFF8i64);
          --v53;
        }
        while( v53 );
      }
    }
    v54 = (v50 << 25) - v41;
    v6 = DeleteInfo;
    WsInfo = v54 >> 16;
LABEL_64:
    v36 = MmGetPteBase();
    v118 = (UINT64)v36 + ((v35 >> 9) & 0x7FFFFFFFF8i64);
    v114 = 0;
    goto LABEL_65;
  }
  v6 = DeleteInfo;
  *(_QWORD *)&DeleteInfo[1].ReducedCommitClonePages = v51 + ((__int64)((__int64)v123 - v28) >> 3) + 1;
LABEL_203:
  v27 = v118;
LABEL_204:
  v139 = 0;
  v152 = 0i64;
  v143 = 0i64;
  v144 = 0i64;
  v145 = 0i64;
  v146 = 0i64;
  v147 = 0i64;
  v148 = 0i64;
  v149 = 0i64;
  v150 = 0i64;
  v151 = 0i64;
  if( v134[1] )
  {
    v138 = 0;
    v141 = 0i64;
    v142 = 0i64;
    v140 = 20i64;
    v137 = 1;
    MiInsertTbFlushEntry(
      &v137,
      (VOID *)(((v134[1] << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
      NumberOfEntries[0],
      0i64);
    MiTerminateWsleCluster((INT64)v134);
    v108 = CurrentProcess;
    MiDeletePteList(&v137, CurrentProcess, (_MMPTE)v15, v6);
  }
  else
  {
    v108 = CurrentProcess;
  }
  if( HIDWORD(v157) )
    MiDeletePteList(&v154, v108, (_MMPTE)v15, v6);
  if( v27 )
    MiUnlockPageTableInternal((INT64)v113, v27);
  MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)v113, (unsigned __int8)CurrentIrql);
}

Referenced by:

MiDecommitRegion
MmStoreAllocateVirtualMemory
MmStoreDecommitVirtualMemory