阅读:1422回复:5
zwsettimerex中调用zwdeletevaluekey的问题
zwsettimerex中的回调函数调用zwdeletevaluekey,过一段时间会蓝屏。错误码是ATTEMPTED_SWITCH_FROM_DPC (b8)
为何呢。跟irql有关还是在zwdeletevaluekey内部有waitobject类似的函数? |
|
|
沙发#
发布于:2007-04-06 20:43
搞个标志不就好了
|
|
|
板凳#
发布于:2007-04-06 22:12
能说清楚些么,老大
|
|
|
地板#
发布于:2007-04-09 23:27
Windows NT 驱动程序开发人员提示——应注意避免的事项 中的第6条
6. 一定不要在 IRQL >= DISPATCH_LEVEL 上等候核心调度程序对象出现非零间隔。 这是一个致命错误。 |
|
|
地下室#
发布于:2007-04-09 23:29
在programing wdm书中:
DDK文档中明确指出支持例程的IRQL限定。例如,KeWaitForSingleObject例程有两个限定: 调用者必须运行在低于或等于DISPATCH_LEVEL级上。 如果调用中指定了非0的超时,那么调用者必须严格地运行在低于DISPATCH_LEVEL的IRQL上。 上面这两行想要说明的是:如果KeWaitForSingleObject真的被阻塞了指定长的时间(你指定的非0超时),那么你必定运行在低于DISPATCH_LEVEL的IRQL上,因为只有在这样的IRQL上线程阻塞才是允许的。如果你所做的一切就是为了检测事件是否进入信号态,则可以执行在DISPATCH_LEVEL级上。但你不能在ISR或其它运行在高于DISPATCH_LEVEL级上的例程中调用KeWaitForSingleObject例程。 |
|
|
5楼#
发布于:2007-04-09 23:46
执行在高于或等于DISPATCH_LEVEL级上的代码不能阻塞线程。
|
|
|