Перечисление установленных интерфейсов устройств
Не следует перечислять интерфейсы устройств в системе путем прямого доступа к разделам реестра. Как и в случае с любым разделом реестра, расположение, имя или формат ключа могут измениться между разными версиями Windows.
Используйте следующие рекомендации для безопасного перечисления интерфейсов устройств.
Приложения в пользовательском режиме должны выполнять следующие действия.
Использование функций диспетчера конфигурации :
Используйте CM_Get_Device_Interface_List для получения списка интерфейсов устройств в указанном InterfaceClassGuid. При необходимости можно ограничить список только интерфейсами устройств, предоставляемыми определенным устройством, задав параметр pDeviceID определенным идентификатором экземпляра устройства.
Чтобы включить только интерфейсы устройств, которые присутствуют (включено) в системе, задайте флаг CM_GET_DEVICE_INTERFACE_LIST_PRESENT в параметре ulFlags.
Использование функций SetupApi:
Используйте SetupDiGetClassDevs или SetupDiGetClassDevsEx с флагом DIGCF_DEVICEINTERFACE, установленным в параметре Flags, чтобы получить интерфейсы устройств для указанного класса интерфейсов устройств. При необходимости можно ограничить список только интерфейсами устройств, предоставляемыми определенным устройством, задав параметру перечислитель определенного экземпляра устройства.
Чтобы включить только интерфейсы устройств, которые присутствуют (включено) в системе, задайте флаг DIGCF_PRESENT в параметре Flags.
Используйте SetupDiEnumDeviceInterfaces для перечисления интерфейсов, возвращаемых приведенными выше вызовами.
Драйверы в режиме ядра должны использовать IoGetDeviceInterfaces для получения списка интерфейсов устройств в указанном InterfaceClassGuid. При необходимости можно ограничить список только интерфейсами устройств, предоставляемыми определенным устройством, задав параметр PhysicalDeviceObject.