MiWalkVaRange

NTSTATUS __stdcall MiWalkVaRange(
        VOID *StartingAddress,
        VOID *EndingAddress,
        _MMVAD *Vad,
        _MI_PTE_WALK_TYPE OperationType,
        UINT64 OperationArgument){
  _MMVAD *v5; 
  _MMPFN *v8; 
  _MMPTE *PteBase; 
  unsigned __int64 v10; 
  _MMPTE *v11; 
  UINT64 v12; 
  _MMSUPPORT_INSTANCE *p_Instance; 
  UINT8 v14; 
  UINT8 v15; 
  _MMPTE *NextPageTable; 
  unsigned __int64 v17; 
  _MMPTE *v18; 
  unsigned int v19; 
  _MMVAD *v20; 
  __int64 v21; 
  int v22; 
  int v23; 
  UINT64 v24; 
  NTSTATUS v25; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v26; 
  __int64 v27; 
  NTSTATUS v28; 
  int v30; 
  int v31; 
  unsigned __int64 v32; 
  __int64 v33; 
  int v34; 
  __int64 v35; 
  __int64 v36; 
  __int64 v37; 
  __int64 v38; 
  __int64 v39; 
  __int64 v40; 
  __int64 v41; 
  __int64 v42; 
  NTSTATUS v43; 
  UINT64 PageTableFlags; 
  _MMPTE *OriginalPte; 
  UINT8 PageIrql; 
  UINT8 v47; 
  int ProtoLeafValid; 
  _MMVAD *Vada; 
  __int64 v50; 
  UINT64 v51; 
  UINT64 v52; 
  INT64 p_Vm; 
  _MMPTE *PointerPte; 
  unsigned __int64 v55; 
  UINT64 LargePage; 
  _MMPTE PteContents; 
  _MMPTE v58; 
  _EPROCESS *Process; 
  _MI_TB_FLUSH_LIST TbFlushList; 
  __int16 v61; 
  __int16 v62; 
  __int64 v63; 
  __int64 v64; 
  __int64 v65; 
  char v66[152]; 

  Vada = Vad;
  v5 = Vad;
  PteContents.u.Long = 0i64;
  LODWORD(LargePage) = 0;
  v58.u.Long = 0i64;
  LODWORD(v51) = OperationType;
  v62 = 0;
  memset(v66, 0i64, sizeof(v66));
  ProtoLeafValid = 0;
  v8 = 0i64;
  v50 = 0i64;
  PageIrql = 17;
  PteBase = MmGetPteBase();
  v10 = (unsigned __int64)PteBase + (((unsigned __int64)StartingAddress >> 9) & 0x7FFFFFFFF8i64);
  v11 = (_MMPTE *)((char *)PteBase + (((unsigned __int64)EndingAddress >> 9) & 0x7FFFFFFFF8i64));
  v63 = 20i64;
  TbFlushList = 1;
  v12 = 0i64;
  v61 = 0;
  v64 = 0i64;
  v65 = 0i64;
  v55 = (unsigned __int64)v11;
  v52 = 0i64;
  Process = KeGetCurrentThread()->ApcState.Process;
  p_Instance = &Process->Vm.Instance;
  p_Vm = (INT64)&Process->Vm;
  MiLockWorkingSetShared();
  v47 = v14;
  v15 = v14;
  if( v10 > (unsigned __int64)v11 )
  {
    v28 = 0;
    goto LABEL_35;
  }
LABEL_2:
  if( v12 )
  {
    MiUnlockPageTableInternal((INT64)p_Instance, v12);
    v12 = 0i64;
    v52 = 0i64;
  }
  LODWORD(PageTableFlags) = 0;
  NextPageTable = MiGetNextPageTable(
                    (_MMPTE *)v10,
                    v11,
                    &TbFlushList,
                    v15,
                    PageTableFlags,
                    &LargePage,
                    (UINT64)OriginalPte);
  LODWORD(PointerPte) = 1;
  v17 = (unsigned __int64)NextPageTable;
  v18 = MmGetPteBase();
  if( NextPageTable == (_MMPTE *)v10 )
    goto LABEL_5;
  if( (v5->Core.u.LongFlags & 0x100000) == 0 )
  {
    if( v5->FirstPrototypePte )
    {
      MiGetProtoPteAddress();
      if( v35 )
      {
        LODWORD(PointerPte) = 0;
        goto LABEL_5;
      }
    }
  }
  v28 = -1073740748;
  ProtoLeafValid = -1073740748;
  if( v17 )
  {
    v10 = v17;
LABEL_5:
    if( v17 )
      v52 = (UINT64)v18 + ((v17 >> 9) & 0x7FFFFFFFF8i64);
    v19 = (unsigned int)PointerPte;
    v20 = Vada;
    while( 1 )
    {
      LODWORD(v21) = 0;
      v22 = 0;
      v23 = 0;
      if( !v19 )
        goto LABEL_61;
      v24 = *(_QWORD *)v10;
      MiPteInShadowRange(v10);
      if( !v24 )
        break;
      if( (v24 & 1) != 0 || (v24 & 0x400) == 0 )
      {
        v20 = Vada;
        goto LABEL_13;
      }
      v31 = v51;
      if( (_DWORD)v51 == 2 && MI_PROTO_FORMAT_COMBINED((_MMPTE)v24) )
      {
        v36 = v24;
        if( *(&stru_140C4DB30 + 42) && (v24 & 0x10) == 0 )
          v36 = v24 & ~*(&stru_140C4DB30 + 42);
        v21 = v36 >> 16;
LABEL_54:
        v20 = Vada;
        if( v21 )
        {
LABEL_55:
          if( ((v21 ^ v50) & 0xFFFFFFFFFFFFF000ui64) != 0 )
          {
            if( v8 )
            {
              MiUnlockProtoPoolPage((ULONG_PTR)v8, PageIrql);
              v50 = 0i64;
            }
            v8 = MiLockProtoPoolPage((_MMPTE *)v21, &PageIrql);
            if( !v8 )
            {
              MiFlushTbList(&TbFlushList);
              v12 = v52;
              p_Instance = (_MMSUPPORT_INSTANCE *)p_Vm;
              if( v52 )
              {
                MiUnlockPageTableInternal(p_Vm, v52);
                v12 = 0i64;
                v52 = 0i64;
              }
              v15 = v47;
              MiUnlockWorkingSetShared(p_Instance, v47);
              MmAccessFault(2ui64, (PVOID)v21, 0, 0i64);
              v11 = (_MMPTE *)v55;
LABEL_32:
              MiLockWorkingSetShared();
              v5 = Vada;
              if( v10 > (unsigned __int64)v11 )
              {
                v28 = ProtoLeafValid;
                goto LABEL_34;
              }
              goto LABEL_2;
            }
            v50 = v21;
          }
        }
        else
        {
LABEL_13:
          if( v8 )
          {
            MiUnlockProtoPoolPage((ULONG_PTR)v8, PageIrql);
            v8 = 0i64;
            v50 = 0i64;
          }
        }
        LODWORD(PageTableFlags) = v51;
        v25 = MiActOnPte(
                v20,
                (_MMPTE *)v19,
                (_MMPTE *)v10,
                (_MI_PTE_WALK_TYPE)v21,
                PageTableFlags,
                (_MI_PARTITION **)OperationArgument,
                &v58);
        if( v25 )
        {
          if( v25 == 274 )
          {
            v42 = (__int64)((v10 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
            MiInsertTbFlushEntry(&TbFlushList, (VOID *)v42, 1ui64, 0i64);
            MiFlushTbList(&TbFlushList);
            v43 = MiCopyOnWrite(v42, (INT64 *)v10, 0xFFFFFFFFFFFFFFFFui64, 0i64);
            v20 = Vada;
            v23 = v43;
            v10 -= 8i64;
            v22 = 1;
          }
          else if( v25 == -1073741791 )
          {
            MiInsertTbFlushEntry(
              &TbFlushList,
              (VOID *)((__int64)((v10 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
              1ui64,
              0i64);
          }
          else
          {
            ProtoLeafValid = v25;
          }
        }
        v26.Long = PteContents.u.Long;
        if( PteContents.u.Long )
        {
          if( v8 )
          {
            MiUnlockProtoPoolPage((ULONG_PTR)v8, PageIrql);
            v26.Long = PteContents.u.Long;
            v8 = 0i64;
            v50 = 0i64;
          }
          MiReleasePageFileInfo((_MI_PARTITION *)v58.u.Long, (_MMPTE)v26.Long, 1ui64);
        }
        goto LABEL_17;
      }
      if( MI_PROTO_FORMAT_COMBINED((_MMPTE)v24) )
      {
        if( v31 == 1 )
        {
          v20 = Vada;
          ProtoLeafValid = -1073740748;
        }
        else
        {
          if( v8 )
            MiUnlockProtoPoolPage((ULONG_PTR)v8, PageIrql);
          v37 = 0i64;
          if( !v8 )
            v37 = v50;
          v38 = v37;
          v50 = v37;
          MiFlushTbList(&TbFlushList);
          ProtoLeafValid = (unsigned int)MiMakeProtoLeafValid(v10, 0x18ui64, v47);
          if( ProtoLeafValid >= 0 )
          {
            v10 -= 8i64;
            v50 = v38;
            v20 = Vada;
            v8 = 0i64;
          }
          else
          {
            v20 = Vada;
            v8 = 0i64;
            ProtoLeafValid = -1073740748;
          }
        }
        goto LABEL_17;
      }
      v32 = ((__int64)((v10 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16) & 0xFFFFFFFFFFFFF000ui64;
      if( (v32 == 2147352576 || v32 == *(&stru_140C4DB30 + 11) && *(&stru_140C4DB30 + 11))
        && (Process->Flags3 & 1) == 0 )
      {
        v20 = Vada;
        ProtoLeafValid = -1073740748;
      }
      else
      {
        if( (Vada->Core.u.LongFlags & 0x100000) == 0 && Vada->FirstPrototypePte )
        {
          MiGetProtoPteAddress();
          v21 = v33;
          LOBYTE(v34) = MiIsPrototypePteVadLookup(v24);
          if( v34 )
            goto LABEL_54;
          v39 = v24;
          if( *(&stru_140C4DB30 + 42) && (v24 & 0x10) == 0 )
            v39 = v24 & ~*(&stru_140C4DB30 + 42);
          if( v21 == v39 >> 16 )
            goto LABEL_54;
        }
        v40 = v24;
        if( *(&stru_140C4DB30 + 42) && (v24 & 0x10) == 0 )
          v40 = v24 & ~*(&stru_140C4DB30 + 42);
        v21 = v40 >> 16;
        if( (_DWORD)v51 == 2 )
          goto LABEL_54;
        v20 = Vada;
        ProtoLeafValid = -1073740748;
      }
LABEL_17:
      v11 = (_MMPTE *)v55;
      v10 += 8i64;
      if( v22 == 1
        || v23 < 0
        || v10 > v55
        || (v10 & 0xFFF) == 0
        || (v10 & 0x78) == 0 && (LOBYTE(v30) = MiWorkingSetIsContended(p_Vm), v30)
        || (unsigned int)KeShouldYieldProcessor() )
      {
        if( v8 )
          MiUnlockProtoPoolPage((ULONG_PTR)v8, PageIrql);
        v27 = 0i64;
        if( !v8 )
          v27 = v50;
        v50 = v27;
        MiFlushTbList(&TbFlushList);
        p_Instance = (_MMSUPPORT_INSTANCE *)p_Vm;
        if( v52 )
        {
          MiUnlockPageTableInternal(p_Vm, v52);
          v52 = 0i64;
        }
        v15 = v47;
        MiUnlockWorkingSetShared(p_Instance, v47);
        if( v23 == -1073740748 )
          MiCopyOnWriteCheckConditions((INT64)p_Instance, 3221226548i64);
        v12 = v52;
        v8 = 0i64;
        goto LABEL_32;
      }
    }
    v20 = Vada;
LABEL_61:
    if( (v20->Core.u.LongFlags & 0x100000) != 0 || !v20->FirstPrototypePte )
      goto LABEL_13;
    MiGetProtoPteAddress();
    v21 = v41;
    if( v41 )
      goto LABEL_55;
    if( v19 )
      goto LABEL_13;
    v22 = 1;
    v10 -= 8i64;
    goto LABEL_17;
  }
  p_Instance = (_MMSUPPORT_INSTANCE *)p_Vm;
LABEL_34:
  v15 = v47;
LABEL_35:
  MiFlushTbList(&TbFlushList);
  if( v12 )
    MiUnlockPageTableInternal((INT64)p_Instance, v12);
  MiUnlockWorkingSetShared(p_Instance, v15);
  return v28;
}

Referenced by:

MiProcessVaRangesInfoClass
MiResetVirtualMemory