System-Wide identificadores de dispositivo únicos
Un controlador para un adaptador de audio típico debe ser fácilmente capaz de admitir varias instancias de la misma tarjeta de adaptador de audio en un sistema. Casi todas las estructuras de datos que mantiene un controlador se almacenan en el búfer device-extension (consulte la descripción del campo DeviceExtension de la estructura DEVICE_OBJECT). Sin embargo, si varias instancias de un controlador comparten datos globales, esas instancias deben sincronizar su acceso a estos datos.
Un requisito adicional es que cada subdispositivo de una instancia determinada de una tarjeta de adaptador debe tener una cadena device-ID que identifique de forma única el subdispositivo en todas las instancias de la misma tarjeta de adaptador del sistema.
La manera más sencilla de lograr esto es exponer cada subdispositivo en la tarjeta del adaptador como un dispositivo lógicamente distinto al administrador de Plug and Play. Esto se presenta como opción (1) en dispositivos de audio multifunción.
Un segundo enfoque es usar el controlador de bus multifunción suministrado por el sistema para administrar los subdispositivos en la tarjeta del adaptador. El controlador de bus MF asigna a cada subdispositivo un identificador de dispositivo que se garantiza que sea único en todo el sistema, incluso si el sistema contiene varias instancias de la misma tarjeta de adaptador. El controlador de bus MF admite diseños en los que los subdispositivos comparten un conjunto común de registros de configuración, pero cada subdispositivo tiene su propio conjunto de registros de direcciones base PCI. Los subdispositivos no deben tener dependencias ocultas entre sí y deben poder funcionar simultáneamente sin interferir entre sí ni con otros dispositivos del sistema. Esta es la opción (2) en dispositivos de audio multifunción.
Un tercer enfoque consiste en usar un controlador de autobús propietario para administrar los subdispositivos en una tarjeta de adaptador. Esto suele ser necesario si los subdispositivos tienen dependencias mutuas que se deben administrar de forma centralizada. Estas dependencias pueden producirse de dos maneras:
Los subdispositivos pueden compartir algún recurso de tarjeta. Por ejemplo, si los subdispositivos comparten un procesador de señal digital (DSP), es posible que el controlador de bus necesite descargar el sistema operativo propietario que se ejecuta en el DSP antes de iniciar el primer subdevice.
Un error de diseño puede provocar una dependencia entre subdispositivos. Por ejemplo, un error de diseño podría requerir que los subdispositivos estén encendidos o inactivos en una secuencia determinada.
Cuando existe cualquier tipo de dependencia, un controlador de autobús propietario es casi siempre una solución mejor que presentar los subdispositivos directamente al administrador de Plug and Play e intentar ocultar la dependencia.
Si proporciona su propio controlador de autobús para una tarjeta de adaptador, debe asegurarse de que los identificadores de dispositivo que asigne el controlador de autobús sean únicos en todo el sistema.
Un controlador de bus proporciona un identificador de dispositivo para uno de sus elementos secundarios en respuesta a una consulta de IRP_MN_QUERY_ID del administrador de Plug and Play. El identificador se puede especificar de dos maneras, que el controlador de bus indica en su respuesta a una consulta de IRP_MN_QUERY_CAPABILITIES estableciendo el campo UniqueID de la estructura de DEVICE_CAPABILITIES en TRUE o FALSE:
Uniqueid = VERDAD
Esto significa que se garantiza que el nombre del elemento secundario sea único en todo el sistema. La cadena de identificador de dispositivo contiene un identificador de dispositivo más un identificador de instancia, que es un número de serie que identifica de forma única la instancia de hardware.
Uniqueid = FALSO
Esto significa que el nombre del elemento secundario solo es único con respecto al elemento primario. La mayoría de los dispositivos usan este medio de identificación. En este caso, el administrador de Plug and Play extiende la cadena device-ID que recibe para que sea única a través del sistema. La cadena extendida es una función del identificador único del dispositivo primario.
Todos los controladores de autobús de audio deben establecer UniqueID = FALSE para sus hijos. Esto hace que el administrador de Plug and Play extienda la cadena de identificador de dispositivo secundario agregando información sobre el elemento primario del dispositivo para que el identificador sea único en el equipo.