Remove Lock

Remove lock函数用来跟踪一个设备未完成的IO操作,以及判断何时能够安全的卸载和删除驱动的设备对象。系统为驱动开发者提供这个功能省得我们自己去实现。

驱动使用remove lock有两个目的:
1. 保证上了锁时驱动的DispatchPnp不能完成IRP_MN_REMOVE_DEVICE。(比如另一个驱动例程正在访问这个设备)
2. 统计驱动不能删除其设备对象原因计数,当计数为0后设置一事件。

为了初始化remove lock,驱动必须在它的device extension中分配一个IO_REMOVE_LOCK结构,然后调用IoInitializeRemoveLock。驱动通常在它的 AddDevice例程中完成其他device extension的初始化后调用IoInitializeRemoveLock。

你的驱动必须在每次启动一个IO操作时调用IoAcquireRemoveLock,并且在完成一个IO操作后调用IoReleaseRemoveLock。驱动可以多次获取一个remove lock。Remove lock例程维护了未完成的获取锁定计数。每次调用IoAcquireRemoveLock将递增此计数,IoReleaseRemoveLock将递减此计数。

你的驱动必须在分发引用其代码处(比如timer、DPC、callback等等)调用IoAcquireRemoveLock。然后驱动在event被signal是调用IoReleaseRemoveLock。

在 IRP_MN_REMOVE_DEVICE分发代码中,驱动必须再次获取remove lock,然后调用IoReleaseRemoveLockAndWait。这个函数直到所有未完成的锁都释放后才返回。为了允许排队IO操作的完成,每个驱动必须在它将IRP_MN_REMOVE_DEVICE请求传给底层驱动、以及在它释放内存、调用IoDetachDevice、或者调用 IoDeleteDevice之前调用IoReleaseRemoveLockAndWait。当IoReleaseRemoveLockAndWait 调用后,后面再调用IoAcquireRemoveLock都将失败。

因为驱动将IO_REMOVE_LOCK保存在device extension中,所以驱动在IRP_MN_REMOVE_DEVICE请求中删除device extension时将删除该remove lock。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值