SEH无法捕获Windows内核崩溃(如BSOD),因其发生在Ring 0内核态,用户态SEH链已失效;__try/__except和SetUnhandledExceptionFilter均只处理可投递至用户态的异常,对蓝屏完全无效。

SEH 不能捕获 Windows 内核崩溃(如 BSOD)产生的异常——这类异常根本不会到达用户态,更不会触发 __try/__except。所谓“捕获内核崩溃”,是常见误解。
为什么 __try/__except 对蓝屏完全无效
Windows 蓝屏(BSOD)发生在内核模式,由 KiDispatchException 或硬件中断直接触发,此时 CPU 已切换至 Ring 0,当前进程的用户态 SEH 链早已被清空或不可达。SEH 是用户态结构化异常处理机制,仅响应 STATUS_ACCESS_VIOLATION、STATUS_INTEGER_DIVIDE_BY_ZERO 等可投递到用户态的异常。
- 内核崩溃时,整个系统已失去调度能力,用户进程可能被强制终止,甚至没机会执行任何代码
-
SetUnhandledExceptionFilter也收不到 BSOD 相关通知——它只接收进程内未被__except捕获的用户态异常 - 驱动中用
try/except(内核 SEH)能处理部分 IRP 处理异常,但和“捕获蓝屏”不是一回事
真正能做的:监控崩溃前兆与事后分析
如果你的目标是“感知系统即将崩溃或刚崩溃”,唯一可行路径是绕过 SEH,转为被动观察:
Windows 桌面自动化技能,支持鼠标控制(移动/点击/拖拽/滚轮/截图)、键盘输入(文字输入/按键/组合键)、窗口管理(查找/聚焦/最大化/最小化/关闭/移动)、截图并发送文件。提供两种截图方式:Python pyautogui 截图(集成在自动化流程中)和 PowerShell + .NET 零依赖截图(支持区域截图和多显示器)。当用户需要自动化 Windows 桌面操作、控制鼠标键盘、管理窗口、执行 GUI 自动化任务、截图发送文件时使用。
- 监听 Windows 事件日志中的
System日志源,过滤Event ID 41(意外关机)、Event ID 1001(Windows Error Reporting 崩溃记录) - 定期轮询
\?GLOBALROOTdeviceharddiskvolume1windowsminidump*.dmp,检查新生成的 minidump 文件(需管理员权限 + 正确符号路径) - 用
WMI查询Win32_NtLogEvent或订阅__InstanceCreationEvent(针对Win32_BIOS等间接指标不推荐,可靠性低) - 在服务中调用
RegisterApplicationRestart实现崩溃后自动拉起,但无法获取崩溃上下文
容易被误用的“伪捕获”方案及风险
网上流传的 hook KeBugCheckEx、注入内核 patch、或用 DbgBreakPoint 拦截等做法,在现代 Windows(尤其是启用 HVCI / Credential Guard 的系统)上基本失效,且会导致:
- 驱动签名强制失败,无法加载(
STATUS_INVALID_IMAGE_HASH) - 触发
CRITICAL_STRUCTURE_CORRUPTION或ATTEMPTED_WRITE_TO_READONLY_MEMORY等二次崩溃 - 被 Windows Defender / HVCI 直接终止进程或蓝屏(
SECURITY_SYSTEM_ERROR) - 即便在测试环境跑通,也无法通过 WHQL 认证,生产环境禁用
想从用户程序侧关联内核崩溃,唯一稳定路径是把 minidump 解析 + 事件日志 + 时间戳对齐做实。别碰 __try,它真不管蓝屏的事。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










