如何根据需要停止即插即用过滤器驱动程序?

时间:2017-01-11 10:05:26

标签: windows winapi driver wdf plug-and-play

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

据我所知,驱动程序的生命周期由PnP-manager控制。在处理下一个设备通知后卸载驱动程序,因为到那时驱动程序不拥有任何设备对象。

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

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

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

1 个答案:

答案 0 :(得分:0)

WDM过滤器驱动程序始终将自己的设备连接到设备堆栈。在此之后,另一个设备可以将自己附加到此堆栈 - 因此它将附加到您的设备。此驱动程序已经无法卸载。

只有在没有对DRIVER_OBJECT的更多引用时才能卸载

驱动程序 为此,您需要从设备堆栈中分离并销毁所有DEVICE_OBJECTs。 WDM过滤器驱动程序只有一种正确的方法可以执行此操作 - 当您处理IRP_MN_REMOVE_DEVICE时 - 阅读Removing a Device in a Filter Driver或作为替代方案,您可以在驱动程序中注册FAST_IO_DISPATCH FastIoDetachDevice - 作为结果{{对于您附加的DeviceObject将调用IoDeleteDevice时将调用1}}(这也是在IRP_MN_REMOVE_DEVICE过程中)。此时您需要调用IoDetachDeviceIoDeleteDevice - 只有在此之后才能卸载驱动程序,如果没有更多的DeviceObjects或其他对驱动程序的引用,PnP-manager auto会执行此操作。

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