MmReadProcessPageTables
NTSTATUS __stdcall MmReadProcessPageTables(_KPRCB *TargetPrcb){
__int64 v1;
struct _KPRCB *CurrentPrcb;
__int64 v3;
NTSTATUS result;
unsigned int v5;
unsigned __int64 v6;
volatile __int64 *v7;
__int64 v8;
PHYSICAL_MEMORY_DESCRIPTOR *v9;
_MMPFN *PfnDb;
_MMPTE *PteLimit;
unsigned __int64 BasePage;
_MMPFN *v13;
_MMPFN *v14;
unsigned __int64 v15;
unsigned __int64 PteBase;
unsigned __int64 v17;
unsigned __int64 EntireField;
unsigned __int64 v19;
__int64 v20;
__int64 v21;
__int64 v22;
LODWORD(v1) = MiMakeValidPte(0i64, 0i64, 2684354564i64);
CurrentPrcb = KeGetCurrentPrcb();
v3 = v1;
__wbinvd();
result = ExTryAcquireSpinLockSharedAtDpcLevel((INT64 *)&stru_140C50B28 + 12);
v5 = 0;
if( result )
{
v6 = (unsigned __int64)CurrentPrcb->HyperPte & 0xFFFFFFFFFFFFF000ui64;
v7 = (volatile __int64 *)((char *)MmGetPteBase() + ((v6 >> 9) & 0x7FFFFFFFF8i64));
v8 = _InterlockedExchange64(v7, ZeroPte.u.Hard._bf_0);
KeFlushSingleCurrentTb((VOID *)v6);
v9 = MmPhysicalMemoryBlock;
if( MmPhysicalMemoryBlock->NumberOfRuns )
{
PfnDb = MmGetPfnDb();
PteLimit = MmGetPteLimit();
do
{
BasePage = v9->Run[v5].BasePage;
v13 = &PfnDb[BasePage];
v14 = &PfnDb[BasePage + v9->Run[v5].PageCount];
if( v13 < v14 )
{
do
{
if( (*(_BYTE *)(&v13->u3 + 1) & 7) == 6 )
{
v15 = v13->PteLong | 0x8000000000000000ui64;
PteBase = (unsigned __int64)MmGetPteBase();
if( v15 >= PteBase && v15 <= (unsigned __int64)PteLimit )
{
v17 = (__int64)((v15 << 25) - (PteBase << 25)) >> 16;
if( v17 >= PteBase && v17 <= (unsigned __int64)PteLimit )
{
EntireField = v13->u4.EntireField;
if( ((EntireField >> 60) & 7) != 1
&& (EntireField & 0x1000000000i64) == 0
&& (EntireField & 0xFFFFFFFFFi64) != 0xFFFFFFFFDi64
&& (*(_BYTE *)(&v13->u3 + 1) & 0xC0) == 64 )
{
v3 ^= (v3 ^ ((v13 - MmGetPfnDb()) << 12)) & 0xFFFFFFFFF000i64;
_InterlockedExchange64(v7, v3);
KeFlushSingleCurrentTb((VOID *)v6);
v19 = v6;
v20 = 64i64;
do
{
v19 += 64i64;
--v20;
}
while( v20 );
v21 = KiCacheErrataMonitor;
v22 = CurrentPrcb->Number + 16i64;
CurrentPrcb->ClockKeepAlive = 1;
_InterlockedExchange64((volatile __int64 *)(v21 + 16 * v22), -1i64);
if( (*(_QWORD *)(v21 + 16 * (TargetPrcb->Number + 16i64)) & CurrentPrcb->GroupSetMember) != 0 )
goto LABEL_21;
PteLimit = MmGetPteLimit();
}
}
}
}
++v13;
}
while( v13 < v14 );
PfnDb = MmGetPfnDb();
}
v9 = MmPhysicalMemoryBlock;
++v5;
}
while( v5 < MmPhysicalMemoryBlock->NumberOfRuns );
}
LABEL_21:
_InterlockedExchange64(v7, v8);
KeFlushSingleCurrentTb((VOID *)v6);
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)&stru_140C50B28 + 24);
return 1;
}
return result;
}Referenced by:
KiMonitorCacheErrata