You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
2.9 KiB

#ifndef __VMDEFS_H
#define __VMDEFS_H
#include "Windas.h"
#include "XedWrap.h"
union VM_IMM
{
UINT8 u8;
UINT16 u16;
UINT32 u32;
UINT64 u64;
INT8 i8;
INT16 i16;
INT32 i32;
INT64 i64;
PVOID Raw;
};
enum VM_MEMOP_TYPE_ENUM : UCHAR
{
VM_MEMOP_B,
VM_MEMOP_BD,
VM_MEMOP_BIS,
VM_MEMOP_BISD,
VM_MEMOP_TYPE_COUNT
};
enum VM_IREG_ENUM : UCHAR
{
VM_IREG_1,
VM_IREG_2,
VM_IREG_3,
VM_IREG_COUNT,
};
enum VM_OPERAND_SIZE_ENUM : UCHAR
{
VM_OPSIZE_8,
VM_OPSIZE_16,
VM_OPSIZE_32,
VM_OPSIZE_64,
VM_OPSIZE_COUNT
};
enum VM_REG_USAGE_ENUM
{
VM_REG_HEADER = XED_REG_RDI,
VM_REG_HANDLER_TABLE = XED_REG_RSI,
VM_REG_IP = XED_REG_RDX,
VM_REG_REGISTER_FILE = XED_REG_RBP,
VM_REG_FLAG_STORAGE = XED_REG_RSP,
};
enum VM_ICLASS_ENUM : USHORT
{
VM_ICLASS_ENTER = XED_ICLASS_LAST,
VM_ICLASS_EXIT,
//OPSIZE IS NOW HANDLED INSIDE OF THE VM_HANDLER STRUCTURE
//Loading into ireg from memory
VM_ICLASS_LD_IREG_MEM_START,
VM_ICLASS_LD_IREG_MEM_END = VM_ICLASS_LD_IREG_MEM_START + (VM_IREG_COUNT * VM_MEMOP_TYPE_COUNT) - 1,
//Storing internal registers into memory
VM_ICLASS_ST_IREG_MEM_START,
VM_ICLASS_ST_IREG_MEM_END = VM_ICLASS_ST_IREG_MEM_START + (VM_IREG_COUNT * VM_MEMOP_TYPE_COUNT) - 1,
//Loading scratch registers into internal registers
VM_ICLASS_LD_IREG_REG_START,
VM_ICLASS_LD_IREG_REG_END = VM_ICLASS_LD_IREG_REG_START + (VM_IREG_COUNT) - 1,
//storing internal registers into scratch registers
VM_ICLASS_ST_IREG_REG_START,
VM_ICLASS_ST_IREG_REG_END = VM_ICLASS_ST_IREG_REG_START + (VM_IREG_COUNT) - 1,
//Loading Immediate Values into internal registers
VM_ICLASS_LD_IREG_IMM_START,
VM_ICLASS_LD_IREG_IMM_END = VM_ICLASS_LD_IREG_IMM_START + (VM_IREG_COUNT) - 1,
VM_ICLASS_COUNT,
};
enum VM_REG_ENUM : UCHAR
{
VM_REG_0, //0-15 reserved for converted native registers.
VM_REG_1,
VM_REG_2,
VM_REG_3,
VM_REG_4,
VM_REG_5,
VM_REG_6,
VM_REG_7,
VM_REG_8,
VM_REG_9,
VM_REG_10,
VM_REG_11,
VM_REG_12,
VM_REG_13,
VM_REG_14,
VM_REG_15,
//VM_REG_16, //scratch registers
//VM_REG_17,
//VM_REG_18,
//VM_REG_19,
//VM_REG_20,
//VM_REG_21,
//VM_REG_22,
//VM_REG_23,
//VM_REG_24,
//VM_REG_25,
//VM_REG_26,
//VM_REG_27,
//VM_REG_28,
//VM_REG_29,
//VM_REG_30,
//VM_REG_31,
VM_REG_COUNT
};
typedef struct _VM_HEADER
{
PVOID RegisterFile[VM_REG_COUNT];
PVOID RegisterStorage[16];
PVOID FlagsStorage;
UINT HandlerTableSize;
PVOID HandlerTable[1];
}VM_HEADER, * PVM_HEADER;
#pragma pack(push,1)
struct IRegMem_B_Template
{
UINT16 OpCode;
UINT8 Base;
};
struct IRegMem_BD_Template
{
UINT16 OpCode;
UINT8 Base;
INT32 Disp;
};
struct IRegMem_BIS_Template
{
UINT16 OpCode;
UINT8 Base;
UINT8 Index;
UINT8 Scale;
};
struct IRegMem_BISD_Template
{
UINT16 OpCode;
UINT8 Base;
UINT8 Index;
UINT8 Scale;
INT32 Disp;
};
struct IRegReg_Template
{
UINT16 OpCode;
UINT8 Reg;
};
struct IRegImm_Template
{
UINT16 OpCode;
VM_IMM Imm;
};
#pragma pack(pop)
#endif