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 расширяет строку идентификатора устройства ребенка, добавив сведения о родительском устройстве, чтобы сделать идентификатор уникальным на компьютере.