376408384 发表于 2023-10-18 10:43:10

【求助】请教一下VT退出恢复 IDT GDT的问题

发送 exitvm
exithandle处理
调用vm_off前
恢复恢复 IDT GDT



    _lgdt(&gdtr);
    __lidt(&idtr);
为什么会运行出错的 虚拟机测试直接重启
测试环境 win77601
屏蔽这两行代码就没事了可以顺利退出



tangptr@126.com 发表于 2023-10-18 20:11:52

不清楚你怎么定义你的GDTR和IDTR结构体的,总之它是紧密排列的,换言之就是你要确保Limit和Base中间没有因为对齐之类的原因造成的空隙。LGDT和LIDT只会读4或6或10个字节(64位就是10个字节)。另外__vmx_vmread这个东西是会覆盖整个SIZE_T长度,并不会因为你读的是小字段就不覆盖后面的东西。
重启了是因为三重故障:第一次异常发到IDT里没法用,GDT也没法选择段,就会转化成双重故障异常,再次发进IDT里,还是接不住,就转成三重故障,直接重启。

376408384 发表于 2023-10-19 00:24:17

tangptr@126.com 发表于 2023-10-18 20:11
不清楚你怎么定义你的GDTR和IDTR结构体的,总之它是紧密排列的,换言之就是你要确保Limit和Base中间没有因 ...

typedef struct _Idtr {
      unsigned short limit;
      UINT64 base;
}Idtr;

感谢大神指点

实在不知道怎么定义了

看了堆栈确实没对齐,
用汇编操作了强行移位构造出需要的数据结构
目前就这么解决了
请教一下纯代码应该怎么写那个结构

tangptr@126.com 发表于 2023-10-19 03:36:30

有一种偷懒的办法是
typedef struct _IDTR64
{
    USHORT Pad;
    USHORT Limit;
    ULONG64 Base;
}IDTR64;
这样Limit和Base就没有空隙了,然后把&idtr.Limit喂给lidt指令。
你也可以用pragma pack语法勒令结构体的对齐粒度。
页: [1]
查看完整版本: 【求助】请教一下VT退出恢复 IDT GDT的问题