Обработка событий изменения интерфейса устройства
Когда драйвер или компонент пользовательского режима включает или отключает экземпляр интерфейса устройства, диспетчер PnP вызывает все подпрограммы обратного вызова уведомлений, зарегистрированные для событий EventCategoryDeviceInterfaceChange в классе интерфейса устройства. Чтобы указать причину уведомления, диспетчер PnP задает элементу Event параметра NotificationStructure подпрограммы обратного вызова значение GUID_DEVICE_INTERFACE_ARRIVAL или GUID_DEVICE_INTERFACE_REMOVAL.
При обработке события GUID_DEVICE_INTERFACE_ARRIVAL подпрограмма обратного вызова уведомлений должна:
Выполнение определенных драйвером задач для обработки нового интерфейса.
Как правило, подпрограмма обратного вызова уведомлений напрямую открывает устройство в контексте обратного вызова. Однако если открытие устройства может вызвать последующие события PnP (например, перечисление дочерних устройств), подпрограмма обратного вызова должна ставить в очередь рабочую подпрограмму, чтобы открыть устройство; в противном случае может возникнуть взаимоблокировка.
Подпрограмма обратного вызова может включить собственный интерфейс в ответ на доступность нового интерфейса.
При обработке события GUID_DEVICE_INTERFACE_REMOVAL подпрограмма обратного вызова уведомлений должна:
- Отмените все операции, выполняемые при включении интерфейса. Закройте все дескрипторы файлов, которые были открыты в ответ на событие поступления интерфейса.
Помимо EventCategoryDeviceInterfaceChange, драйвер также должен зарегистрироваться для EventCategoryTargetDeviceChange и закрыть дескриптор файла из обратного вызова события GUID_TARGET_DEVICE_QUERY_REMOVE . Сохранение дескриптора файла будет наложено вето на процесс удаления и приведет к отмене упорядоченного удаления.