#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