阅读:3079回复:7
关于系统队列和STARTIO例程
我在驱动里利用设备的系统队列来处理各种IRP:
1)我利用IoMarkIrpPending(Irp),来把IRP插入系统队列 2)然后用IoStartPacket(...)来把IRP从系统队列中取出调用StartIo例程对该IRP进行处理。 3)我在调用了IoMarkIrpPending(Irp)后,立马调用IoStartPacket(..),而且就是调用了一次IoMarkirpPending,也就是保证只有一个Irp进入系统队列。 ------------------------------------------------------- 问题:我利用DbgPrint函数分别在IoMarkIrpPending(Irp)和StartIo入口对Irp的地址进行输出,发现两个地方的IRP地址不相同。 请问高手,这是什么原因?两个IRP就不是不一样吗? ---------------------------------------------------- |
|
最新喜欢:flyfox |
沙发#
发布于:2002-05-08 11:39
你能保证你调用IoMarkIrpPending(IRP)时,系统IRP队列里没有未处理或自在处理的IRP吗?
如果有的话,两次输出的IRP值当然可能不同。 |
|
|
板凳#
发布于:2002-05-08 12:07
看看walter oney是怎么说的
注意,一旦我们调用了IoStartPacket函数,就不要再碰IRP。因为在该函数返回之前,IRP可能已经被完成并且其占用的内存可能被释放,而我们拥有的该IRP的指针也许是无效的。 |
|
|
地板#
发布于:2002-05-08 13:45
你能保证你调用IoMarkIrpPending(IRP)时,系统IRP队列里没有未处理或自在处理的IRP吗? 请问什么情况下会有自处理的IRP?
我在IoStartPacket后没有碰它,我是在IoMarkIrpPending(Irp);后输出Irp的地址,和在StartIo入口输出参数c传过来的Irp地址。 |
|
地下室#
发布于:2009-01-25 18:38
IOSTARTPACKET本来就有入队列的代码,从系统队列中取出IRP的是IOSTARTNEXTPACKET,看看这两个函数的概要代码吧
|
|
5楼#
发布于:2009-02-02 13:37
如果设备不忙的话,就直接把你想要入队列的IRP给完成了,反之,则设备在处理其他的IRP,则把你想要入队列的IRP入队列呗
|
|
6楼#
发布于:2010-02-24 16:57
startio就是一个先进先出的数据结构,你把IRP装如这个队列里时,这个IRP还在排队呢。如何队列是空的话,你的startio执行的IRP就和你装入的IRP是一样的。
二楼正解. |
|
7楼#
发布于:2010-02-24 17:14
发现是2002年的帖子。我晕。楼主牛人了呼?
|
|