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