在Windows驱动程序中正确删除(虚拟)设备

时间:2012-12-03 22:46:17

标签: windows kernel driver

我正在写一个WDM驱动程序。它不运行任何物理设备,它是一种过滤驱动程序。我想跳过所有不相关的细节。简而言之,问题是:

现在我在IoCreateDevice例程中创建一个设备对象+符号链接(IoCreateSymbolicLink + DriverEntry),以便与用户模式组件进行通信。

我的目标是能够在需要时创建和删除设备对象。因此,多个用户模式组件可以与驱动程序通信,而对于每个用户模式组件,我将具有单独的上下文(与此设备对象相关联)。我想到了在需要时创建和删除设备对象(通过IoDeleteDevice)。但我闻到了这里的竞争状况。

这与我的调度程序如何同步?我的意思是,当删除设备时,我实际上可以为它处理IRP(由用户模式启动)。

我发现this article描述了(至少我理解的)这种确切的情况。

这是解决这个问题的预期方法吗?

编辑:到目前为止,上述文章无法解决我的问题。它说我的驱动程序应该在启动I / O时调用IoAcquireRemoveLock。然而,我的问题是不同的。 I / O代表用户模式启动 - > I / O经理。因此,在我到达调度程序之前,我不会这样做。

我会以不同的方式重新解释这个问题:IoDeleteDevice是否会立即删除设备+扩展程序?或者它会检查设备是否仍在使用中?如果是这样 - 我应该在调用IoDeleteDevice之前或之后执行扩展的清理,或者我应该等待IRP_MJ_whatever意味着设备引用计数最终为零?

提前致谢。

0 个答案:

没有答案