jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3079回复:7

关于系统队列和STARTIO例程

楼主#
更多 发布于:2002-05-08 11:31
我在驱动里利用设备的系统队列来处理各种IRP:
1)我利用IoMarkIrpPending(Irp),来把IRP插入系统队列
2)然后用IoStartPacket(...)来把IRP从系统队列中取出调用StartIo例程对该IRP进行处理。
3)我在调用了IoMarkIrpPending(Irp)后,立马调用IoStartPacket(..),而且就是调用了一次IoMarkirpPending,也就是保证只有一个Irp进入系统队列。
-------------------------------------------------------
问题:我利用DbgPrint函数分别在IoMarkIrpPending(Irp)和StartIo入口对Irp的地址进行输出,发现两个地方的IRP地址不相同。
请问高手,这是什么原因?两个IRP就不是不一样吗?
----------------------------------------------------

最新喜欢:

flyfoxflyfox
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-05-08 11:39
    你能保证你调用IoMarkIrpPending(IRP)时,系统IRP队列里没有未处理或自在处理的IRP吗?
    如果有的话,两次输出的IRP值当然可能不同。
Tom_lyd
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-08 12:07
看看walter oney是怎么说的

注意,一旦我们调用了IoStartPacket函数,就不要再碰IRP。因为在该函数返回之前,IRP可能已经被完成并且其占用的内存可能被释放,而我们拥有的该IRP的指针也许是无效的。

[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-05-08 13:45
 
你能保证你调用IoMarkIrpPending(IRP)时,系统IRP队列里没有未处理或自在处理的IRP吗?
如果有的话,两次输出的IRP值当然可能不同。

请问什么情况下会有自处理的IRP?

 

看看walter oney是怎么说的

注意,一旦我们调用了IoStartPacket函数,就不要再碰IRP。因为在该函数返回之前,IRP可能已经被完成并且其占用的内存可能被释放,而我们拥有的该IRP的指针也许是无效的

我在IoStartPacket后没有碰它,我是在IoMarkIrpPending(Irp);后输出Irp的地址,和在StartIo入口输出参数c传过来的Irp地址。
woo东去来袭
驱动牛犊
驱动牛犊
  • 注册日期2008-12-12
  • 最后登录2009-09-30
  • 粉丝0
  • 关注0
  • 积分41分
  • 威望341点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-01-25 18:38
IOSTARTPACKET本来就有入队列的代码,从系统队列中取出IRP的是IOSTARTNEXTPACKET,看看这两个函数的概要代码吧
woo东去来袭
驱动牛犊
驱动牛犊
  • 注册日期2008-12-12
  • 最后登录2009-09-30
  • 粉丝0
  • 关注0
  • 积分41分
  • 威望341点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2009-02-02 13:37
如果设备不忙的话,就直接把你想要入队列的IRP给完成了,反之,则设备在处理其他的IRP,则把你想要入队列的IRP入队列呗
爬栅栏的猪
驱动牛犊
驱动牛犊
  • 注册日期2010-01-14
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2010-02-24 16:57
startio就是一个先进先出的数据结构,你把IRP装如这个队列里时,这个IRP还在排队呢。如何队列是空的话,你的startio执行的IRP就和你装入的IRP是一样的。
 二楼正解.
爬栅栏的猪
驱动牛犊
驱动牛犊
  • 注册日期2010-01-14
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2010-02-24 17:14
发现是2002年的帖子。我晕。楼主牛人了呼?
游客

返回顶部