Сравнение классов установки и классов интерфейса

Понимание различий между классами установки устройств и классами интерфейса устройств имеет решающее значение для успешной разработки драйверов Windows и управления устройствами. Хотя эти классы могут показаться похожими, они служат принципиально разными целями в экосистеме устройств Windows. Классы установки определяют, как операционная система устанавливает и настраивает устройства. Классы интерфейса обеспечивают взаимодействие во время выполнения и функциональные возможности между драйверами, приложениями и устройствами. Понимание этого различия помогает выбрать правильный тип класса для установки устройства, реализовать правильные уведомления об устройстве и избежать распространенных ошибок разработки.

Устройство часто принадлежит классу настройки и предоставляет несколько интерфейсов устройств в разных классах интерфейса одновременно. Тем не менее, два типа классов служат разным целям и не являются взаимозаменяемыми.

Схема, показывающая связь между устройством, классом установки и различными классами интерфейса.

Comparison

В следующей таблице приведены основные различия и связи между классами установки и классами интерфейса.

Аспект Классы настройки Классы интерфейса
Основное назначение Группирование устройств со схожими параметрами установки и конфигурации Группирование интерфейсов устройств, которые обеспечивают аналогичные функциональные возможности и обмен данными
Использование Используется системой Windows при установке устройства Используется драйверами и приложениями для взаимодействия с устройством
Определения GUID Обычно определяется в Devguid.h Определяется в файлах заголовков для конкретного устройства (например, Ntddmou.h, Ntddpar.h)
Критерии группирования Устройства, установленные и настроенные аналогичным образом Как правило, интерфейсы устройств, реализующие определенный контракт ввода-вывода
Уведомление Не используется для уведомлений о прибытии или отключении устройства Используется для регистрации уведомлений о подключении и отключении интерфейса устройства
Examples Датчики, встроенное ПО, Bluetooth Аудиозапись, вывод звука, датчик внешнего света
Связь Устройство принадлежит одному классу настройки Устройство может предоставлять ноль или больше интерфейсов устройств в разных классах интерфейса
Продолжительность жизни Актуально при установке Актуально во время работы устройства

Важно различать два типа классов устройств: классы интерфейса устройства и классы установки устройств. Их легко перепутать. В коде пользовательского режима оба класса используют один набор функций установки устройств. Они также используют тот же набор структур данных (наборы информации об устройстве).

Один и тот же класс настройки, разные классы интерфейсов:

  • Устройства: два разных сенсорных устройства
  • Класс настройки: оба устройства находятся в классе Датчики.
  • Классы интерфейса: один датчик предоставляет интерфейс устройства датчика окружающего освещения, а другой предоставляет интерфейс устройства акселерометра.

Рассмотрим USB-устройство мыши и USB-устройство клавиатуры. Оба используют один и тот же класс интерфейса (Human Interface Device). Но они относятся к разным классам установки, Мышь и Клавиатура, соответственно.

Один и тот же класс интерфейса, разные классы настройки:

  • Устройства: USB-мышь и USB-клавиатура
  • Класс интерфейса: оба устройства используют один и тот же класс интерфейса (устройство взаимодействия с пользователем) для взаимодействия с системой.
  • Классы установки: устройство мыши принадлежит классу установки Mouse, а устройство клавиатуры принадлежит классу установки Keyboard.

Классы установки устройства

Классы установки устройств — это стандартные категории, используемые исключительно для установки и настройки устройств в Windows. Они помогают операционной системе понять, как управлять устройством во время установки. Классы установки предоставляют механизм группировки устройств, установленных и настроенных таким же образом. Дополнительные сведения о классах установки см. в разделе Системные классы установки устройств, доступные поставщикам.

Классы установки устройств Windows определяются в системном файле Devguid.h. Этот файл определяет ряд идентификаторов GUID для классов установки. Однако классы установки устройства, представленные в Devguid.h, не следует путать с классами интерфейсов устройств. Файл Devguid.h содержит только идентификаторы GUID для классов установки.

Классы интерфейса устройства

Классы интерфейса устройства предоставляют механизм группировки интерфейсов устройств в соответствии с общими характеристиками или функциональными возможностями. Драйверы и пользовательские приложения могут зарегистрироваться для получения уведомлений об интерфейсах устройств в определенном классе интерфейса. Это означает, что они получают уведомления, когда любой интерфейс устройства, принадлежащий этому классу, включен (появляется) или отключен (удаляется). Им не нужно отслеживать отдельные устройства. Классы интерфейсов устройств — это группы интерфейсов, предоставляемых устройствами. Вы регистрируете уведомления о подключении и удалении интерфейсов устройств.

Определения классов интерфейса не предоставляются в одном файле. Класс интерфейса устройства всегда определяется в файле заголовка, который принадлежит исключительно определенному классу устройств. Например, Ntddmou.h содержит определение GUID_DEVINTERFACE_MOUSE, GUID, представляющий класс интерфейса мыши. Ntddpar.h определяет GUID класса интерфейса для параллельных устройств. Ntddpcm.h определяет guid класса стандартного интерфейса для устройств PCMCIA. Ntddstor.h определяет GUID класса интерфейса для устройств хранения.

Чтобы зарегистрировать уведомления интерфейса устройства, используйте идентификаторы GUID, найденные в файлах заголовков, относящихся к классу интерфейса устройства. Эти идентификаторы GUID позволяют получать уведомления при появлении экземпляра интерфейса устройства. Если драйвер регистрирует уведомление с помощью GUID класса установки вместо GUID класса интерфейса, он не уведомляется при появлении интерфейса.

При определении нового класса интерфейса не используйте один GUID для идентификации класса установки и класса интерфейса.