阅读:3510回复:6
求助ATTEMPTED_SWITCH_FROM_DPC的问题
大家好,我在做一个磁盘控制器的驱动,现在的问题是对磁盘操作一段时间后发生BUGCHECK 0XB8:ATTEMPTED_SWITCH_FROM_DPC,
我跟踪下来,发生的情形是这样: 当前一个IRP正在处理,进入DMA传输,等待中断,在等待时又有两个读写IRP先后进来,此时中断发生,在ISR和DPCFORISR进行处理, DPCFORISR最后调用IoStartNextPacket,然后进入StartIo,安排DMA传输,但从执行DMA的函数出来后就发生ATTEMPTED_SWITCH_FROM_DPC错误。 我检查了DPCFORISR的代码,并没有调用KeWaitForSingleObject等函数。 请教各位会是什么原因引起的? |
|
沙发#
发布于:2005-06-20 22:52
你在处理IRP时候,提高一下IRQL看看
|
|
|
板凳#
发布于:2005-06-21 09:05
这种错误可能是在 DPC 或 StartIo 等处于 Dispatch_Level 的例程中) 调用了 KeWaitForSingleObject 或 KeDelayExecutionThread。
|
|
|
地板#
发布于:2005-06-21 10:33
下面是引用seaquester于2005-06-21 09:05发表的: 我在网上查了下,ATTEMPTED_SWITCH_FROM_DPC会因为KeWaitForSingleObject而发生, 难道KeDelayExecutionThread也会引发? 我在DPC里是有调用KeDelayExecutionThread, 但如果对硬件的操作需要等待一个延时的话, 应该调用什么延时函数呢? |
|
地下室#
发布于:2005-06-21 12:48
KeDelayExecutionThread会使thread进入一个wait状态,在dpc不能这样做。
没有仔细的看DDK? 时间不长的话,试KeStallExecutionProcessor |
|
5楼#
发布于:2005-06-21 17:20
下面是引用arthurtu于2005-06-21 12:48发表的: 感谢arthurtu和seaquester两位大牛,请问新论坛怎么给分啊? |
|
6楼#
发布于:2005-06-22 10:03
使用KeStallExecutionProcessor不是很好,这个函数会让CPU停下来
|
|
|