System-Wide уникальных идентификаторов устройств
Драйвер для типичного аудиоадаптера должен легко поддерживать несколько экземпляров одного и того же звукового адаптера карта в системе. Почти все структуры данных, которые поддерживает драйвер, хранятся в буфере расширения устройства (см. описание поля DeviceExtensionструктуры DEVICE_OBJECT). Однако если несколько экземпляров драйвера совместно используют какие-либо глобальные данные, эти экземпляры должны синхронизировать свой доступ к этим данным.
Еще одним дополнительным требованием является то, что каждый вложенный объект на определенном экземпляре адаптера карта должен иметь строку идентификатора устройства, которая однозначно идентифицирует вложенный объект во всех экземплярах одного адаптера карта в системе.
Самый простой способ сделать это — предоставить каждому подчиненному устройству карта адаптера в качестве логического отдельного устройства диспетчеру Plug and Play. Этот параметр представлен как вариант (1) в разделе Многофункциональные звуковые устройства.
Второй подход заключается в использовании системного драйвера многофункциональной шины для управления подустройствами на адаптере карта. Драйвер шины MF назначает каждому подчиненному устройству идентификатор устройства, который гарантированно будет уникальным в системе, даже если система содержит несколько экземпляров одного адаптера карта. Драйвер шины MF вмещает конструкции, в которых дочерние службы совместно используют общий набор регистров конфигурации, но у каждого подчиненного устройства есть собственный набор регистров базовых адресов PCI. Вложенные службы не должны иметь скрытых зависимостей друг от друга и должны иметь возможность работать параллельно, не мешая друг другу или другим устройствам в системе. Это параметр (2) в многофункциональных звуковых устройствах.
Третий подход — использовать собственный драйвер шины для управления вложенными устройствами на адаптере карта. Это часто необходимо, если вложенные службы имеют взаимные зависимости, которыми необходимо управлять централизованно. Такие зависимости могут возникать несколькими способами:
Вложенные службы могут совместно использовать некоторые ресурсы карта. Например, если дочерние службы совместно используют цифровой обработчик сигналов (DSP), драйверу шины может потребоваться скачать собственную операционную систему, которая выполняется в DSP, перед запуском первого подчиненного устройства.
Из-за недостатка проектирования может возникнуть зависимость между подустройствами. Например, из-за недостатка в проектировании может потребоваться, чтобы в определенной последовательности подзарядки были выключены.
Если существует любой из типов зависимостей, проприетарный драйвер шины почти всегда является лучшим решением, чем представление вложенных зависимостей непосредственно руководителю Plug and Play и попытка скрыть зависимость.
Если вы предоставляете собственный драйвер шины для адаптера карта, следует убедиться, что идентификаторы устройств, назначенные водителем автобуса, являются уникальными в системе.
Водитель автобуса предоставляет идентификатор устройства для одного из дочерних элементов в ответ на запрос IRP_MN_QUERY_ID от диспетчера Plug and Play. Идентификатор можно указать одним из двух способов, который водитель шины указывает в ответе на запрос IRP_MN_QUERY_CAPABILITIES, задав для поля UniqueID структуры DEVICE_CAPABILITIES значение TRUE или FALSE:
Uniqueid = ИСТИННЫЙ
Это означает, что имя дочернего элемента гарантированно будет уникальным во всей системе. Строка идентификатора устройства содержит идентификатор устройства и идентификатор экземпляра, который является серийным номером, уникальным образом идентифицирующий экземпляр оборудования.
Uniqueid = ЛОЖНЫХ
Это означает, что имя дочернего элемента уникально только по отношению к родительскому элементу. Большинство устройств используют это средство идентификации. В этом случае диспетчер Plug and Play расширяет полученную строку идентификатора устройства, чтобы сделать ее уникальной в системе. Расширенная строка — это функция уникального идентификатора родительского устройства.
Все водители аудиобусов должны устанавливать значение UniqueID = FALSE для своих детей. Это приводит к тому, что диспетчер Plug and Play расширяет строку идентификатора дочернего устройства, добавляя сведения о родительском устройстве, чтобы сделать идентификатор уникальным на компьютере.