我正在写一个 WDM 驱动程序。它不操作任何物理设备,它是一种过滤驱动程序。我想跳过所有不相关的细节。简而言之,问题是这样的:
现在,我在例程中创建了一个设备对象 + 符号链接 ( IoCreateDevice
+ IoCreateSymbolicLink
) DriverEntry
,以与用户模式组件进行通信。
我的目标是能够在需要时创建和删除设备对象。这样多个用户模式组件可以与驱动程序通信,而对于每个组件,我将有一个单独的上下文(与此设备对象相关联)。我考虑IoDeleteDevice
在需要时创建和删除设备对象(通过)。但我在这里闻到了比赛条件。
这到底是如何与我的调度程序同步的?我的意思是,在删除设备时,我实际上可以为它处理一个 IRP(由用户模式启动)。
我发现这篇文章描述了(至少我理解的是)这种确切的情况。
这是解决此问题的预期方法吗?
编辑:到目前为止,上述文章无法解决我的问题。它说我的驱动程序应该IoAcquireRemoveLock
在启动 I/O 时调用。然而我的问题是不同的。I/O 代表用户模式 -> I/O 管理器启动。所以在我到达调度程序之前我不会谈论这个。
我将以不同的方式重新表述这个问题:是否IoDeleteDevice
立即删除设备 + 扩展程序?或者它检查设备是否仍在使用中?如果是这样 - 我应该在调用之前或之后执行扩展的清理IoDeleteDevice
,还是应该等待IRP_MJ_whatever
设备引用计数最终为零的意思?
提前致谢。