中断服务例程 延迟过程调用 线程切换 键盘信号传输
1. 背景
我一般用ctrl+alt+del能否呼出winlogon桌面作为Windows卡死(hang)还是个别程序卡死的鉴别手段。因为一则用户态的程序没办法干扰这个呼出流程,二则如果不能呼出任务管理器来终止进程或者呼出windbg等工具进行观察调试的话,其实排查的方法也跟windows卡死是一致的——触发scrolllock蓝屏。所以探究ctrl+alt+del呼出winlogon桌面的流程,就是分析这类卡死的第一步。
同样是按键后的反应,为什么在ctrl+alt+del不能呼出的场景下,scrolllock蓝屏还能够触发,也是一个获取关键知识的方向。
2. 键盘信号从按下到应用程序的窗口
大致分为中断服务例程,DPC, csrss,具体应用程序这四个阶段。
2.1 中断服务例程(ISR)
2.1.1 什么是中断服务例程
诸如按下键盘按下或处理器时钟产生的这类设备中断,Windows设置了对应函数(中断服务例程)来处理。Windows在启动的早期阶段先设置好中断号码和ISR的对应关系。当设备中断触发时,Windows先把当前线程的当前状态保存起来,然后用这个线程去执行对应的ISR。执行完毕后再从保存数据恢复那个线程。
2.1.2 查看PS2键盘信号对应的中断服务例程
直接用windbg的!idt查找对应关系
0: kd> .reload;!idt
Dumping IDT: fffff8033ea8e000
00: fffff8033c351100 nt!KiDivideErrorFaultShadow
01: fffff8033c351180 nt!KiDebugTrapOrFaultShadow Stack = 0xFFFFF8033EA929D0
02: fffff8033c351200 nt!KiNmiInterruptShadow Stack = 0xFFFFF8033EA927D0
03: fffff8033c351280 nt!KiBreakpointTrapShadow
……
90: fffff8033c352700 i8042prt!I8042KeyboardInterruptService (KINTERRUPT ffffbb007e792a00)
……
上文的90对应的函数i8042prt!I8042KeyboardInterruptService就是90中断号对应的ISR。给这个函数下断点,
C |