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。

你可能感兴趣的:(timer,IO,callback,extension,Signal)