我需要在不同的操作系统中检测由 BSOD 引起的重启。这样的情况可以追查吗?内存转储是否足够?Windows 7 显示一个漂亮的对话框,表明系统已从严重错误中恢复 - 它是如何知道的?
5 回答
Windows 提供了一个接口来注册错误检查的回调所以你可以注册一个函数来做一些特定于错误检查的事情 - 创建一个简单的文件或类似的东西,然后在这个其他操作系统中你可以检查这个文件是否存在 - 如果它那么您的错误检查回调是否已执行ergo。发生错误检查?当然,您需要考虑的是对您的函数的调用是在 HIGH_LEVEL 的 IRQL 上发出的,因此您必须查看适用的限制,这也是在 Windows 驱动程序开发领域。
在互联网上搜索似乎 Windows试图在C:/Windows/Minidump
. 您可以在那里查找文件。请注意,我说的是try,因为 BSOD 可能非常致命,以至于无法创建转储文件(例如,在硬盘驱动器崩溃期间,出于显而易见的原因)。
您可以在文件上查找创建日期以检测最新的文件。
这显然要求您可以在其他操作系统中挂载 Windows 文件系统,但这似乎是一个不错的解决方案。
默认情况下,当系统崩溃时,Windows 会在事件日志中记录一个事件。(见下面我的评论)。
您可以编写一个简单的 Windows 服务,将状态信息写入其他操作系统可以查找的位置。例如,这可能是 MBR 之后未使用的扇区之一、专用分区或 USB 记忆棒。
当服务启动时,您编写一条消息以指示 Windows 已启动并正在运行,可能带有时间戳。您可能会经常更新它,甚至可以包含状态信息,例如 CPU 负载或驱动程序加载/卸载事件(如果有用的话)。当服务检测到系统正在关闭时,它会写一条消息说明这一点。当您的其他操作系统查看此信息时,如果最后一条消息没有说系统是故意关闭的,那么您可以断定 Windows 崩溃了。Windows 做了类似的事情,以便引导加载程序可以提供以安全模式引导系统。
显然,这不允许您区分 BSOD 和其他类型的崩溃,如果系统断电,您会得到误报。如果它发生在系统关闭过程中,您也将无法检测到 BSOD。这些警告是否重要取决于您没有告诉我们的细节。
不是以正常方式,因为故障转储实际上是由执行 BSoD 的代码写入页面文件,然后在重新启动后,Windows 将其写入最终转储文件。