MiGetNextPageTable

_MMPTE *__stdcall MiGetNextPageTable(
        _MMPTE *PointerPte,
        _MMPTE *LastPte,
        _MI_TB_FLUSH_LIST *TbFlushList,
        UINT8 WsIrql,
        UINT64 PageTableFlags,
        UINT64 *LargePage,
        UINT64 a7){
  _MMPTE *PteBase; 
  unsigned __int64 v12; 
  __int64 v13; 
  __int16 v14; 
  unsigned __int64 v15; 
  VOID *v16; 
  char v17; 
  _MMSUPPORT_FULL *AnyMultiplexedVm; 
  NTSTATUS v19; 
  int v20; 
  _MMPTE *result; 
  __int128 v22; 
  INT64 v23[22]; 

  v22 = 0i64;
  memset(v23, 0i64, sizeof(v23));
  PteBase = MmGetPteBase();
  v12 = (__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)PteBase << 25)) >> 16;
  v13 = (__int64)(((_QWORD)LastPte << 25) - ((_QWORD)PteBase << 25)) >> 16;
  v14 = 2145;
  LOWORD(v23[0]) = 2145;
  if( (PageTableFlags & 1) != 0 )
  {
    v14 = 2273;
    LOWORD(v23[0]) = 2273;
  }
  if( (PageTableFlags & 2) != 0 )
    LOWORD(v23[0]) = v14 | 0x200;
  LODWORD(v15) = MiGetLeafVa(v12);
  if( v15 >= 0xFFFF800000000000ui64 && (v15 > *(&stru_140C4DB30 + 175) || v15 < *(&stru_140C4DB30 + 937)) )
    AnyMultiplexedVm = (_MMSUPPORT_FULL *)MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemViews, v16);
  else
    AnyMultiplexedVm = &KeGetCurrentThread()->ApcState.Process->Vm;
  if( (v17 & 4) == 0 )
  {
    v19 = MiFastLockLeafPageTable((INT64)AnyMultiplexedVm, v12);
    if( v19 )
    {
      v20 = v19 - 1;
      result = (_MMPTE *)((char *)PteBase + ((v12 >> 9) & 0x7FFFFFFFF8i64));
      *(_DWORD *)LargePage = v20;
      return result;
    }
    LOWORD(v23[0]) |= 4u;
  }
  v23[2] = (INT64)TbFlushList;
  v23[21] = (INT64)&v22;
  v23[3] = (INT64)AnyMultiplexedVm;
  BYTE6(v23[0]) = WsIrql;
  BYTE2(v23[0]) = BYTE2(v23[0]) & 0xE3 | 4;
  v23[20] = (INT64)MiGetNextPageTableTail;
  v23[4] = v12;
  v23[5] = v13;
  MiWalkPageTables((INT64)v23);
  *(_DWORD *)LargePage = v22;
  return(_MMPTE *)*((_QWORD *)&v22 + 1);
}

Referenced by:

MiCheckCommitReleaseFromVad
MiCloneCaptureVadCommit
MiComputePageCommitment
MiFlushDirtyBitsToPfn
MiGetNextNonGapPfnPage
MiIsCfgBitMapPageShared
MiMakeVaRangePhysicallyContiguous
MiQueryVaPhysicalContiguity
MiSplitPrivatePage
MiUpdateForkMaps
MiWalkVaRange
NtGetWriteWatch
NtLockVirtualMemory