Motorola
驱动牛犊
驱动牛犊
  • 注册日期2002-12-31
  • 最后登录2010-10-04
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3640回复:1

关于IoCancelIrp的同步问题

楼主#
更多 发布于:2009-12-23 09:38
IoCancelIrp的具体实现为
1.得到Cancel自旋锁
2.Irp->Cancel=TRUE
3.以原子方式得到Irp->CancelRoutine的值c并设置Irp->CancelRoutine为NULL
4.如果c不为NULL则调用c,否则释放Cancel自旋锁并退出函数
现在有一个问题,当IoCancelIrp被调用后,但是实际执行第1步之前如果Irp已经被完成了这时Irp所指向的内存将不再有效,
则第2、3步会发生carsh
不知大家有何见解
jally76
驱动牛犊
驱动牛犊
  • 注册日期2005-04-28
  • 最后登录2010-11-23
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望590点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-02-25 10:20
当然要保证保证Irp的资源不能被释放。
IRP如果已经被完成,会有两种情况:1. 本驱动已经通过完成例程获知,那么就没有调用IoCancelIrp的必要。2. 本驱动还未获知,这时加Cancel自旋锁,有防止IRP资源释放的作用。
总之,只要IRP指针没有被滥用,应该不会发生crash。
游客

返回顶部