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