MmReadProcessPageTables

INT64 __fastcall MmReadProcessPageTables(
        VOID *DllHandle,
        const UINT64 *ResourceIdPath,
        UINT64 ResourceIdPathLength,
        _IMAGE_RESOURCE_DATA_ENTRY **ResourceDataEntry){
  UINT64 ValidPte; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v6; 
  INT64 result; 
  unsigned int v8; 
  unsigned __int64 v9; 
  volatile __int64 *v10; 
  __int64 v11; 
  UINT8 *v12; 
  _MMPFN *PfnDb; 
  _MMPTE *PteLimit; 
  __int64 v15; 
  char *v16; 
  char *v17; 
  unsigned __int64 v18; 
  unsigned __int64 PteBase; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  __int64 v25; 
  ValidPte = MiMakeValidPte(0i64, 0i64, 2684354564i64);
  CurrentPrcb = KeGetCurrentPrcb();
  v6 = ValidPte;
  __wbinvd();
  LODWORD(result) = ExTryAcquireSpinLockSharedAtDpcLevel((INT64 *)&dword_140C50B88);
  v8 = 0;
  if( (_DWORD)result )
  {
    v9 = *((_QWORD *)CurrentPrcb + 4160) & 0xFFFFFFFFFFFFF000ui64;
    v10 = (volatile __int64 *)((char *)MmGetPteBase() + ((v9 >> 9) & 0x7FFFFFFFF8i64));
    v11 = _InterlockedExchange64(v10, ZeroPte);
    KeFlushSingleCurrentTb((PVOID)v9);
    v12 = MmPhysicalMemoryBlock;
    if( *(_DWORD *)MmPhysicalMemoryBlock )
    {
      PfnDb = MmGetPfnDb();
      PteLimit = MmGetPteLimit();
      do
      {
        v15 = *(_QWORD *)&v12[16 * v8 + 16];
        v16 = (char *)PfnDb + 48 * v15;
        v17 = (char *)PfnDb + 48 * v15 + 48 * *(_QWORD *)&v12[16 * v8 + 24];
        if( v16 < v17 )
        {
          do
          {
            if( (v16[34] & 7) == 6 )
            {
              v18 = *((_QWORD *)v16 + 1) | 0x8000000000000000ui64;
              PteBase = (unsigned __int64)MmGetPteBase();
              if( v18 >= PteBase && v18 <= (unsigned __int64)PteLimit )
              {
                v20 = (__int64)((v18 << 25) - (PteBase << 25)) >> 16;
                if( v20 >= PteBase && v20 <= (unsigned __int64)PteLimit )
                {
                  v21 = *((_QWORD *)v16 + 5);
                  if( ((v21 >> 60) & 7) != 1
                    && (v21 & 0x1000000000i64) == 0
                    && (v21 & 0xFFFFFFFFFi64) != 0xFFFFFFFFDi64
                    && (v16[34] & 0xC0) == 64 )
                  {
                    v6 ^= (v6 ^ (((v16 - (char *)MmGetPfnDb()) / 48) << 12)) & 0xFFFFFFFFF000i64;
                    _InterlockedExchange64(v10, v6);
                    KeFlushSingleCurrentTb((PVOID)v9);
                    v22 = v9;
                    v23 = 64i64;
                    do
                    {
                      v22 += 64i64;
                      --v23;
                    }
                    while( v23 );
                    v24 = KiCacheErrataMonitor;
                    v25 = *((unsigned int *)CurrentPrcb + 9) + 16i64;
                    *((_DWORD *)CurrentPrcb + 7928) = 1;
                    _InterlockedExchange64((volatile __int64 *)(v24 + 16 * v25), -1i64);
                    if( (*(_QWORD *)(v24 + 16 * (*((unsigned int *)DllHandle + 9) + 16i64)) & *((_QWORD *)CurrentPrcb
                                                                                               + 25)) != 0i64 )
                      goto LABEL_21;
                    PteLimit = MmGetPteLimit();
                  }
                }
              }
            }
            v16 += 48;
          }
          while( v16 < v17 );
          PfnDb = MmGetPfnDb();
        }
        v12 = MmPhysicalMemoryBlock;
        ++v8;
      }
      while( v8 < *(_DWORD *)MmPhysicalMemoryBlock );
    }
LABEL_21:
    _InterlockedExchange64(v10, v11);
    KeFlushSingleCurrentTb((PVOID)v9);
    ExReleaseSpinLockSharedFromDpcLevel(&dword_140C50B88);
    return 1i64;
  }
  return result;
}

Referenced by:

KiMonitorCacheErrata