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


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