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