dpc与线程切换

文章详细解析了Windows系统中Ctrl+Alt+Delete键组合如何触发winlogon桌面的过程,涉及中断服务例程(ISR)、DPC(延迟过程调用)以及csrss进程的作用。重点讨论了为何在特定情况下,尽管键盘信号能触发蓝屏,但无法呼出桌面,因为线程切换在DPC级别被阻塞,导致系统卡死。
摘要由CSDN通过智能技术生成

中断服务例程 延迟过程调用 线程切换 键盘信号传输

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值