MiWalkPageTables

NTSTATUS __stdcall MiWalkPageTables(INT64 a1){
  __int64 v1; 
  unsigned __int64 PteBase; 
  unsigned __int64 v3; 
  _MMPTE *PxeSelfRef; 
  int v5; 
  _MMPTE *PteLimit; 
  unsigned int v7; 
  unsigned int v8; 
  _MMPTE *v9; 
  __int64 v10; 
  unsigned int v11; 
  __int64 *v12; 
  unsigned int v13; 
  unsigned int v14; 
  _LIST_ENTRY *v15; 
  _LIST_ENTRY *v16; 
  unsigned __int64 v17; 
  _LIST_ENTRY *v18; 
  _LIST_ENTRY *v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  unsigned __int64 v26; 
  UINT64 v27; 
  __int16 v28; 
  INT64 v29; 
  _MMPTE *v30; 
  INT64 v31; 
  __int64 i; 
  INT64 *v33; 
  INT64 v34; 
  int v35; 
  INT64 v37; 
  __int64 *v38; 
  _MMPTE *v39; 
  _LIST_ENTRY *v40; 
  __int64 v41; 
  unsigned __int64 v42; 
  __int64 v43; 
  __int64 v44; 
  unsigned __int64 v45; 
  UINT64 v46; 
  unsigned __int64 v47; 
  unsigned __int64 v48; 
  __int64 v49; 
  _LIST_ENTRY *v50[6]; 
  int v52; 
  unsigned int v53; 
  unsigned int v54; 

  v1 = a1;
  if( !*(_BYTE *)(a1 + 5) )
    *(_BYTE *)(a1 + 5) = 15;
  PteBase = (unsigned __int64)MmGetPteBase();
  v3 = *(_QWORD *)(a1 + 56);
  *(_QWORD *)(a1 + 72) = *(_QWORD *)(*(&stru_140C4DB30 + 267)
                                   + 8i64 * *(unsigned __int16 *)(*(_QWORD *)(a1 + 24) + 174i64));
  PxeSelfRef = MmGetPxeSelfRef();
  if( v3 )
  {
    if( (_MMPTE *)v3 == PxeSelfRef )
    {
      v3 += 8i64;
      *(_QWORD *)(v1 + 56) = v3;
    }
    v5 = -1;
    if( v3 < PteBase || (PteLimit = MmGetPteLimit(), v3 > (unsigned __int64)PteLimit) )
    {
      v3 = 0i64;
      *(_QWORD *)(v1 + 56) = 0i64;
    }
    else
    {
      do
      {
        ++v5;
        v3 = (__int64)((v3 << 25) - (PteBase << 25)) >> 16;
      }
      while( v3 >= PteBase && v3 <= (unsigned __int64)PteLimit );
    }
    v42 = v3;
    v7 = 1;
    v43 = -1i64;
    if( v5 != -1 )
    {
      v44 = 0i64;
      v45 = v3 - 1;
      v7 = 2;
    }
  }
  else
  {
    v7 = 1;
    v42 = *(_QWORD *)(v1 + 32);
    v43 = *(_QWORD *)(v1 + 40);
  }
  v8 = MiInitializeWalkBounds(v1, v50);
  v11 = v10;
  v53 = v8;
  v12 = (__int64 *)&v42;
  v54 = v10;
  v13 = v8;
  v38 = (__int64 *)&v42;
  do
  {
    v52 = v10;
    v14 = v10;
    if( !v13 )
      goto LABEL_39;
    v15 = (_LIST_ENTRY *)*v12;
    v16 = (_LIST_ENTRY *)v12[1];
    v41 = *v12;
    v40 = v16;
    do
    {
      v17 = (unsigned __int64)v15;
      v18 = v50[2 * v14 + 1];
      if( v15 > v18 )
        goto LABEL_37;
      v19 = v50[2 * v14];
      if( v16 < v19 )
        goto LABEL_37;
      if( v15 < v19 )
        v17 = (unsigned __int64)v50[2 * v14];
      v20 = (unsigned __int64)v16;
      if( v16 > v18 )
        v20 = (unsigned __int64)v50[2 * v14 + 1];
      v21 = (unsigned __int64)v9 + ((v17 >> 9) & 0x7FFFFFFFF8i64);
      *(_QWORD *)(v1 + 80) = v21;
      v22 = (unsigned __int64)v9 + ((v20 >> 9) & 0x7FFFFFFFF8i64);
      *(_QWORD *)(v1 + 88) = v22;
      v23 = (unsigned __int64)v9 + ((v21 >> 9) & 0x7FFFFFFFF8i64);
      *(_QWORD *)(v1 + 96) = v23;
      v24 = (unsigned __int64)v9 + ((v22 >> 9) & 0x7FFFFFFFF8i64);
      *(_QWORD *)(v1 + 104) = v24;
      v25 = (unsigned __int64)v9 + ((v23 >> 9) & 0x7FFFFFFFF8i64);
      *(_QWORD *)(v1 + 112) = v25;
      v26 = (unsigned __int64)v9 + ((v24 >> 9) & 0x7FFFFFFFF8i64);
      *(_QWORD *)(v1 + 120) = v26;
      v27 = (UINT64)v9 + ((v25 >> 9) & 0x7FFFFFFFF8i64);
      *(_QWORD *)(v1 + 128) = v27;
      *(_QWORD *)(v1 + 136) = (char *)v9 + ((v26 >> 9) & 0x7FFFFFFFF8i64);
      v28 = *(_WORD *)v1;
      *(_QWORD *)(v1 + 64) = v10;
      if( (v28 & 4) != 0 )
      {
        v29 = *(_QWORD *)(v1 + 24);
        *(_BYTE *)(v1 + 2) |= 1u;
        v39 = (_MMPTE *)((char *)v9 + ((v27 >> 9) & 0x7FFFFFFFF8i64));
        v37 = v29;
        v46 = (UINT64)v9
            + (((unsigned __int64)((__int64)(((_QWORD)v39 << 25) - ((_QWORD)v9 << 25)) >> 16) >> 9) & 0x7FFFFFFFF8i64);
        v47 = (unsigned __int64)v9 + ((v46 >> 9) & 0x7FFFFFFFF8i64);
        v48 = (unsigned __int64)v9 + ((v47 >> 9) & 0x7FFFFFFFF8i64);
        v49 = (__int64)v9 + ((v48 >> 9) & 0x7FFFFFFFF8i64);
        v30 = MmGetPxeSelfRef();
        MiLockPageTableInternal(v29, (UINT64)v30, 0i64);
        for( i = 2i64; ; --i )
        {
          v33 = (INT64 *)*(&v46 + i);
          v34 = *v33;
          if( (*v33 & 0x81) != 1 )
            break;
          if( (v34 & 0x20) == 0 )
            MiPerformSafePdeWrite(v31, (INT64 *)*(&v46 + i), v34, 1);
          if( v33 != (INT64 *)v30 )
          {
            MiLockPageTableInternal(v37, (UINT64)v33, 0i64);
            MiUnlockPageTableInternal(v37, (UINT64)v30);
            v30 = (_MMPTE *)v33;
          }
          if( !i )
            break;
        }
        v1 = a1;
        v12 = v38;
        if( v30 != v39 )
        {
          MiUnlockPageTableInternal(v37, (UINT64)v30);
          v14 = v52;
          v13 = v53;
          goto LABEL_32;
        }
        v14 = v52;
        v13 = v53;
        *(_QWORD *)(a1 + 48) = v39;
      }
      else
      {
        *(_QWORD *)(v1 + 48) = v10;
        if( (v28 & 0x400) != 0 )
          ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)((char *)&stru_140C4DB30 + 1324));
      }
      *(_BYTE *)(v1 + 2) &= ~1u;
LABEL_32:
      v35 = MiWalkPageTablesRecursively(v1, v27, 3i64);
      if( (*(_WORD *)v1 & 0x400) != 0 )
        ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)((char *)&stru_140C4DB30 + 1324));
      if( v35 >= 3 )
        return v35;
      v16 = v40;
      v10 = 0i64;
      v9 = MmGetPteBase();
