排查系统问题时,可能需要生成故障转储文件来分析系统状态。 可以使用特定的组合键直接从键盘强制系统崩溃。 当系统无响应或需要捕获诊断信息时,此功能非常有用。
本文介绍如何:
- 配置注册表设置以启用通过键盘触发的崩溃
- 使用键盘快捷方式触发系统崩溃
- 设置备用键盘快捷方式
此功能适用于 PS/2 键盘(Windows 2000 及更高版本)、USB 键盘(Windows Vista 及更高版本),以及 Hyper-V 键盘(Windows 10 版本 1903 及更高版本)。
注意
强制系统崩溃会立即停止系统,并可能导致数据丢失。 仅当需要进行调试时使用此功能,并确保保存工作。
配置
配置以下设置以使用键盘启用系统崩溃:
如果希望编写故障转储文件,则必须启用此类转储文件。 选择路径和文件名,然后选择转储文件的大小。 有关详细信息,请参阅启用内核模式转储文件。
对于 PS/2 键盘: 在注册表中启用键盘触发的崩溃:
- 导航到
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\i8042prt\Parameters - 创建名为
CrashOnCtrlScroll的值 - 将其设置为
REG_DWORD值0x01
- 导航到
对于 USB 键盘,你必须在注册表中启用键盘启动的崩溃。
- 在注册表项
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\kbdhid\Parameters中,创建名为 的值CrashOnCtrlScroll - 将其设置为等于
REG_DWORD0x01的值。
- 在注册表项
对于 Hyper-V 键盘,你必须在注册表中启用键盘启动的崩溃。
- 在注册表项
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\hyperkbd\Parameters中,创建名为 的值CrashOnCtrlScroll - 将其设置为等于
REG_DWORD0x01的值。
- 在注册表项
某些笔记本电脑将 PS/2 驱动程序用于内置键盘,并且还支持外部 HID 键盘。 对于这些系统,请考虑同时创建 USB 和 PS/2 注册表项以允许使用任一键盘。
你必须重新启动系统才能使这些设置生效。
重启完成后,可以使用以下热键序列启动键盘崩溃:按住最右侧的 Ctrl 键,然后按 Scroll Lock 键两次。
然后,系统会调用 KeBugCheck 并发出 错误检查:0xE2 MANUALLY_INITIATED_CRASH。 除非禁用崩溃转储,否则会写入崩溃转储文件。
如果崩溃的计算机上连接了内核调试器,那么在故障转储文件写入完成后,计算机将进入内核调试器模式。
定义备用键盘快捷方式以强制系统从键盘崩溃
你可以在以下注册表子项下面配置备用值,以便键盘快捷序列生成内存转储文件:
对于 PS/2 键盘:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\crashdump对于 USB 键盘:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\crashdump对于 Hyper-V 键盘:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\hyperkbd\crashdump
你必须在这些子项下面创建以下注册表 REG_DWORD 值:
Dump1Keys
此 Dump1Keys 注册表值是要使用的第一个热键的位映射。 例如,可以将第一个热键设置为最左侧的 SHIFT 键,而不是使用最右侧的 CTRL 键来启动热键序列。
下表描述了第一个热键的十六进制值。
| 值 | 键盘快捷序列中使用的第一个键 |
|---|---|
| 0x01 | 最右侧的 SHIFT 键 |
| 0x02 | 最右侧的 CTRL 键 |
| 0x04 | 最右侧的 ALT 键 |
| 0x10 | 最左侧的 SHIFT 键 |
| 0x20 | 最左侧的 CTRL 键 |
| 0x40 | 最左侧的 ALT 键 |
你可以给 Dump1Keys 分配一个值,该值启用一个或多个键作为键盘快捷序列中使用的第一个键。 例如,给 Dump1Keys 分配一个 0x11 值,以将最右侧和最左侧的 SHIFT 键都定义为键盘快捷序列中的第一个键。
Dump2Key
此 Dump2Key 注册表值是目标计算机的键盘布局扫描代码表中的索引。 请参阅驱动程序中的实际表:
const UCHAR keyToScanTbl[134] = {
0x00,0x29,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x0C,0x0D,0x7D,0x0E,0x0F,0x10,0x11,0x12,
0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x00,
0x3A,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,
0x27,0x28,0x2B,0x1C,0x2A,0x00,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x73,0x36,0x1D,0x00,
0x38,0x39,0xB8,0x00,0x9D,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xD2,0xD3,0x00,0x00,0xCB,
0xC7,0xCF,0x00,0xC8,0xD0,0xC9,0xD1,0x00,0x00,0xCD,
0x45,0x47,0x4B,0x4F,0x00,0xB5,0x48,0x4C,0x50,0x52,
0x37,0x49,0x4D,0x51,0x53,0x4A,0x4E,0x00,0x9C,0x00,
0x01,0x00,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,
0x43,0x44,0x57,0x58,0x00,0x46,0x00,0x00,0x00,0x00,
0x00,0x7B,0x79,0x70 };
索引 124 (sysreq) 是一种特殊情况,因为 84 键键盘具有不同的扫描代码。
如果定义备用键盘快捷方式以强制系统从 USB 或 PS/2 键盘崩溃,则必须将 CrashOnCtrlScroll 注册表值设置为 0,或者将其从注册表中删除。
Example
在此方案中,笔记本电脑使用 PS2 键盘驱动程序,并附加了外部 HID 键盘。 设置这两个值可提供从任一键盘触发手动系统崩溃的功能。 设置以下注册表项时,可以强制手动系统崩溃:按住最右侧的控制键并按空格键两次。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\crashdump]
"Dump1Keys"=dword:00000002
"Dump2Key"=dword:0000003d
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\crashdump]
"Dump1Keys"=dword:00000002
"Dump2Key"=dword:0000003d
限制
系统冻结致使键盘快捷序列不起作用是有可能发生的,但很少会出现这种情况。 使用快捷键组合引发崩溃即使在 Ctrl+Alt+DELETE 无法正常工作的许多情况下也有效。
如果计算机在高中断请求级别 (IRQL) 停止响应,则从键盘强制系统崩溃不起作用。 之所以存在此限制,是因为 Kbdhid.sys 驱动程序允许内存转储进程运行,其运行 IRQL 低于 i8042prt.sys 驱动程序。