Windows 7 x86 重启过程

逆向工程 视窗 x86
2021-06-13 17:51:05

我知道有不同的方法可以重新启动。

我正在开发一个简单的虚拟机管理程序,当我想重新启动支持多处理器的 x86 Windows 7 来宾时遇到了一个小问题。操作系统的主要步骤似乎是:任务切换 - 任务切换 - 三重故障。这发生在所有 CPU 上,除了一个根本不启动任务切换并挂在某处的 CPU。我从中得到的最后一个出口是一个 EAX = 1 的 CPUID,所以我真的不知道(还)在哪里或为什么它不能像所有其他人一样执行任务切换。我有点难以理解这一点 - 也许一些关于通常应该发生的事情的细节会对我有所帮助。

x86 Windows 7 用于重新启动的实际方法是什么?

编辑我几天前就知道了,但我没有时间更新帖子。我不会回答我自己的问题,因为我认为这不是一个完整而明确的答案,但对于可能有同样问题的人来说,这会让事情变得容易一些。

原来,丢失的 CPU 已停止。流程或多或少是这样的:任务切换、三重故障(对于 n-1 个 CPU)和停止(对于第 n 个 CPU)。在此之后,每个人都应该有一个 init,然后一切都会被重置。

1个回答

根据 IDA 中的一些快速分析,请参阅下面我的发现,但请持保留态度。在执行计划重新启动时,可能还有其他情况会导致 Windows 7 通过其他机制重新启动。也许这个网站上的其他人可以用他们的专业知识做出贡献......

在最低级别,Windows 调用hal!HalReturnToFirmware(),它调用hal!HalpReboot()这在 ReactOS 中有很好的记录

在 Windows 7 和 ReactOS 中,实际导致重启的最终指令是有效的:

mov al, 0xFE
out 0x64, al

这会将系统重置命令写入键盘控制器的 IO 端口。