IRP方式通知Win32

基于IRP方式的通知有一个重要的细节,一个设备句柄只能有一个IRP Pending,这是我实践中得出的结论,我并没有仔细深入研究,并且假设这个细节是正确的。即一旦对一个设备发出IRP,并且IRP没有完成,那么就无法再次发送IRP,调用线程将永久阻塞。这会引发一系列问题。


企图绕过阻塞的线程

无论同步操作时在IRP上阻塞,还是异步操作后在事件上阻塞,都是阻塞调用线程,线程无法再次发送IRP,那么创建另外一个线程是不是就可以了呢?答案是不可以!!

硬件出错

硬件是会出错的。假设一个IRP需要等一个异步的中断产生后最终调度DPC来完成,但硬件一直没有产生中断,那么IRP就一直Pending。所以这种情况一般需要对IRP的操作计时,超时后便返回失败。这个时间是需要自己把握的,原则是大于正常情况下IRP完成需要的时间,即正常情况下,IRP的操作是永远不会超时的。

分时双工

C:\WINDDK\3790\src\kernel\serial提供了一个方案。分时处理!任何读写操作都被分时,即无论如何读和写都会在不久的时间后返回。

你可能感兴趣的:(Win32)