Наборы сведений об устройстве

В пользовательском режиме управление устройствами, принадлежащими к классам настройки устройства или классам интерфейса устройства , осуществляется с помощью элементов сведений об устройстве и наборов сведений об устройстве. Набор сведений об устройстве состоит из элементов сведений об устройстве для всех устройств, принадлежащих к определенному классу настройки устройства или классу интерфейса устройства.

Каждый элемент сведений об устройстве содержит дескриптор devnode устройства и указатель на связанный список всех интерфейсов устройства, связанных с устройством, описанным в этом элементе. Если набор сведений об устройстве описывает члены класса установки, элемент может не указывать на какие-либо интерфейсы устройств, так как члены класса установки не обязательно связаны с интерфейсом.

На следующей схеме показана внутренняя структура набора сведений об устройстве.

схема, иллюстрирующая набор сведений об устройстве.

Создание набора сведений об устройствах

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

Перечисление сведений об устройстве

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

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

SetupDiEnumDeviceInterfaces возвращает структуру SP_DEVICE_INTERFACE_DATA . SP_DEVICE_INTERFACE_DATA содержит GUID класса интерфейса и другие сведения об интерфейсе, включая зарезервированное поле с закодированными данными, которые можно использовать для получения имени интерфейса. Чтобы получить имя интерфейса, необходимо вызвать SetupDiGetDeviceInterfaceDetail . SetupDiGetDeviceInterfaceDetail возвращает структуру типа SP_DEVICE_INTERFACE_DETAIL_DATA , содержащую путь в дереве системных объектов, определяющем интерфейс.