#pragma once
#include <windows.h>

#define IOCTL_AVM_RDTSC_EMULATION_ENABLE                                    \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_AVM_RDTSC_EMULATION_DISABLE                                   \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_AVM_RDTSC_EMULATION_GET_LOG_TABLE_SIZE_IN_BYTES               \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_AVM_RDTSC_EMULATION_GET_LOG_TABLE_ITEM_COUNT                  \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_AVM_RDTSC_EMULATION_GET_LOG_TABLE_CONTENT                     \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_AVM_RDTSC_EMULATION_CLEAR_LOG_TABLE                           \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_AVM_RDTSC_EMULATION_GET_CONFIGURATION                         \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_AVM_RDTSC_EMULATION_SET_CONFIGURATION                         \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x807, METHOD_BUFFERED, FILE_ANY_ACCESS)

typedef enum _AVM_RDTSC_EMULATION_INSTRUCTION_TYPE
{
  AvmRdtscType,
  AvmRdtscpType,
} AVM_RDTSC_EMULATION_INSTRUCTION_TYPE;

typedef struct _AVM_RDTSC_EMULATION_LOG_TABLE_ITEM
{
  ULONG ProcessId;
  ULONG ReturnedEax;
  ULONG ReturnedEdx;
  ULONG ReturnedEcx;
  PVOID Eip;
  AVM_RDTSC_EMULATION_INSTRUCTION_TYPE Instruction;
} AVM_RDTSC_EMULATION_LOG_TABLE_ITEM, *PAVM_RDTSC_EMULATION_LOG_TABLE_ITEM;

typedef enum _AVM_RDTSC_EMULATION_METHOD_TYPE
{
  AvmRdtscEmulationConstantMethodType,
  AvmRdtscEmulationIncreasingMethodType,
} AVM_RDTSC_EMULATION_METHOD_TYPE;

typedef struct _AVM_RDTSC_EMULATION_CONFIGURATION
{
  AVM_RDTSC_EMULATION_METHOD_TYPE Method;
  ULONG ProcessId;

  ULONGLONG TscValue;
  ULONG TscAux;

  ULONG DeltaFrom;
  ULONG DeltaTo;
} AVM_RDTSC_EMULATION_CONFIGURATION, *PAVM_RDTSC_EMULATION_CONFIGURATION;
