VmpFlushTb
INT64 __fastcall VmpFlushTb(INT64 *SpinLock, UINT64 a2, UINT64 *a3){
INT64 v3;
UINT64 *v4;
INT64 v6;
INT64 result;
UINT64 *v8;
UINT64 v9;
__int64 v10;
__int64 v11;
UINT64 v12;
__int64 v13;
INT64 v14;
INT64 a5;
INT64 a4[2];
__int64 v17;
INT64 a6;
a5 = 0i64;
v3 = -1i64;
a6 = -1i64;
v17 = 0i64;
v4 = a3;
*(_OWORD *)a4 = 0i64;
if( (_DWORD)a2 )
{
result = (unsigned int)a2;
v8 = &a3[(unsigned int)a2];
if( a3 >= v8 )
return result;
do
{
v9 = *v4;
result = 0x7FFFFFFEFFFFi64;
if( *v4 <= 0x7FFFFFFEFFFFi64 )
{
v10 = (*v4 & 0x3FF) + 1;
v11 = (v9 >> 10) & 3;
if( ((v9 >> 10) & 3) != 0 )
{
do
{
v10 <<= 9;
--v11;
}
while( v11 );
}
v12 = v9 >> 12;
v13 = v10 - 1;
if( v3 == -1 )
{
LODWORD(v14) = VmpProcessContextLockExclusive(SpinLock);
a6 = v14;
}
result = VmpFlushTbVaRange(SpinLock, v12, v12 + v13, (INT64)a4, (INT64)&a5, (INT64)&a6);
v3 = a6;
}
++v4;
}
while( v4 < v8 );
}
else
{
LODWORD(v6) = VmpProcessContextLockExclusive(SpinLock);
a6 = v6;
result = VmpFlushTbVaRange(SpinLock, 0i64, 0x10000000000000i64, (INT64)a4, (INT64)&a5, (INT64)&a6);
v3 = a6;
}
if( v3 != -1 )
{
ExReleaseSpinLockExclusiveFromDpcLevel(SpinLock);
result = (unsigned __int8)v3;
__writecr8((unsigned __int8)v3);
}
return result;
}Referenced by:
VmFlushTb