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;
INT64 v13;
int v14;
__int128 v15;
unsigned __int64 v16;
__int128 v17;
__int128 v18;
__int64 v19;
__int64 v20[32];
v14 = v3;
v19 = 0i64;
v4 = v1;
v15 = 0i64;
v6 = 0i64;
v7 = 0i64;
v8 = (unsigned __int64)&v1[v2];
v16 = v8;
v17 = 0i64;
v18 = 0i64;
for( i = VmpProcessContextLockShared(SpinLock); (unsigned __int64)v4 < v16; ++v4 )
{
*(_QWORD *)&v15 = *v4 >> 12;
*((_QWORD *)&v15 + 1) = 1i64;
v10 = v6;
VmpConvertPortionVpnRangeToGpnRange(
(__int64)SpinLock,
(unsigned __int64 *)&v15,
0xFFFFFFFFFFFFFFFFui64,
(__int64)&v18,
&v17);
if( *((_QWORD *)&v17 + 1) )
{
v6 = v4;
v20[v7] = v17;
v7 = (unsigned int)(v7 + 1);
if( (_DWORD)v7 != 1 )
v6 = v10;
if( *((_QWORD *)&v15 + 1) )
{
--v4;
LABEL_10:
v11 = *((_QWORD *)SpinLock + 5);
ExReleaseSpinLockSharedFromDpcLevel(SpinLock);
__writecr8(i);
LODWORD(v13) = v14;
VmpProcessAccessedBatch((INT64)SpinLock, (INT64)v20, (unsigned int)v7, v6, v13);
v7 = 0i64;
i = VmpProcessContextLockShared(SpinLock);
if( v11 != *((_QWORD *)SpinLock + 5) )
{
v18 = 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(v13) = v14;
return VmpProcessAccessedBatch((INT64)SpinLock, (INT64)v20, (unsigned int)v7, &v4[-(unsigned int)v7], v13);
}
return result;
}Referenced by:
MiQueryEPTAccessedState