最迫切要解决的是定位直接触发崩溃的驱动、调用行及上下文:先配置符号路径并重载,再执行!analyze -v,紧盯FAILURE_BUCKET_ID、IMAGE_NAME和FAULTING_MODULE三行,结合lm、!lmi和kb+ln命令交叉验证驱动归属与栈帧责任。

当你在Win11的WinDbg中打开一个蓝屏转储(.dmp)文件后,最迫切要解决的问题就是:哪一行调用、哪个驱动、在什么上下文里直接触发了崩溃?!analyze -v不是万能钥匙,但它输出的第一段「FAILURE_BUCKET_ID」和紧随其后的「IMAGE_NAME」就是答案的起点——只要你知道往哪里盯。
先确认当前环境是否就绪
打开WinDbg(建议用x64版本,除非明确是32位系统或32位驱动问题),用File → Open Crash Dump加载.dmp文件。若左下角状态栏显示“Not a valid dump file”或“Symbols not loaded”,说明符号未就绪,【此时敲!analyze -v只会输出一堆问号和UNKNOWN_MODULE】,必须先配置符号路径。
执行命令:.sympath srv*C:\Symbols*https://msdl.microsoft.com/download/symbols → .reload /f。等待几秒,看到“Loading symbols for…”完成,再看lm命令是否列出大量带函数名的模块(如ntoskrnl.exe、dxgkrnl.sys)。没这一步,后面所有分析都是空中楼阁。
执行!analyze -v并锁定关键三行
直接输入!analyze -v,回车。输出通常几百行,但你只需盯住前三屏里的三处:
① 第一个高亮块里找FAILURE_BUCKET_ID: 后面那一串,例如 DRIVER_POWER_STATE_FAILURE_0x9F_3_ntoskrnl.exe!unknown。这个ID本身已包含错误类型(0x9F)、子状态(3)、主模块(ntoskrnl.exe)和疑似行为(unknown),它就是微软知识库匹配的唯一指纹。
② 往下滚动约20行,找到IMAGE_NAME: 开头的行,例如 IMAGE_NAME: myfilter.sys。这是真正出问题的驱动文件名,不是ntoskrnl也不是win32k,就是它。注意:有些崩溃会显示多个IMAGE_NAME,优先看排在第一个、且不在Windows签名白名单里的那个。
③ 再往下找MODULE_NAME: 和FAULTING_MODULE: 两行。MODULE_NAME通常是IMAGE_NAME去掉扩展名,而FAULTING_MODULE会给出该模块加载基址+偏移,例如 FAULTING_MODULE: fffff807`2a1b0000 + 12345。这个地址可用于后续dt或ln反查结构体或函数名,但首次定位时只须确认它与IMAGE_NAME一致即可。
快速验证驱动归属与签名状态
方法一:用lm命令过滤查看该驱动详情。输入 lm m myfilter,若返回结果中包含“no symbols”或“deferred”,说明PDB缺失,但至少能确认它是否被加载、起始地址、大小、时间戳。
方法二:用!lmi命令深挖。输入 !lmi myfilter,重点关注“Image path:”、“Company Name:”、“Product Name:”、“Verified Signer:”。如果“Verified Signer:”显示“None”或“Unrecognized”,基本可断定是第三方/测试签名/自签名驱动;若显示“Microsoft Windows”或“Microsoft Corporation”,则需进一步排查是否被其他驱动污染或调用栈异常。
方法三:用!dh快速看导出表。输入 !dh myfilter -f,观察“time date stamp”是否异常新(比如2026年刚编译)或异常老(比如2012年),结合公司名判断是否为过期补丁或野鸡驱动。这一步操作起来很简单,直接把输出往上翻两屏就能扫完。
顺着调用栈回溯到第一处非系统调用
执行 kb(或kn 20)命令,输出线程调用栈。从上往下读,跳过所有ntoskrnl.exe、hal.dll、win32k.sys开头的帧,找到第一个出现myfilter.sys或你识别出的IMAGE_NAME的栈帧。记下那一行的地址,例如:fffff807`2a1b1234 myfilter!DriverEntry+0x12c。
然后执行 ln fffff807`2a1b1234,它会告诉你这个地址具体落在myfilter.sys的哪个函数、偏移多少。如果符号完整,你会看到类似“myfilter!IoCompletionRoutine+0x45”的结果;如果显示“*** ERROR: Module load completed but symbols could not be loaded for myfilter.sys”,那就得靠逆向或联系驱动厂商了——但至少你已经锁定了目标文件。
这一步不能跳过:很多文章教人只看!analyze -v就下结论,结果发现崩溃实际是上层驱动调用了myfilter的一个不安全接口,而myfilter本身只是受害者。kb+ln组合才是让责任落地的关键动作。


















