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; 
  INT64 v13; 
  int v14; 
  __int128 v15; 
  unsigned __int64 v16; 
  __int128 v17; 
  __int128 v18; 
  __int64 v19; 
  __int64 v20[32]; 

  v14 = v3;
  v19 = 0i64;
  v4 = v1;
  v15 = 0i64;
  v6 = 0i64;
  v7 = 0i64;
  v8 = (unsigned __int64)&v1[v2];
  v16 = v8;
  v17 = 0i64;
  v18 = 0i64;
  for( i = VmpProcessContextLockShared(SpinLock); (unsigned __int64)v4 < v16; ++v4 )
  {
    *(_QWORD *)&v15 = *v4 >> 12;
    *((_QWORD *)&v15 + 1) = 1i64;
    v10 = v6;
    VmpConvertPortionVpnRangeToGpnRange(
      (__int64)SpinLock,
      (unsigned __int64 *)&v15,
      0xFFFFFFFFFFFFFFFFui64,
      (__int64)&v18,
      &v17);
    if( *((_QWORD *)&v17 + 1) )
    {
      v6 = v4;
      v20[v7] = v17;
      v7 = (unsigned int)(v7 + 1);
      if( (_DWORD)v7 != 1 )
        v6 = v10;
      if( *((_QWORD *)&v15 + 1) )
      {
        --v4;
LABEL_10:
        v11 = *((_QWORD *)SpinLock + 5);
        ExReleaseSpinLockSharedFromDpcLevel(SpinLock);
        __writecr8(i);
        LODWORD(v13) = v14;
        VmpProcessAccessedBatch((INT64)SpinLock, (INT64)v20, (unsigned int)v7, v6, v13);
        v7 = 0i64;
        i = VmpProcessContextLockShared(SpinLock);
        if( v11 != *((_QWORD *)SpinLock + 5) )
        {
          v18 = 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(v13) = v14;
    return VmpProcessAccessedBatch((INT64)SpinLock, (INT64)v20, (unsigned int)v7, &v4[-(unsigned int)v7], v13);
  }
  return result;
}

Referenced by:

MiQueryEPTAccessedState