1

我正在开发 Windows 下的过滤器驱动程序。该驱动程序支持 PnP 以接收设备通知,它还创建一个控制设备以通过 IOCTL 与随附的用户模式服务进行通信。

据我了解,驱动程序的生命周期由 PnP 管理器控制。在处理下一个设备通知后,驱动程序将被卸载,因为此时驱动程序没有设备对象。

我需要做的是按需停止驱动程序,而不是在下一个设备到达/离开时停止。到目前为止,我认为这不是它应该工作的方式,另一方面,我没有看到任何禁止按需卸载过滤器驱动程序的逻辑。我研究了发送 STOP 控制,但我看不出如何在 PnP 驱动程序中处理它(仅适用于旧版驱动程序)。

现在我正在考虑添加特殊的 IOCTL 处理程序,这将关闭所有设备对象。但这还不够,司机的生命周期由 PnP 经理管理,所以我需要以某种方式“引起经理的注意”到我的司机身上。任何帮助表示赞赏!

如果您想知道,我需要驱动程序可以停止,以便卸载不需要重新启动。

4

1 回答 1

0

WDM过滤器驱动程序总是将自己的设备附加到设备堆栈。在此之后,其他一些设备可以将自己附加到此堆栈 - 因此它将附加到您的设备。在这个驱动程序已经无法卸载之后。

仅当不再引用驱动程序时才能卸载驱动程序DRIVER_OBJECT ,为此您需要从设备堆栈中分离并销毁所有DEVICE_OBJECTs. WDM 过滤器驱动程序只有一种正确的方法可以做到这一点 - 当您处理时IRP_MN_REMOVE_DEVICE- 阅读在过滤器驱动程序中删除设备或作为替代您可以在驱动程序中注册FAST_IO_DISPATCH-FastIoDetachDevice结果FastIoDetachDevice将在IoDeleteDevice您附加到的 DeviceObject 调用时调用(此也在IRP_MN_REMOVE_DEVICE处理过程中)。此时您需要调用IoDetachDevice并且IoDeleteDevice- 只有在此之后您的驱动程序才能被卸载并且 PnP-manager 自动执行此操作,如果没有更多的 DeviceObjects 或其他对您的驱动程序的引用。

所以只有一个卸载 WDM 驱动程序的选项 - 完全销毁设备堆栈- 并非所有堆栈都可以在运行时停止。CM_Request_Device_Eject但是如果设备是可移动的,有些人可以通过调用准备一个本地设备实例以安全删除。如果设备可以物理弹出,它会。

于 2017-01-11T11:05:02.890 回答