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


Обработка событий изменения интерфейса устройства

Когда драйвер или компонент пользовательского режима включает или отключает экземпляр интерфейса устройства, диспетчер 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 . Сохранение дескриптора файла будет наложено вето на процесс удаления и приведет к отмене упорядоченного удаления.