MiUnmapPatchTable
INT64 __fastcall MiUnmapPatchTable(UINT64 a1){
UINT64 v2;
__int64 v3;
__int64 SessionVm;
INT64 v5;
char *v6;
UINT8 v7;
UINT64 v8;
char *v9;
UINT8 SpinCount;
int SpinCount_4;
UINT64 v13;
UINT64 v14;
int result;
__int16 result_4;
__int64 v17;
__int64 v18;
__int64 v19;
memset((INT64)&result, 0i64);
v2 = a1 + 8 * (((unsigned int)dword_140C4C9F0 >> 12) + ((dword_140C4C9F0 & 0xFFF) != 0) - 1i64);
v14 = v2;
v3 = (__int64)((a1 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
SessionVm = MiGetSessionVm();
result = 2;
v5 = SessionVm;
result_4 = 0;
v18 = 0i64;
v6 = 0i64;
LODWORD(v17) = 20;
v19 = 0i64;
SpinCount = MiLockWorkingSetShared(SessionVm);
v7 = SpinCount;
if( a1 > v2 )
return MiUnlockWorkingSetShared(v5, v7);
do
{
if( v6 )
{
if( (a1 & 0xFFF) != 0 )
goto LABEL_6;
MiFlushTbList((__int64)&result);
MiUnlockPageTableInternal(v5, (UINT64)v6);
}
v6 = (char *)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64);
MiLockPageTableInternal(v5, (UINT64)v6, 0i64);
LABEL_6:
v13 = MI_READ_PTE_LOCK_FREE(a1);
v8 = v13;
if( (v13 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v13);
v9 = (char *)MmGetPfnDb() + 48 * ((v8 >> 12) & 0xFFFFFFFFFi64);
SpinCount_4 = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v9 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)&SpinCount_4);
while( *((__int64 *)v9 + 3) < 0 );
}
MiDecrementShareCount((UINT64)v9);
_InterlockedAnd64((volatile signed __int64 *)v9 + 3, 0x7FFFFFFFFFFFFFFFui64);
MiInsertTbFlushEntry((INT64)&result, v3, 1i64, 0i64);
}
*(_QWORD *)a1 = ZeroPte;
a1 += 8i64;
v3 += 4096i64;
}
while( a1 <= v14 );
v7 = SpinCount;
if( v6 )
{
MiFlushTbList((__int64)&result);
MiUnlockPageTableInternal(v5, (UINT64)v6);
}
return MiUnlockWorkingSetShared(v5, v7);
}Referenced by:
MiMapSystemImage
MiUnloadSystemImage