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

Любой драйвер физического, логического или виртуального устройства, которому код пользовательского режима может направлять запросы ввода-вывода, должен указывать имя для своих клиентов пользовательского режима. Используя имя, приложение в пользовательском режиме (или другой системный компонент) определяет устройство, с которого запрашивается ввод-вывод.

В Windows NT 4.0 и более ранних версиях операционной системы на основе NT драйверы именовали свои объекты устройств, а затем настраивали символические ссылки в реестре между этими именами и видимым пользователем логическим именем Win32.

Начиная с Windows 2000 драйверы не называют объекты устройств. Вместо этого они используют интерфейсы устройств , которые группируются по классам интерфейсов устройств. Класс интерфейса устройства — это способ экспорта функциональных возможностей устройств и драйверов в другие системные компоненты, включая другие драйверы, а также приложения в пользовательском режиме. Драйвер может зарегистрировать и включить экземпляр интерфейса устройствакласса интерфейса устройства для каждого объекта устройства, в который могут отправляться запросы ввода-вывода в пользовательском режиме. Каждый класс интерфейса устройства должен представлять концептуальную функциональность, которую любой интерфейс устройства в этом классе должен поддерживать или представлять, например, определенный контракт ввода-вывода.

Каждый класс интерфейса устройства связан с GUID. Система определяет идентификаторы GUID для общих классов интерфейса устройства в файлах заголовков, относящихся к конкретному устройству. Поставщики могут создавать дополнительные классы интерфейса устройства.

Например, три различных типа устройств с мышью могут регистрировать интерфейсы устройств , которые являются членами одного класса интерфейса устройства, даже если один из них подключается через USB-порт, второй — через последовательный порт, а третий — через инфракрасный порт. Каждый драйвер регистрирует свое устройство в качестве члена класса интерфейса GUID_DEVINTERFACE_MOUSE. Этот GUID определен в файле заголовка Ntddmou.h.

Драйверы могут регистрировать и включать интерфейсы устройств для устройства, которыми они управляют, для множества классов интерфейсов устройств , которые поддерживаются устройством и драйвером. Например, драйвер для диска, который можно подключить, должен зарегистрировать как класс интерфейса диска (GUID_DEVINTERFACE_DISK), так и класс подключаемого устройства (MOUNTDEV_MOUNTED_DEVICE_GUID).

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

Не путайте интерфейсы устройств с интерфейсами, которые драйверы могут экспортировать в ответ на запрос IRP_MN_QUERY_INTERFACE . Этот IRP используется для передачи стандартных точек входа между драйверами режима ядра.