System-Wide IDs exclusivas do dispositivo
Um driver para um adaptador de áudio típico deve ser facilmente capaz de dar suporte a várias instâncias do mesmo adaptador de áudio cartão em um sistema. Quase todas as estruturas de dados que um driver mantém são armazenadas no buffer de extensão de dispositivo (consulte a descrição do campo DeviceExtension da estrutura DEVICE_OBJECT). No entanto, se várias instâncias de um driver compartilharem dados globais, essas instâncias deverão sincronizar seu acesso a esses dados.
Um requisito adicional é que cada subdispositivo em uma instância específica de um adaptador cartão deve ter uma cadeia de caracteres de ID do dispositivo que identifique exclusivamente o subdispositivo em todas as instâncias do mesmo adaptador cartão no sistema.
A maneira mais simples de fazer isso é expor cada subdispositivo no adaptador cartão como um dispositivo logicamente distinto para o gerenciador de Plug and Play. Isso é apresentado como opção (1) em Dispositivos de Áudio Multifuncionais.
Uma segunda abordagem é usar o driver de barramento multifuncional fornecido pelo sistema para gerenciar os subdispositivos no adaptador cartão. O driver de barramento MF atribui a cada subdispositivo uma ID do dispositivo que tem a garantia de ser exclusiva em todo o sistema, mesmo que o sistema contenha várias instâncias do mesmo adaptador cartão. O driver de barramento MF acomoda designs nos quais os subdispositivos compartilham um conjunto comum de registros de configuração, mas cada subdispositivo tem seu próprio conjunto de registros de endereço base PCI. Os subdispositivos não devem ter dependências ocultas uns dos outros e devem ser capazes de operar simultaneamente sem interferir uns com os outros ou com outros dispositivos no sistema. Essa é a opção (2) em Dispositivos de Áudio Multifuncionais.
Uma terceira abordagem é usar um motorista de ônibus proprietário para gerenciar os subdispositivos em um adaptador cartão. Isso é frequentemente necessário se os subdispositivos tiverem dependências mútuas que devem ser gerenciadas centralmente. Essas dependências podem ocorrer de algumas maneiras:
Os subdispositivos podem compartilhar algum recurso cartão. Por exemplo, se os subdispositivos compartilharem um DSP (processador de sinal digital), o driver de barramento poderá precisar baixar o sistema operacional proprietário que é executado no DSP antes de iniciar o primeiro subdispositivo.
Uma falha de design pode causar uma dependência entre os subdispositivos. Por exemplo, uma falha de design pode exigir que os subdispositivos sejam ligados ou desligados em uma sequência específica.
Quando qualquer tipo de dependência existe, um driver de barramento proprietário é quase sempre uma solução melhor do que apresentar os subdispositivos diretamente ao gerenciador de Plug and Play e tentar ocultar a dependência.
Se você fornecer seu próprio driver de ônibus para um adaptador cartão, verifique se as IDs do dispositivo atribuídas pelo motorista de ônibus são exclusivas em todo o sistema.
Um motorista de ônibus fornece uma ID de dispositivo para um de seus filhos em resposta a uma consulta IRP_MN_QUERY_ID do gerente de Plug and Play. A ID pode ser especificada de duas maneiras, que o motorista do barramento indica em sua resposta a uma consulta IRP_MN_QUERY_CAPABILITIES definindo o campo UniqueID da estrutura DEVICE_CAPABILITIES como TRUE ou FALSE:
Uniqueid = VERDADE
Isso significa que o nome do filho tem a garantia de ser exclusivo em todo o sistema. A cadeia de caracteres de ID do dispositivo contém uma ID do dispositivo mais uma ID de instância, que é um número de série que identifica exclusivamente a instância de hardware.
Uniqueid = FALSE
Isso significa que o nome do filho é exclusivo apenas em relação ao pai. A maioria dos dispositivos usa esse meio de identificação. Nesse caso, o gerenciador de Plug and Play estende a cadeia de caracteres de ID do dispositivo que recebe para torná-la exclusiva por meio do sistema. A cadeia de caracteres estendida é uma função da ID exclusiva do dispositivo pai.
Todos os drivers de barramento de áudio devem definir UniqueID = FALSE para seus filhos. Isso faz com que o gerenciador de Plug and Play estenda a cadeia de caracteres de ID do dispositivo filho adicionando informações sobre o pai do dispositivo para tornar a ID exclusiva no computador.