VmpInvalidateOutstandingFaults
__int64 __fastcall VmpInvalidateOutstandingFaults(__int64 a1, unsigned __int64 a2, __int64 a3){
volatile int *v3;
unsigned __int64 v6;
__int64 v7;
__int64 v8;
unsigned __int64 v9;
_QWORD *i;
unsigned __int64 v11;
unsigned __int64 v12;
_QWORD *v13;
unsigned __int64 v14;
bool v15;
unsigned __int64 v16;
_QWORD *v17;
_QWORD **v18;
_QWORD *v19;
v3 = (volatile int *)(a1 + 64);
v6 = a2 + a3 - 1;
v7 = 0i64;
ExAcquireSpinLockSharedAtDpcLevel((PEX_SPIN_LOCK)(a1 + 64));
v8 = a1 + 48;
v9 = *(_QWORD *)v8;
if( (*(_BYTE *)(v8 + 8) & 1) != 0 && v9 )
v9 ^= v8;
i = 0i64;
while( v9 )
{
v11 = *(_QWORD *)(v9 + 24) & 0xFFFFFFFFFFFFFi64;
if( a2 > v11 )
{
v12 = *(_QWORD *)(v9 + 8);
}
else
{
v12 = *(_QWORD *)v9;
i = (_QWORD *)v9;
if( a2 >= v11 )
{
if( (*(_BYTE *)(v8 + 8) & 1) != 0 && v12 )
v12 ^= v9;
v13 = 0i64;
if( v12 )
{
do
{
v14 = *(_QWORD *)(v12 + 24) & 0xFFFFFFFFFFFFFi64;
v15 = a2 < v14;
if( a2 > v14 )
{
v16 = *(_QWORD *)(v12 + 8);
}
else
{
v16 = *(_QWORD *)v12;
if( !v15 )
v13 = (_QWORD *)v12;
}
if( (*(_BYTE *)(v8 + 8) & 1) != 0 && v16 )
v12 ^= v16;
else
v12 = v16;
}
while( v12 );
if( v13 )
i = v13;
}
break;
}
}
if( (*(_BYTE *)(v8 + 8) & 1) != 0 && v12 )
v9 ^= v12;
else
v9 = v12;
}
while( i && (i[3] & 0xFFFFFFFFFFFFFui64) <= v6 )
{
++v7;
i[3] |= 0x10000000000000ui64;
v17 = i;
v18 = (_QWORD **)i[1];
if( v18 )
{
v19 = *v18;
for( i = (_QWORD *)i[1]; v19; v19 = (_QWORD *)*v19 )
i = v19;
}
else
{
while( 1 )
{
i = (_QWORD *)(i[2] & 0xFFFFFFFFFFFFFFFCui64);
if( !i || (_QWORD *)*i == v17 )
break;
v17 = i;
}
}
}
ExReleaseSpinLockSharedFromDpcLevel(v3);
return v7;
}Referenced by:
VmpFlushTbVaRange