EXTERN_C VOID VmxExitHandler(PGuestContext context)
{
ULONG64 reason
=
0
;
ULONG64 instLen
=
0
;
ULONG64 instinfo
=
0
;
ULONG64 mrip
=
0
;
ULONG64 mrsp
=
0
;
__vmx_vmread(VM_EXIT_REASON, &reason);
__vmx_vmread(VM_EXIT_INSTRUCTION_LEN, &instLen);
/
/
获取指令长度
__vmx_vmread(VMX_INSTRUCTION_INFO, &instinfo);
/
/
指令详细信息
__vmx_vmread(GUEST_RIP, &mrip);
/
/
获取客户机触发VT事件的地址
__vmx_vmread(GUEST_RSP, &mrsp);
/
/
获取事件码
reason
=
reason &
0xFFFF
;
switch (reason)
{
case EXIT_REASON_CPUID:
case EXIT_REASON_GETSEC:
case EXIT_REASON_TRIPLE_FAULT:
case EXIT_REASON_INVD:
case EXIT_REASON_VMCALL :
case EXIT_REASON_VMCLEAR :
case EXIT_REASON_VMLAUNCH :
case EXIT_REASON_VMPTRLD :
case EXIT_REASON_VMPTRST :
case EXIT_REASON_VMREAD :
case EXIT_REASON_VMRESUME :
case EXIT_REASON_VMWRITE :
case EXIT_REASON_VMXOFF :
case EXIT_REASON_VMXON :
case EXIT_REASON_MSR_READ:
case EXIT_REASON_MSR_WRITE:
case EXIT_REASON_XSETBV:
}
__vmx_vmwrite(GUEST_RIP, mrip
+
instLen);
__vmx_vmwrite(GUEST_RSP, mrsp);
}