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