LABEL_37:
      v15 = (_LIST_ENTRY *)v41;
      v52 = ++v14;
    }
    while( v14 < v13 );
    v11 = v54;
LABEL_39:
    ++v11;
    v12 += 2;
    v54 = v11;
    v38 = v12;
  }
  while( v11 < v7 );
  return 3;
}

Referenced by:

MiAddLoaderHalIoMappings
MiAgeWorkingSet
MiCaptureAndResetWorkingSetAccessBits
MiClearNonPagedPtes
MiCombineWorkingSet
MiConvertHiberPhasePages
MiCountSharedPages
MiCreateInitialSystemWsles
MiDecommitPages
MiDeleteEmptyPageTables
MiDeletePagablePteRange
MiDeleteSystemPageTables
MiEmptyWorkingSetInitiate
MiGetNextPageTable
MiGetWorkingSetInfoEx
MiMakeHyperRangeAccessible
MiMakeZeroedPageTablesEx
MiMarkHiberNotCachedPages
MiMarkKernelPageTablePages
MiMarkLargePageMappings
MiMarkNonPagedHiberPhasePages
MiMoveDirtyBitsToPfns
MiOutSwapWorkingSet
MiQueryAddressState
MiSimpleAging
MiTrimWorkingSet
MiWalkResetCommitPages
MmRemoveExecuteGrants
MmRemoveSystemCacheFromDump
MmUpdateOldWorkingSetPages