处理 GUID_TARGET_DEVICE_QUERY_REMOVE 事件

在 PnP 管理器将 IRP_MN_QUERY_REMOVE_DEVICE IRP 发送到设备的驱动程序之前,它会调用在设备上为 EventCategoryTargetDeviceChange 注册的任何通知回调例程。 PnP 管理器指定 NotificationStructure。GUID_TARGET_DEVICE_QUERY_REMOVE事件

为了响应此类通知,回调例程确定是否可以在不中断系统的情况下删除设备。

如果不应删除设备,则回调例程将返回STATUS_UNSUCCESSFUL。 为了响应此状态,PnP 管理器会中止查询删除处理,并且不会删除设备。

如果可以删除设备,则回调例程应执行任何适当的操作来准备删除设备,例如关闭设备上打开的任何句柄, (尽可能) 。 如果句柄在设备上保持打开状态,则 PnP 管理器无法删除设备,并且 PnP 管理器会中止查询删除处理。

成功处理GUID_TARGET_DEVICE_QUERY_REMOVE事件时,通知回调例程应:

  • 关闭设备的任何打开句柄。

  • 如果驱动程序对文件对象具有未完成的引用,请取消引用文件对象。

  • 为将来的 EventCategoryTargetDeviceChange 通知保持注册状态。 这一点很重要,因为可能会取消即将发生的删除操作。

关闭设备的句柄不会取消驱动程序注册 PnP 目标设备更改通知。 PnP 管理器仍然可以调用驱动程序的通知回调例程,但在此类调用中, NotificationStructure 中的文件对象无效。