MiReplaceRotateWithDemandZero
NTSTATUS __stdcall MiReplaceRotateWithDemandZero(
VOID *VirtualAddress,
VOID *LastVa,
_MI_PFN_CACHE_ATTRIBUTE CacheAttribute){
char *v5;
unsigned int v6;
__int64 v7;
_EPROCESS *Process;
_MMPTE *PteBase;
_MMPTE *v10;
unsigned __int64 *v11;
_MMSUPPORT_INSTANCE *p_Instance;
CHAR v13;
char v14;
__int64 v15;
unsigned int v16;
__int64 v17;
__int64 v18;
UINT64 v19;
int v20;
__int64 *v21;
unsigned __int64 v22;
_MMPFN *v23;
UINT64 v24;
char WsIrql;
unsigned int WsIrql_4;
_MI_PFN_CACHE_ATTRIBUTE CacheAttributea[2];
UINT64 IoPageFrame;
unsigned __int64 v30;
_MMSUPPORT_INSTANCE *v31;
__int64 v32;
_MI_TB_FLUSH_LIST TbFlushList[48];
__int64 v34[44];
CacheAttributea[0] = CacheAttribute;
v5 = 0i64;
IoPageFrame = 0i64;
memset(TbFlushList, 0i64, 0xB8u);
v6 = 0;
WsIrql_4 = 0;
v7 = 0i64;
Process = KeGetCurrentThread()->ApcState.Process;
PteBase = MmGetPteBase();
v10 = (_MMPTE *)((char *)PteBase + (((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64));
v30 = (unsigned __int64)PteBase + (((unsigned __int64)LastVa >> 9) & 0x7FFFFFFFF8i64);
v11 = (unsigned __int64 *)((char *)&PteBase->u.Long + (((unsigned __int64)v10 >> 9) & 0x7FFFFFFFF8i64));
LOWORD(TbFlushList[1]) = 0;
p_Instance = &Process->Vm.Instance;
*(_QWORD *)&TbFlushList[4] = 0i64;
TbFlushList[2] = 20;
TbFlushList[0] = 1;
*(_QWORD *)&TbFlushList[6] = 0i64;
v31 = p_Instance;
MiLockWorkingSetShared();
WsIrql = v14;
if( (unsigned __int64)v10 <= v30 )
{
v15 = (_QWORD)MmGetPteBase() << 25;
v32 = v15;
while( 1 )
{
if( !v5 )
goto LABEL_29;
if( ((unsigned __int16)v10 & 0xFFF) == 0 )
break;
LABEL_5:
if( !v6 )
{
MiIsProbeActive(v10, 1ui64, 3i64, v13);
v6 = v16;
}
if( MiUnmapFrameBuffer((ULONG_PTR)v10, CacheAttributea[0], v6, &IoPageFrame) )
v6 = 1;
if( IoPageFrame != -1i64 )
{
if( (_DWORD)v7
&& (v17 = 2i64 * (unsigned int)(v7 - 1), v18 = v34[2 * (unsigned int)(v7 - 1) + 1], v18 == IoPageFrame) )
{
v19 = v18 + 1;
}
else
{
v19 = IoPageFrame + 1;
v17 = 2i64 * (unsigned int)v7;
v7 = (unsigned int)(v7 + 1);
v34[v17] = IoPageFrame;
}
v34[v17 + 1] = v19;
}
MiInsertTbFlushEntry(TbFlushList, (VOID *)((((_QWORD)v10 << 25) - v15) >> 16), 1ui64, 0i64);
++WsIrql_4;
if( ((unsigned __int16)++v10 & 0xFFF) != 0 && (unsigned __int64)v10 <= v30 && (_DWORD)v7 != 22 )
{
if( ((unsigned __int8)v10 & 0x78) != 0 )
continue;
LOBYTE(v20) = MiWorkingSetIsContended((INT64)p_Instance);
if( !v20
&& !(unsigned int)MiPageTableLockIsContended((__int64)p_Instance, (UINT64)v5)
&& !(unsigned int)KeShouldYieldProcessor() )
{
continue;
}
}
MiFlushTbList(TbFlushList);
if( (_DWORD)v7 )
{
v21 = v34;
do
{
MiDereferenceIoPages(1i64, *v21, v21[1] - *v21);
v21 += 2;
--v7;
}
while( v7 );
p_Instance = v31;
v15 = v32;
}
v22 = *v11;
MiPteInShadowRange((UINT64)v11);
v23 = &MmGetPfnDb()[(v22 >> 12) & 0xFFFFFFFFFi64];
CacheAttributea[1] = MiNonCached;
while( _interlockedbittestandset64((volatile signed __int32 *)&v23->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)&CacheAttributea[1]);
while( v23->u2._bf_0 < 0 );
}
v23->u2._bf_0 ^= (v23->u2._bf_0 ^ (v23->u2._bf_0 - WsIrql_4)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64(&v23->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
MiUnlockPageTableInternal((INT64)p_Instance, (UINT64)v5);
LOBYTE(v24) = WsIrql;
MiUnlockWorkingSetShared(p_Instance, v24);
if( (unsigned __int64)v10 > v30 )
return v6;
v7 = 0i64;
v11 = (unsigned __int64 *)((char *)&MmGetPteBase()->u.Long + (((unsigned __int64)v10 >> 9) & 0x7FFFFFFFF8i64));
WsIrql_4 = 0;
v5 = 0i64;
MiLockWorkingSetShared();
}
MiUnlockPageTableInternal((INT64)p_Instance, (UINT64)v5);
LABEL_29:
v5 = (char *)MmGetPteBase() + (((unsigned __int64)v10 >> 9) & 0x7FFFFFFFF8i64);
MiLockPageTableInternal((INT64)p_Instance, (UINT64)v5, 0i64);
goto LABEL_5;
}
return v6;
}Referenced by:
MmRotatePhysicalView