#include "Virtualizer.h" BOOL ViCanHandleInst(PNATIVE_CODE_LINK Link) { switch (XedDecodedInstGetIClass(&Link->XedInstruction)) { case XED_ICLASS_MOV: return TRUE; } return FALSE; } BOOL ViValidateNativeCodeBlock(PVIRTUALIZER Vm, PNATIVE_CODE_BLOCK Block) { for (PNATIVE_CODE_LINK T = Block->Start; T && T != Block->End->Next; T = T->Next) { if (!ViCanHandleInst(T)) return FALSE; //Cant handle RIP relative instructions. CONST XED_INST* Inst = XedDecodedInstInst(&T->XedInstruction); UINT OperandCount = XedDecodedInstNumOperands(&T->XedInstruction); for (UINT i = 0; i < OperandCount; i++) { XED_OPERAND_ENUM OperandName = XedOperandName(XedInstOperand(Inst, i)); if ((OperandName == XED_OPERAND_MEM0 || OperandName == XED_OPERAND_MEM1) && XedDecodedInstGetBaseReg(&T->XedInstruction, OperandName - XED_OPERAND_MEM0) == XED_REG_RIP) return FALSE; } } return TRUE; } BOOL ViVirtualizeInst(PNATIVE_CODE_LINK Inst, PNATIVE_CODE_BLOCK) { XED_ICLASS_ENUM IClass = XedDecodedInstGetIClass(&Inst->XedInstruction); switch (IClass) { case XED_ICLASS_MOV: { return TRUE; } } return FALSE; }