使用IO_REMOVE_LOCK删除锁(一)

来源:互联网 发布:深圳乐易网络年终奖 编辑:程序博客网 时间:2024/06/06 06:10
    删除锁例程提供了追踪一个设备上未解决的IO操作的数目,决定安全卸载驱动设备对象时机的方法。
    驱动可以以以下两个目的使用删除锁:
          1.保持删除锁,令驱动的DispatchPNP例程不能完成IRP_MN_REMOVE_DEVICE。
          2.获取驱动不能删除设备对象的原因数量,并在此数量变为0时,设置事件
    使用方法:
          1. 在设备对象的Device_Extension中分配IO_REMOVE_LOCK结构成员,并调用IoInitializeRemoveLock.

          一般在AddDevice例程中初始化Device_Extension调用IoInitializeRemoveLock.

          2.在每次开始I/O操作前调用 IoAcquireRemoveLock,结束I/O操作后调用IoReleaseRemoveLock,驱动
          可以多次获取IO_REMOVE_LOCK,调用IoAcquireRemoveLock增加使用计数,调用IoReleaseRemoveLock减少使用计数。

          3.当处理一个设备删除请求 (IRP_MN_REMOVE_DEVICE) 时,驱动程序调用 IoReleaseRemoveLockAndWait              

          来释放在其 DispatchPnP 例程中获取的删除锁。这个调用直到与删除锁关联的引用计数达到零时才返回,

          表示删除锁的所有其他持有者都已经被释放。为了完成排队的I/O操作,应在向下层设备递IRP_MN_REMOV E_DEVICE前调用IoReleaseRemoveLockAndWait。
          4.由于IO_REMOVE_LOCK在Device_Extension,在处理IRP_MN_REMOVE_DEVICE时删除Device_Extension 的同
          时,就删除了IO_REMOVE_LOCK。
    相关函数:IoInitializeRemoveLock 
              IoAcquireRemoveLock 
              IoReleaseRemoveLock 
              IoReleaseRemoveLockAndWait