Winoows内核设计思想之IRP
+ -

删除锁IO_REMOVE_LOCK与STATUS_DELETE_PENDING

2023-02-03 52 0

删除锁IO_REMOVE_LOCK很少见,但很重要。
其结构体定义为:

typedef struct _IO_REMOVE_LOCK {
    IO_REMOVE_LOCK_COMMON_BLOCK Common;
#if DBG
    IO_REMOVE_LOCK_DBG_BLOCK Dbg;
#endif
} IO_REMOVE_LOCK, *PIO_REMOVE_LOCK

再分析:

typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
    BOOLEAN     Removed;
    BOOLEAN     Reserved [3];
    __volatile LONG        IoCount;
    KEVENT      RemoveEvent;

} IO_REMOVE_LOCK_COMMON_BLOCK;

typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
    LONG        Signature;
    ULONG       HighWatermark;
    LONGLONG    MaxLockedTicks;
    LONG        AllocateTag;
    LIST_ENTRY  LockList;
    KSPIN_LOCK  Spin;
    __volatile LONG        LowMemoryCount;
    ULONG       Reserved1[4];
    PVOID       Reserved2;
    PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
} IO_REMOVE_LOCK_DBG_BLOCK;

这里主要关注结构体IO_REMOVE_LOCK_COMMON_BLOCK,其有2个关键的变量IoCount和RemoveEvent。可以看到,一个是计数,另一个是事件。所以总结一下,删除锁IO_REMOVE_LOCK其实就是一个微软对事件和引用计数的一个封装。

删除锁IO_REMOVE_LOCK和普通自旋锁一样,需要初始化,使用的函数为IoInitializeRemoveLock,在正常使用其,其也有相应的获取自旋锁IoAcquireRemoveLock和释放自旋锁IoReleaseRemoveLock。不过这个锁相对于其它锁,有一个特别的函数IoReleaseRemoveLockAndWait,此函数通常在 IRP_MN_REMOVE_DEVICE中调用,当调用该函数之后会等待RemoveEvent的事件,如果返回则可以开始执行IoDetachDevice, or calls IoDeleteDevice。

另外,如果调用了IoReleaseRemoveLockAndWait这后,这时再调用IoAcquireRemoveLock,之后会返回STATUS_DELETE_PENDING,表示驱动程序已收到设备的IRP_MN_REMOVE_DEVICE,并已调用IoReleaseRemoveLockandWait。

删除锁IO_REMOVE_LOCK微软提供的示例包括

  • event示例 C:\WinDDK\7600.16385.1\src\general\event\wdm
  • filter示例 C:\WinDDK\7600.16385.1\src\general\toaster\wdm\filter

微软对其有权微解释可详见:https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/using-remove-locks

另外 IO_REMOVE_LOCK使用方法小结一文https://www.shuzhiduo.com/A/Vx5MxmWYJN/ 也有说明。这里把它提示的示例代码展示出来:

0 篇笔记 写笔记

删除锁IO_REMOVE_LOCK与STATUS_DELETE_PENDING
删除锁IO_REMOVE_LOCK很少见,但很重要。其结构体定义为:typedef struct _IO_REMOVE_LOCK { IO_REMOVE_LOCK_COMMON_BLOCK Common;#if DBG IO_REMOVE_LOCK_DBG_BLOCK Dbg;......
IO_REMOVE_LOCK使用方法小结
IO_REMOVE_LOCK(删除锁)的具体结构没有公开,WDK的文档中中查不到IO_REMOVE_LOCK。最开始看到IO_REMOVE_LOCK是在WDK的例子event中。下面是参考网上的一些资料之后的一点总结,错误的地方请指正。新增内容:WDK8.1 中是可以看到这个结构的,在wdm.h中。......
Windows系统USB驱动的断电异常处理STATUS_NO_SUCH_DEVICE
USB设备除非特殊需要,一般都是系统自带。所以我们根据不用开发相应的驱动,就算是我们要搞自定义的USB设备,微软也贴心的帮我们搞了一个WinUSB,只我们的的固件按照某定的要求,也可以实现自定义通讯。所以从上面的来看,没有什么特殊的地方要我们开发Windows系统的USB驱动。不过有的时候就是那么奇......
总线驱动IRP的中止AbortIrp
AbortIrp用于驱动即将卸载,但系统这时又下发了一个功能驱动过来。这时我们需要中止它,系统通过我们Abort它的状态也许不再下发功能IRP了。对于总线驱动,IRP一般分为三类:第一种是通用的功能IRP,如IRP_MJ_CLOSEIRP_MJ_CREATEIRP_MJ_DEVICE_CO......
STATUS_DELETE_PENDING
STATUS_DELETE_PENDING的官方解释为:A non-close operation has been requested of a file object that has a delete pending.这里指在进行文件操作时,出现了一种情况:请求对一个文件对象执行非关闭操作,......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!