找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 1258|回复: 3

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

[复制链接]

5

主题

116

回帖

0

精华

铜牌会员

积分
174
发表于 2023-10-18 10:43:10 | 显示全部楼层 |阅读模式
发送 exitvm
exithandle处理
调用vm_off前
恢复恢复 IDT GDT

1697596688007.jpg

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



78

主题

190

回帖

9

精华

贵宾会员

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

评分

参与人数 2水晶币 +110 收起 理由
376408384 + 10 很给力!
Tesla.Angela + 100 很给力!

查看全部评分

5

主题

116

回帖

0

精华

铜牌会员

积分
174
 楼主| 发表于 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;

感谢大神指点

实在不知道怎么定义了

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

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
发表于 2023-10-19 03:36:30 | 显示全部楼层
有一种偷懒的办法是
  1. typedef struct _IDTR64
  2. {
  3.     USHORT Pad[3];
  4.     USHORT Limit;
  5.     ULONG64 Base;
  6. }IDTR64;
复制代码

这样Limit和Base就没有空隙了,然后把&idtr.Limit喂给lidt指令。
你也可以用pragma pack语法勒令结构体的对齐粒度。

评分

参与人数 1水晶币 +10 收起 理由
376408384 + 10 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表