Dispositivo WinUSB
Neste artigo, você aprenderá como um dispositivo WinUSB é reconhecido pelo Windows.
As informações neste artigo se aplicam a você se você for um OEM ou um IHV (fornecedor independente de hardware) desenvolvendo um dispositivo para o qual você deseja usar Winusb.sys como o driver de função e deseja carregar o driver automaticamente sem precisar fornecer um INF personalizado.
O que é um dispositivo WinUSB
Um dispositivo WinUSB é um dispositivo USB (Barramento Serial Universal) cujo firmware define determinados descritores de recursos do sistema operacional (SO) da Microsoft que relatam a ID compatível como "WINUSB".
A finalidade de um dispositivo WinUSB é permitir que o Windows carregue Winusb.sys como o driver de função do dispositivo sem um arquivo INF personalizado. Para um dispositivo WinUSB, você não precisa distribuir arquivos INF para seu dispositivo, simplificando o processo de instalação do driver para os usuários finais. Por outro lado, se você precisar fornecer um INF personalizado, não deverá definir seu dispositivo como um dispositivo WinUSB e especificar a ID de hardware do dispositivo no INF.
A Microsoft fornece o Winusb.inf que contém informações necessárias para instalar Winusb.sys como o driver de dispositivo para um dispositivo USB.
Antes de Windows 8, para carregar Winusb.sys como o driver de função, você precisava fornecer um INF personalizado. O INF personalizado especifica a ID de hardware específica do dispositivo e também inclui seções do Winusb.inf in-box. Essas seções são necessárias para instanciar o serviço, copiar binários de caixa de entrada e registrar um GUID de interface do dispositivo necessário para localizar o dispositivo e conversar com ele. Para obter informações sobre como escrever um INF personalizado, consulte Instalação do WinUSB (Winusb.sys).
Em Windows 8, o arquivo Winusb.inf in-box foi atualizado para permitir que o Windows corresponda automaticamente ao INF com um dispositivo WinUSB.
Instalação do dispositivo WinUSB usando o Winusb.inf in-box
Em Windows 8, o arquivo Winusb.inf na caixa foi atualizado. O INF inclui uma seção de instalação que faz referência a uma ID compatível chamada "USB\MS_COMP_WINUSB".
[Generic.Section.NTamd64]
%USB\MS_COMP_WINUSB.DeviceDesc%=WINUSB,USB\MS_COMP_WINUSB
O INF atualizado também inclui uma nova classe de instalação chamada "USBDevice".
A classe de instalação "USBDevice" está disponível para os dispositivos para os quais a Microsoft não fornece um driver in-box. Normalmente, esses dispositivos não pertencem a classes USB bem definidas, como Áudio, Bluetooth e assim por diante, e exigem um driver personalizado. Se o dispositivo for um dispositivo WinUSB, provavelmente, o dispositivo não pertencerá a uma classe USB. Portanto, seu dispositivo deve ser instalado na classe de instalação "USBDevice". O Winusb.inf atualizado facilita esse requisito.
Sobre como usar a classe USBDevice
Não use a classe de configuração "USB" para dispositivos não classificados. Essa classe é reservada para instalar controladores, hubs e dispositivos compostos. Usar incorretamente a classe "USB" pode levar a problemas significativos de confiabilidade e desempenho. Para dispositivos não classificados, use "USBDevice".
Em Windows 8, para usar a classe de dispositivo "USBDevice", basta adicioná-lo ao INF:
[Version]
...
Class=USBDevice
ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}
...
No Gerenciador de Dispositivos você verá um novo nó dispositivos de Barramento Serial Universal USB e seu dispositivo será exibido nesse nó.
No Windows 7, além das linhas anteriores, você precisa criar essas configurações de registro no INF:
;---------- Add Registry Section ----------
[USBDeviceClassReg]
HKR,,,,"Universal Serial Bus devices"
HKR,,NoInstallClass,,1
HKR,,SilentInstall,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
Em Gerenciador de Dispositivos, você verá seu dispositivo aparecer em dispositivos de Barramento Serial Universal USB. No entanto, a descrição da classe de dispositivo é derivada da configuração do Registro especificada em seu INF.
Observe que a classe "USBDevice" não está limitada ao WinUSB. Se você tiver um driver personalizado para seu dispositivo, poderá usar a classe de configuração "USBDevice" no INF personalizado.
Durante a enumeração do dispositivo, a pilha do driver USB lê a ID compatível do dispositivo. Se a ID compatível for "WINUSB", o Windows a usará como o identificador do dispositivo e encontrará uma correspondência no Winusb.inf atualizado e carregará Winusb.sys como o driver de função do dispositivo.
Essa imagem é para um dispositivo MUTT de interface única que é definido como um dispositivo WinUSB e, como resultado, Winusb.sys é carregado como o driver de função para o dispositivo.
Para versões do Windows anteriores a Windows 8, o Winusb.inf atualizado está disponível por meio de Windows Update. Se o computador estiver configurado para obter a atualização do driver automaticamente, o driver WinUSB será instalado sem nenhuma intervenção do usuário usando o novo pacote INF.
Como alterar a descrição do dispositivo para um dispositivo WinUSB
Para um dispositivo WinUSB, Gerenciador de Dispositivos mostra "Dispositivo WinUsb" como a descrição do dispositivo. Essa cadeia de caracteres é derivada de Winusb.inf. Se houver vários dispositivos WinUSB, todos os dispositivos obterão a mesma descrição do dispositivo.
Para identificar e diferenciar exclusivamente o dispositivo em Gerenciador de Dispositivos, Windows 8 fornece uma nova propriedade em uma classe de dispositivo que instrui o sistema a dar precedência à descrição do dispositivo relatada pelo dispositivo (em seu descritor de cadeia de caracteres iProduct) sobre a descrição no INF. A classe "USBDevice" definida em Windows 8 define essa propriedade. Em outras palavras, quando um dispositivo é instalado na classe "USBDevice", o sistema consulta o dispositivo para obter uma descrição do dispositivo e define o Gerenciador de Dispositivos cadeia de caracteres como o que for recuperado na consulta. Nesse caso, a descrição do dispositivo fornecida no INF é ignorada. Observe as cadeias de caracteres de descrição do dispositivo: "MUTT" na imagem anterior. A cadeia de caracteres é fornecida pelo dispositivo USB em seu descritor de cadeia de caracteres do produto.
Não há suporte para a nova propriedade de classe em versões anteriores do Windows. Para ter uma descrição personalizada do dispositivo em uma versão anterior do Windows, você precisa escrever seu próprio INF personalizado.
Como configurar um dispositivo WinUSB
Para identificar um dispositivo USB como um dispositivo WinUSB, o firmware do dispositivo deve ter descritores do sistema operacional Microsoft. Para obter informações sobre os descritores, consulte as especificações descritas aqui: Descritores do sistema operacional da Microsoft.
Suporte a descritores de recursos estendidos
Para que a pilha de driver USB saiba que o dispositivo dá suporte a descritores de recursos estendidos, o dispositivo deve definir um descritor de cadeia de caracteres do sistema operacional armazenado no índice de cadeia de caracteres 0xEE. Durante a enumeração, o driver stack consulta o descritor de cadeia de caracteres. Se o descritor estiver presente, a pilha de driver pressupõe que o dispositivo contém um ou mais descritores de recursos do sistema operacional e os dados necessários para recuperar esses descritores de recursos.
O descritor de cadeia de caracteres recuperado tem um valor de campo bMS_VendorCode . O valor indica o código do fornecedor que a pilha de driver USB deve usar para recuperar o descritor de recurso estendido.
Para obter informações sobre como definir um descritor de cadeia de caracteres do sistema operacional, consulte "O descritor de cadeia de caracteres do sistema operacional" nas especificações descritas aqui: Descritores do sistema operacional da Microsoft.
Definindo a ID compatível
Um descritor de recurso de SO de ID compatível estendido que é necessário para corresponder ao Winusb.inf na caixa e carregar o módulo de driver do WinUSB.
O descritor de recurso do sistema operacional de ID compatível estendido inclui uma seção de cabeçalho seguida por uma ou mais seções de função, dependendo se o dispositivo é um dispositivo composto ou não composto. A seção de cabeçalho especifica o comprimento de todo o descritor, o número de seções de função e o número de versão. Para um dispositivo não composto, o cabeçalho é seguido por uma seção de função associada à única interface do dispositivo. O campo compatibleID dessa seção deve especificar "WINUSB" como o valor do campo. Para um dispositivo composto, há várias seções de função. O campo compatibleID de cada seção de função deve especificar "WINUSB".
Registrando um GUID de interface do dispositivo
Um descritor de recursos do sistema operacional de propriedades estendidas que é necessário para registrar seu GUID de interface do dispositivo. O GUID é necessário para localizar o dispositivo de um aplicativo ou serviço, configurar o dispositivo e executar operações de E/S.
Nas versões anteriores do Windows, o registro de GUID da interface do dispositivo é feito por meio do INF personalizado. A partir de Windows 8, seu dispositivo deve relatar o GUID da interface usando propriedades estendidas descritor de recursos do sistema operacional.
O descritor de recursos do sistema operacional de propriedades estendidas inclui uma seção de cabeçalho seguida por uma ou mais seções de propriedade personalizadas. A seção de cabeçalho descreve todo o descritor de propriedades estendidas, incluindo seu comprimento total, o número de versão e o número de seções de propriedade personalizadas. Para registrar o GUID da interface do dispositivo, adicione uma seção de propriedade personalizada que define o campo bPropertyName como "DeviceInterfaceGUID" e wPropertyNameLength como 40 bytes. Gere um GUID de interface de dispositivo exclusivo usando um gerador GUID e defina o campo bPropertyData para esse GUID, como "{8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}". O GUID é especificado como uma cadeia de caracteres Unicode e o comprimento da cadeia de caracteres é de 78 bytes (incluindo o terminador nulo).
bPropertyData | 78 bytes | 7B 00 38 00 46 00 45 00 36 00 44 00 34 00 44 00 37 00 2D 00 34 00 39 00 00 44 00 2D 00 34 00 31 00 45 00 37 00 2D 00 39 00 34 00 38 00 36 00 2D 00 34 00 39 00 41 00 46 0 43 00 36 00 42 00 46 00 45 00 34 00 37 00 35 00 7D 00 00 00 | O valor da propriedade é {8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}. |
Durante a enumeração do dispositivo, a pilha do driver USB recupera o valor DeviceInterfaceGUID do descritor de recursos do sistema operacional de propriedades estendidas e registra o dispositivo na chave de hardware do dispositivo. Um aplicativo pode recuperar o valor usando APIs SetupDiXxx (consulte SetupDiOpenDevRegKey). Para obter mais informações, consulte Como acessar um dispositivo USB usando funções WinUSB.
Habilitar ou desabilitar recursos de gerenciamento de energia do WinUSB
Antes de Windows 8, para configurar os recursos de gerenciamento de energia do WinUSB, você precisava escrever valores de entrada do Registro no HW. Seção AddReg do INF personalizado.
No Windows 8 e posterior, você pode especificar as configurações de energia no dispositivo. Você pode relatar valores por meio do descritor de recursos do sistema operacional de propriedades estendidas que habilitam ou desabilitam recursos no WinUSB para esse dispositivo. Há dois recursos que podem ser configurados: suspensão seletiva e ativação do sistema. A suspensão seletiva permite que o dispositivo insira estado de baixa potência quando ele estiver ocioso. A ativação do sistema refere-se à capacidade de um dispositivo ativar um sistema quando o sistema estiver em estado de baixa potência.
Para obter informações sobre os recursos de gerenciamento de energia do WinUSB, consulte Gerenciamento de Energia do WinUSB.
Nome da propriedade | Descrição |
---|---|
DeviceIdleEnabled | Esse valor é definido como 1 para indicar que o dispositivo pode desligar quando ocioso (suspensão seletiva). |
DefaultIdleState | Esse valor é definido como 1 para indicar que o dispositivo pode ser suspenso quando ocioso por padrão. |
DefaultIdleTimeout | Esse valor é definido como 5000 em milissegundos para indicar a quantidade de tempo em milissegundos para aguardar antes de determinar que um dispositivo está ocioso. |
UserSetDeviceIdleEnabled | Esse valor é definido como 1 para permitir que o usuário controle a capacidade do dispositivo de habilitar ou desabilitar a suspensão seletiva usb. Uma caixa de marcar Permitir que o computador desative esse dispositivo para economizar energia na página de propriedades do Gerenciamento de Energia do dispositivo e o usuário pode marcar ou desmarcar a caixa para habilitar ou desabilitar a suspensão seletiva usb. |
SystemWakeEnabled | Esse valor é definido como 1 para permitir que o usuário controle a capacidade do dispositivo de ativar o sistema de um estado de baixa potência. Quando habilitado, a caixa Permitir que este dispositivo ative o computador marcar aparece na página de propriedades de gerenciamento de energia do dispositivo. O usuário pode marcar ou desmarcar a caixa para habilitar ou desabilitar a ativação do sistema USB. |
Por exemplo, para habilitar a suspensão seletiva no dispositivo, adicione uma seção de propriedade personalizada que define o campo bPropertyName como uma cadeia de caracteres Unicode, "DeviceIdleEnabled" e wPropertyNameLength como 36 bytes. Defina o campo bPropertyData como "0x00000001". Os valores de propriedade são armazenados como números inteiros de 32 bits little-endian.
Durante a enumeração, a pilha de driver USB lê os descritores de recursos de propriedades estendidas e cria entradas do Registro sob esta chave:
HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Enum\USB\Parâmetros de dispositivo doidentificador de instância do identificador>de dispositivo<\<>\
Esta imagem mostra as configurações de exemplo para um dispositivo WinUSB.
Para obter exemplos adicionais, consulte as especificações em Descritores do sistema operacional Microsoft.