MiClearDriverHotPatchPtes

CHAR __fastcall MiClearDriverHotPatchPtes(INT64 a1){
  UINT64 v2; 
  int SystemRegionType; 
  _MMPTE *PteBase; 
  __int64 v5; 
  _QWORD *v6; 
  unsigned int v7; 
  INT64 CurrentThread; 
  unsigned int v9; 
  __int64 v10; 
  _MMPFN *PfnDb; 
  unsigned __int64 v12; 
  UINT64 v13; 
  UINT64 v14; 
  INT64 TransitionPte; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  char *v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  char *v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  int v25; 
  bool v26; 
  int v28; 
  INT64 v29[2]; 
  INT64 result; 
  int v31; 
  __int64 v32; 
  memset((INT64)&result, 0i64);
  v2 = *(_QWORD *)(a1 + 48);
  SystemRegionType = MiGetSystemRegionType(v2);
  PteBase = MmGetPteBase();
  if( SystemRegionType == 1 )
  {
    v5 = *(_QWORD *)(a1 + 288);
    v28 = 1;
  }
  else
  {
    v28 = 0;
    v5 = (__int64)PteBase
       + 8 * (*(_DWORD *)(a1 + 64) >> 12)
       + 8 * (unsigned int)((*(_DWORD *)(a1 + 64) & 0xFFF) != 0)
       + ((v2 >> 9) & 0x7FFFFFFFF8i64);
  }
  v6 = (_QWORD *)v5;
  v7 = ((unsigned int)dword_140C4C9F0 >> 12) + ((dword_140C4C9F0 & 0xFFF) != 0);
  LOBYTE(CurrentThread) = 0;
  v9 = 0;
  v31 = 20;
  v10 = ((v5 << 25) - ((_QWORD)PteBase << 25)) >> 16;
  v32 = 0i64;
  if( v7 )
  {
    PfnDb = MmGetPfnDb();
    do
    {
      CurrentThread = MI_READ_PTE_LOCK_FREE((INT64)v6);
      v29[0] = CurrentThread;
      if( !CurrentThread )
        break;
      if( (CurrentThread & 1) != 0 )
      {
        MiInsertTbFlushEntry((INT64)&result, v10, 1i64, 0i64);
        v12 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)v29) >> 12) & 0xFFFFFFFFFi64;
        v13 = (UINT64)PfnDb + 48 * v12;
        TransitionPte = MiMakeTransitionPte(v12, 1ui64, v14);
        v16 = (unsigned __int8)MiLockPageInline(v13);
        *v6 = TransitionPte;
        MiDecrementShareCount(v13);
        _InterlockedAnd64((volatile signed __int64 *)(v13 + 24), 0x7FFFFFFFFFFFFFFFui64);
        LOBYTE(CurrentThread) = KiIrqlFlags;
        __writecr8(v16);
        PfnDb = MmGetPfnDb();
      }
      ++v6;
      v10 += 4096i64;
      ++v9;
    }
    while( v9 < v7 );
    if( v9 )
    {
      MiFlushTbList((__int64)&result);
      do
      {
        v17 = MI_READ_PTE_LOCK_FREE(v5);
        v29[0] = v17;
        if( qword_140C4DC80 )
        {
          if( (v17 & 0x10) != 0 )
            v17 &= ~0x10ui64;
          else
            v17 &= ~qword_140C4DC80;
        }
        v18 = (v17 >> 12) & 0xFFFFFFFFFi64;
        v19 = (char *)MmGetPfnDb() + 48 * v18;
        v20 = (unsigned __int8)MiLockPageInline((INT64)v19);
        v21 = *((_QWORD *)v19 + 3);
        if( (v21 & 0x3FFFFFFFFFFFFFFFi64) != 0 )
          KeBugCheckEx(0x1Au, 0x18951ui64, v5, v18, *((_QWORD *)v19 + 3) & 0x3FFFFFFFFFFFFFFFi64);
        v19[34] = v19[34] & 0xF8 | 6;
        *((_QWORD *)v19 + 3) = v21 & 0x8000000000000000ui64 | 0x4000000000000001i64;
        v22 = (char *)MmGetPfnDb() + 48 * (*((_QWORD *)v19 + 5) & 0xFFFFFFFFFi64);
        MiLockNestedPageAtDpcInline((INT64)v22);
        *((_QWORD *)v22 + 3) ^= ((*((_QWORD *)v22 + 3) - 1i64) ^ *((_QWORD *)v22 + 3)) & 0x3FFFFFFFFFFFFFFFi64;
        _InterlockedAnd64((volatile signed __int64 *)v22 + 3, 0x7FFFFFFFFFFFFFFFui64);
        v23 = *((_QWORD *)v19 + 5) & 0xFFFFFFF000000000ui64 | 0xFFFFFFFFDi64;
        *((_QWORD *)v19 + 5) = v23;
        if( v28 )
          *((_QWORD *)v19 + 5) = v23 & 0x7FFFFFFFFFFFFFFFi64;
        *((_QWORD *)v19 + 1) = 0i64;
        *((_QWORD *)v19 + 2) = 0i64;
        _InterlockedAnd64((volatile signed __int64 *)v19 + 3, 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(v20);
        v24 = ZeroPte;
        v25 = 0;
        LODWORD(CurrentThread) = MiPteInShadowRange(v5);
        if( !(_DWORD)CurrentThread )
          goto LABEL_27;
        LODWORD(CurrentThread) = MiPteHasShadow();
        if( (_DWORD)CurrentThread )
        {
          v25 = 1;
          if( !HIBYTE(word_140C4DD48) )
          {
            v26 = (ZeroPte & 1) == 0;
            goto LABEL_25;
          }
        }
        else
        {
          CurrentThread = (INT64)KeGetCurrentThread();
          if( (*(_DWORD *)(*(_QWORD *)(CurrentThread + 184) + 2172i64) & 0x1000) != 0 )
          {
            v26 = (ZeroPte & 1) == 0;
LABEL_25:
            if( !v26 )
              v24 = ZeroPte | 0x8000000000000000ui64;
          }
        }
LABEL_27:
        *(_QWORD *)v5 = v24;
        if( v25 )
          LOBYTE(CurrentThread) = MiWritePteShadow();
        v5 += 8i64;
        --v9;
      }
      while( v9 );
    }
  }
  return CurrentThread;
}

Referenced by:

MiUnloadSystemImage