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


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

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

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