MiUnmapPatchTable

NTSTATUS __stdcall MiUnmapPatchTable(UINT64 a1){
  INT64 v2; 
  UINT64 v3; 
  __int64 v4; 
  INT64 v5; 
  INT16 v6; 
  _MMSUPPORT_INSTANCE *SessionVm; 
  _MMSUPPORT_INSTANCE *v8; 
  char *v9; 
  UINT64 v10; 
  char v11; 
  char v12; 
  UINT64 v13; 
  UINT64 v14; 
  _MMPFN *v15; 
  unsigned __int64 Long; 
  int v17; 
  NTSTATUS result; 
  char SpinCount; 
  int SpinCount_4; 
  UINT64 v21; 
  UINT64 v22; 
  _MI_TB_FLUSH_LIST TbFlushList[48]; 

  memset(TbFlushList, 0i64, 0xB8u);
  v2 = (unsigned int)dword_140C4C9F0 >> 12;
  v3 = a1 + 8 * ((unsigned int)v2 + ((dword_140C4C9F0 & 0xFFF) != 0) - 1i64);
  v22 = v3;
  v4 = (__int64)((a1 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
  SessionVm = MiGetSessionVm(v5, v2, v6);
  TbFlushList[0] = 2;
  v8 = SessionVm;
  LOWORD(TbFlushList[1]) = 0;
  *(_QWORD *)&TbFlushList[4] = 0i64;
  v9 = 0i64;
  TbFlushList[2] = 20;
  *(_QWORD *)&TbFlushList[6] = 0i64;
  MiLockWorkingSetShared();
  SpinCount = v11;
  v12 = v11;
  if( a1 > v3 )
    goto LABEL_18;
  do
  {
    if( v9 )
    {
      if( (a1 & 0xFFF) != 0 )
        goto LABEL_6;
      MiFlushTbList(TbFlushList);
      MiUnlockPageTableInternal((INT64)v8, (UINT64)v9);
    }
    v9 = (char *)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64);
    MiLockPageTableInternal((INT64)v8, (UINT64)v9, 0i64);
LABEL_6:
    LODWORD(v13) = MI_READ_PTE_LOCK_FREE(a1);
    v21 = v13;
    v14 = v13;
    if( (v13 & 1) != 0 )
    {
      MiPteInShadowRange((UINT64)&v21);
      v15 = &MmGetPfnDb()[(v14 >> 12) & 0xFFFFFFFFFi64];
      SpinCount_4 = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)&v15->u2, 0x3Fui64) )
      {
        do
          KeYieldProcessorEx((UINT64 *)&SpinCount_4);
        while( v15->u2._bf_0 < 0 );
      }
      MiDecrementShareCount(v15);
      _InterlockedAnd64(&v15->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
      MiInsertTbFlushEntry(TbFlushList, (VOID *)v4, 1ui64, 0i64);
    }
    Long = ZeroPte.u.Long;
    LOBYTE(v17) = MiPteInShadowRange(a1);
    if( v17 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
      Long = ZeroPte.u.Long | 0x8000000000000000ui64;
    *(_QWORD *)a1 = Long;
    a1 += 8i64;
    v4 += 4096i64;
  }
  while( a1 <= v22 );
  v12 = SpinCount;
  if( v9 )
  {
    MiFlushTbList(TbFlushList);
    MiUnlockPageTableInternal((INT64)v8, (UINT64)v9);
  }
LABEL_18:
  LOBYTE(v10) = v12;
  MiUnlockWorkingSetShared(v8, v10);
  return result;
}

Referenced by:

MiMapSystemImage