VmpQueryAccessedState

NTSTATUS __stdcall VmpQueryAccessedState(PEX_SPIN_LOCK SpinLock){
  UINT64 *v1; 
  int v2; 
  int v3; 
  UINT64 *v4; 
  UINT64 *v6; 
  __int64 v7; 
  unsigned __int64 v8; 
  unsigned __int8 i; 
  UINT64 *v10; 
  __int64 v11; 
  NTSTATUS result; 
  _QWORD *a5; 
  int v14; 
  UINT64 a2[2]; 
  unsigned __int64 v16; 
  _QWORD v17[2]; 
  INT64 a4[2]; 
  __int64 v19; 
  __int64 v20[32]; 
  v14 = v3;
  v19 = 0i64;
  v4 = v1;
  *(_OWORD *)a2 = 0i64;
  v6 = 0i64;
  v7 = 0i64;
  v8 = (unsigned __int64)&v1[v2];
  v16 = v8;
  *(_OWORD *)v17 = 0i64;
  *(_OWORD *)a4 = 0i64;
  for( i = VmpProcessContextLockShared(SpinLock); (unsigned __int64)v4 < v16; ++v4 )
  {
    a2[0] = *v4 >> 12;
    a2[1] = 1i64;
    v10 = v6;
    VmpConvertPortionVpnRangeToGpnRange((INT64)SpinLock, a2, 0xFFFFFFFFFFFFFFFFui64, (INT64)a4, v17);
    if( v17[1] )
    {
      v6 = v4;
      v20[v7] = v17[0];
      v7 = (unsigned int)(v7 + 1);
      if( (_DWORD)v7 != 1 )
        v6 = v10;
      if( a2[1] )
      {
        --v4;
LABEL_10:
        v11 = *((_QWORD *)SpinLock + 5);
        ExReleaseSpinLockSharedFromDpcLevel(SpinLock);
        __writecr8(i);
        LODWORD(a5) = v14;
        VmpProcessAccessedBatch((INT64)SpinLock, (INT64)v20, (unsigned int)v7, v6, (INT64)a5);
        v7 = 0i64;
        i = VmpProcessContextLockShared(SpinLock);
        if( v11 != *((_QWORD *)SpinLock + 5) )
        {
          *(_OWORD *)a4 = 0i64;
          v19 = 0i64;
        }
        continue;
      }
      if( (_DWORD)v7 == 32 )
        goto LABEL_10;
    }
    else
    {
      *v4 |= 6ui64;
      if( (_DWORD)v7 )
        goto LABEL_10;
    }
  }
  ExReleaseSpinLockSharedFromDpcLevel(SpinLock);
  result = i;
  __writecr8(i);
  if( (_DWORD)v7 )
  {
    LODWORD(a5) = v14;
    return VmpProcessAccessedBatch((INT64)SpinLock, (INT64)v20, (unsigned int)v7, &v4[-(unsigned int)v7], (INT64)a5);
  }
  return result;
}

Referenced by:

MiQueryEPTAccessedState