如何在Windows中调试内核驱动程序崩溃?

时间:2011-01-13 07:25:19

标签: windows crash kernel kernel-mode

我编写了一个内核驱动程序,它挂钩进程并隐藏文件夹。这个驱动程序运行良好,直到我连接外部硬盘。

此时,我的操作系统(Windows XP或Server 2003)因蓝屏死机(BSOD)而崩溃。

导致此次崩溃的原因是什么,以及如何修改我的驱动程序来解决它?

3 个答案:

答案 0 :(得分:1)

一般来说会有两种方式:

  1. 验尸调试。这通常是当您没有可用于重现崩溃的本地计算机时执行的操作。在这种情况下,您正在检查crashdump文件(完整或小型转储)。
  2. 实时调试。在这种情况下,如果您知道系统将崩溃,则准备一台计算机使用WinDbg控制此计算机并通过串行或FireWire电缆连接。后者要快得多。
  3. 但是,我同意你提供的细节太少了。你“勾”?好吧,怎么样? SSDT卡挂?或者您使用正确的方式编写过滤器驱动程序?如果是过滤器驱动程序,哪个型号?迷你过滤器或传统过滤器?

    我刚刚注意到你勾选“NtOpenProcess和NtQueryDirectoryFile”的评论,所以听起来像SSDT挂钩。 你在实施中究竟做了什么?我知道很多驱动程序做不正确的SSDT挂钩。它从用于获取钩子的方法开始,通常不会以大胆的实现结束。

    请注意,对于实时调试,WinDbg提供了一些很好的功能,可以在启动时传输和加载最新的驱动程序版本。因此,您无需额外准备即可调试最新版本。远程端的内核调试器和机器上的WinDbg将负责处理它。

    此外,您可能希望将问题发布到OSR(即NTDEV)的列表中。

答案 1 :(得分:1)

在开发内核驱动程序时,通常需要在虚拟机中测试它们,并使用内核调试器连接(主机是调试器,VM是调试对象)。某些虚拟机环境为调试提供了直接支持。

当然,您需要在各种物理和虚拟硬件上进行调试。

答案 2 :(得分:0)

您几乎没有公布BSOD的技术细节或代码如何工作,因此无法提供具体答案。作为一般起点,我建议你分析一下minidump以获得一些触发BSOD的错误细节。这是一个很好的入门指南。

http://forums.majorgeeks.com/showthread.php?p=1418737