VmpQueryAccessedState
NTSTATUS __stdcall VmpQueryAccessedState(PEX_SPIN_LOCK SpinLock){
UINT64 *v1;
int v2;
int v3;
UINT64 *v4;
UINT64 *v6;
__int64 v7;
unsigned __int64 v8;
unsigned __int8 i;
UINT64 *v10;
__int64 v11;
NTSTATUS result;
_QWORD *a5;
int v14;
UINT64 a2[2];
unsigned __int64 v16;
_QWORD v17[2];
INT64 a4[2];
__int64 v19;
__int64 v20[32];
v14 = v3;
v19 = 0i64;
v4 = v1;
*(_OWORD *)a2 = 0i64;
v6 = 0i64;
v7 = 0i64;
v8 = (unsigned __int64)&v1[v2];
v16 = v8;
*(_OWORD *)v17 = 0i64;
*(_OWORD *)a4 = 0i64;
for( i = VmpProcessContextLockShared(SpinLock); (unsigned __int64)v4 < v16; ++v4 )
{
a2[0] = *v4 >> 12;
a2[1] = 1i64;
v10 = v6;
VmpConvertPortionVpnRangeToGpnRange((INT64)SpinLock, a2, 0xFFFFFFFFFFFFFFFFui64, (INT64)a4, v17);
if( v17[1] )
{
v6 = v4;
v20[v7] = v17[0];
v7 = (unsigned int)(v7 + 1);
if( (_DWORD)v7 != 1 )
v6 = v10;
if( a2[1] )
{
--v4;
LABEL_10:
v11 = *((_QWORD *)SpinLock + 5);
ExReleaseSpinLockSharedFromDpcLevel(SpinLock);
__writecr8(i);
LODWORD(a5) = v14;
VmpProcessAccessedBatch((INT64)SpinLock, (INT64)v20, (unsigned int)v7, v6, (INT64)a5);
v7 = 0i64;
i = VmpProcessContextLockShared(SpinLock);
if( v11 != *((_QWORD *)SpinLock + 5) )
{
*(_OWORD *)a4 = 0i64;
v19 = 0i64;
}
continue;
}
if( (_DWORD)v7 == 32 )
goto LABEL_10;
}
else
{
*v4 |= 6ui64;
if( (_DWORD)v7 )
goto LABEL_10;
}
}
ExReleaseSpinLockSharedFromDpcLevel(SpinLock);
result = i;
__writecr8(i);
if( (_DWORD)v7 )
{
LODWORD(a5) = v14;
return VmpProcessAccessedBatch((INT64)SpinLock, (INT64)v20, (unsigned int)v7, &v4[-(unsigned int)v7], (INT64)a5);
}
return result;
}Referenced by:
MiQueryEPTAccessedState