VmpFlushTbVaRange
NTSTATUS __fastcall VmpFlushTbVaRange(INT64 *SpinLock, UINT64 a2, INT64 a3, INT64 a4, INT64 a5, INT64 a6){
UINT64 v6;
unsigned __int64 v9;
__int64 *v10;
_QWORD *v11;
UINT64 v12;
unsigned __int64 v13;
INT64 v14;
UINT64 v16;
INT64 v17;
__int64 v18;
__int128 GpaPageStart;
UINT64 v21;
UINT64 v22;
UINT64 PageCountProcessed;
v6 = a3 - a2;
v21 = a2;
GpaPageStart = 0i64;
LODWORD(v9) = v6 + 1;
v22 = v6 + 1;
if( v6 != -1i64 )
{
v10 = (__int64 *)a6;
v11 = (_QWORD *)a5;
do
{
v9 = VmpConvertPortionVpnRangeToGpnRange((__int64)SpinLock, &v21, 0x40000i64 - *v11, a4, &GpaPageStart);
v12 = *((_QWORD *)&GpaPageStart + 1);
v13 = v9;
if( !*((_QWORD *)&GpaPageStart + 1) )
break;
v14 = VmpTraceLoggingProvider;
if( VmpTraceLoggingProvider )
{
if( *(_DWORD *)VmpTraceLoggingProvider && tlgKeywordOn(VmpTraceLoggingProvider, 2i64) )
VmpLogTbFlushSlatInvalidate(v14, v13);
}
v16 = SpinLock[9];
PageCountProcessed = 0i64;
if( HvlMapGpaPages(v16, GpaPageStart, 0x10400ui64, v12, 0i64, &PageCountProcessed) < 0 )
NT_ASSERT("(((NTSTATUS)(Status)) >= 0)");
if( PageCountProcessed != v12 )
NT_ASSERT("PageCountProcessed == NumberOfPages");
LODWORD(v9) = VmpInvalidateOutstandingFaults((__int64)SpinLock, v13, v12);
*v11 += v12;
if( *v11 >= 0x40000ui64 )
{
v17 = SpinLock[5];
v18 = *v10;
ExReleaseSpinLockExclusiveFromDpcLevel(SpinLock);
__writecr8((unsigned __int8)v18);
*v11 = 0i64;
LODWORD(v9) = VmpProcessContextLockExclusive(SpinLock);
*v10 = v9;
if( v17 != SpinLock[5] )
{
LODWORD(v9) = 0;
*(_OWORD *)a4 = 0i64;
*(_QWORD *)(a4 + 16) = 0i64;
}
}
}
while( v22 );
}
return v9;
}Referenced by:
VmpFlushTb
VmpRemoveMemoryRange