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


Общие сведения об идентификаторах контейнеров

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

Термин узла устройства (devnode) относится к стеку драйверов для такой функциональной конечной точки, помимо свойств, описывающих конечную точку и связанное с ним состояние. Например, многофункциональное устройство, поддерживающее функции принтера, сканера и факса, может иметь несколько devnodes, по одному для каждой функциональной конечной точки на устройстве.

До Windows 7 каждая функциональная конечная точка имела devnode, связанную с ней. Компоненты платформы Windows и сторонние приложения могут запрашивать devnodes для получения состояния устройства и информации, а также взаимодействовать с оборудованием устройства через интерфейсы, которые предоставляют функциональные конечные точки.

Для устройства с одной функцией один devnode содержит все сведения, относящиеся к функциональной конечной точке устройства. Аналогичным образом многофункциональное устройство имеет несколько devnodes, связанных с каждой функциональной конечной точкой устройства. Однако Windows не может распознать, что группа devnodes возникла с того же физического устройства. Каждый devnode, принадлежащий одному и тому же многофункционированному устройству, не включает в себя какие-либо идентификационные сведения, позволяющие диспетчеру Plug and Play (PnP) группировать несколько devnodes как одно устройство. Таким образом, невозможно иметь целостное представление об устройстве и функциях, которые предоставляет одно физическое устройство.

Начиная с Windows 7 операционная система использует новый идентификатор (идентификатор контейнера) для группировки одного или нескольких devnodes, исходящих из каждого экземпляра конкретного физического устройства. Идентификатор контейнера является свойством каждого devnode и указывается через глобально уникальное значение идентификатора (GUID).

Каждый экземпляр физического устройства, установленного на компьютере, имеет уникальный идентификатор контейнера. Все devnodes, представляющие функцию в этом экземпляре физического устройства, имеют одинаковый идентификатор контейнера. На следующем рисунке показан пример этой связи.

схема, демонстрирующая идентификаторы контейнера для devnodes мультифункционного устройства.

Существует один идентификатор контейнера с особым значением для водителей автобусов: NULL_GUID который определяется как: {00000000-0000-0000-0000-000000000000}

Как правило, не возвращайте NULL_GUID в качестве случая по умолчанию при создании отчетов об идентификаторе контейнера. Вместо этого не обрабатывайте IRP_MN_QUERY_ID для случая BusQueryContainerIDs и позволить PnP применить свою стандартную логику.

При возврате NULL_GUID в качестве идентификатора контейнера драйвер шины объявляет PnP, что устройство не должно быть частью любого контейнера, поэтому возврат NULL_GUID подходит только в очень особых случаях. Например, devnode , например устройство тома, может охватывать несколько дисков в нескольких контейнерах, но не принадлежать к любому контейнеру. Такое устройство будет иметь DEVPKEY_Device_BaseContainerId равно NULL_GUID, и у него не будет DEVPKEY_Device_ContainerId вообще.

За исключением очень особых случаев, драйвер шины никогда не должен возвращать NULL_GUID при опросе аппаратного устройства, и драйверы шины должны защищаться от неисправного оборудования, которое сообщает значение NULL_GUID из шины. В таких случаях водитель шины должен считать это ошибкой устройства или рассматривать так, как если бы устройство не сообщило значение.