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