У устройств один интерфейс, тип и протокол устройства четко прописываются в главном дескрипторе. Microsoft делает поддержку этих устройств в винде, все вроде как работает нормально.
Потом появляются USB модемы, USB-RS232 конверторы. Не знаю зачем, но USB-IF вместо того, чтобы использовать один интерфейс (как у mass-storage, скажем) использует несколько. Один контрольный и несколько интерфейсов данных. По факту, я не припомню ни одного устройства которое бы использовало "несколько" интерфейсов данных - везде один master, другой slave. Microsoft пилит драйвер и все пока работает...
Но, внезапно, устройства становятся сложнее. Появляются композитные all-in-one. Microsoft делает первый костыль - промежуточный драйвер, который, если определяет несколько интерфейсов раскидывает их как отдельные устройства.
В итоге виртуальный ком-порт раскидывается на два разных устройства. Microsoft выпускает к костылю подпорку - если коммуникационный класс устройства, то оно не рассыпается.
А что же делать если в композитном устройстве, скажем, ком-порт и HID для моргания светодиодами? А ничего, такое устройство работать не будет в windows. Костыль теперь делает уже USB-IF (я не удивлюсь, если наши голубые друзья постарались). Костыль называется ЙАД - interface association descriptor. Суть его связать группы интерфейсов в сущности. По факту - только для того, чтобы ком-порт работал и только для windows - в linux все определялось без костылей по функциональным CDC дескрипторами.
Все вроде как хорошо. Но растут скорости. Уже есть идеи сделать сетевые и wi-fi карты как usb донглы. USB-IF ваят аж три стандарта: ECM, EEM, NCM. Но ни один из них не прижился массово до сих пор. А почему? А потому что Microsoft посылает USB-IF и пишет свой стандарт - RNDIS.
В качестве базы берется абстрактный модем, для которого в windows всегда был драйвер, но который именно поэтому всегда требовал дополнительного .inf файла и никогда не определялся. В дескриптор вкостыливается условие - если у модема протокол FF - vendor defined, значит это не модем, а сетевая карта.
Какой там треш и угар внутри стоит отдельного изложения. Пакеты заворачиваются в отдельные обертки. Склеиваются, режутся. Даже в стандартизированном контрольном интерфейсе Microsoft сделала свой уровень абстракции, в три раза увеличив количество необходимых пакетов и задействовав interrupt endpoint. Открытого и полного описания стандарта нет - фирменный стиль. Они даже не смогли сделать нормальное версионирование, не то что описание - везде версия 1.0, отличающаяся только датами. От 2002 по 2015.
Думаете это все? Нет, это было только начало. Наступил 2015 год. Вышла windows 10. Microsoft, наконец, научилась определять виртуальные ком-порты из коробки. Все хорошо? Ага. Только теперь все сетевые карты превратились в... ком порты. Вставляешь usb-ethernet и оппа - ком порт. Потому что Microsoft перестала поддерживать свой же костыль с vendor-defined protocol.
А чтобы это хоть как-то работало, эти пидорасы (думаю, после всего вышеописанного их нельзя называть иначе) придумали "Microsoft USB IF extension standart" и "Microsoft OS descriptors". Поздравляю господа эмбеддеры, привалило геморроя.
https://msdn.microsoft.com/ru-ru/windows/hardware/gg463179.aspx
Да, старые железки от "Independent Hardware Vendors" без перепрошивки можно заставить работать лишь явно выбирая нужный драйвер.