Поделиться через


Обработка события 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 не является допустимым.