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
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 |