首页
社区
课程
招聘
未解决 [求助] Windows 内核 关于 IRQL DISPATCH_LEVEL 的疑问
发表于: 2019-10-28 19:15 4560

未解决 [求助] Windows 内核 关于 IRQL DISPATCH_LEVEL 的疑问

2019-10-28 19:15
4560

如何理解 DISPATCH_LEVEL ?

网上一些文献和资料对于 DISPATCH_LEVEL 都有一些类似的描述。
下图是 《Windows 内核原理与实现》节选

红色选中部分: 当前IRQL为 DISPATCH_LEVEL 时不能调用 KeWaitForSingleObjec 函数。对于这个描述,我自己写了代码做了验证,现象与书中的描述也不尽相同。
下面是我的测试代码和输出结果:

首先将当前IRQL提升到DISPATCH_LEVEL,然后等待2秒,最后还原IRQL.
下面是输出结果:

测试代码写在一个驱动的派遣函数中,函数结束后一切正常,没有出现系统奔溃或者蓝屏。


我也查阅了 《Windows Internals》(第7版) 中对于 DISPATCH_LEVEL 的描述:

翻译一下第二段:

他对于为什么 "处于 DISPATCH_LEVEL 时不能调用等待函数" 的解释更加抽象了,我不确定是不是翻译的原因。

已经被这个问题困扰了许久,还请看雪的各位大神不吝赐教。

1. 如何理解  "处于 DISPATCH_LEVEL 时不能进行线程切换" ?
2. Windows 是如何实现 高IRQL屏蔽低IRQL中断请求的?
主要是第一个问题,网上很多资料都有类似的解释,但是又解释的很浅显很抽象。
再次谢谢看雪的大神。


[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 6
活跃值: (3260)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不是必蓝,但容易出鬼。 而且高IRQL线程一旦KeWaitForSingleObjec 后,系统调度可能失常,导致CPU莫名其妙的高。  同样,高IRQL如果执行但一半被切换了,可能会死锁,可以把DISPATCH_LEVEL中运行的代码理解为完整性代码(类似于原子操作)
最后于 2019-10-28 20:46 被咖啡_741298编辑 ,原因:
2019-10-28 20:44
0
雪    币: 181
活跃值: (131)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
咖啡_741298 不是必蓝,但容易出鬼。 而且高IRQL线程一旦KeWaitForSingleObjec 后,系统调度可能失常,导致CPU莫名其妙的高。 & ...
你说的 可以把DISPATCH_LEVEL中运行的代码理解为完整性代码(类似于原子操作),这一点比较好理解,线程运行的时候会有时钟中断,如果当前线程时间片到期,会发送一个 DISPATCH_LEVEL 的软中断,在这个中断处理函数中进行线程切换,但是 DISPATCH_LEVEL 级别的线程不会响应这个中断,所以就不会被动切换到其他线程,不知道我这么理解对不对。
2019-10-30 14:55
0
雪    币: 3700
活跃值: (3817)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
APIC了解一下?
2019-10-30 15:10
0
雪    币: 181
活跃值: (131)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
fengyunabc APIC了解一下?
大佬,可否指条明路。稍微细说一下就行。谢谢大佬。
这个APIC和windows的 IRQL 有什么联系。
最后于 2019-10-30 17:04 被Private丶编辑 ,原因:
2019-10-30 17:03
0
游客
登录 | 注册 方可回帖
返回
//