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