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

В семействе операционных систем 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 значении из своей шины. В таких случаях водитель шины должен рассматривать эту ошибку как ошибку устройства или так, как если бы устройство не сообщалось о значении.