Instalação do WinUSB (Winusb.sys) para desenvolvedores

Para determinados dispositivos USB (Barramento Serial Universal), como dispositivos que são acessados por apenas um único aplicativo, você pode instalar o WinUSB (Winusb.sys) na pilha de modo kernel do dispositivo como o driver de função do dispositivo USB em vez de implementar um driver.

Importante

Este tópico é para programadores. Se você for um cliente com problemas de USB, confira Solucionar problemas comuns de USB

Instalação automática do WinUSB sem um arquivo INF

Como um OEM ou um IHV (fornecedor independente de hardware), você pode criar seu dispositivo para que o Winusb.sys seja instalado automaticamente em Windows 8 e versões posteriores do sistema operacional. Esse dispositivo é chamado de dispositivo WinUSB e não exige que você escreva um arquivo INF personalizado que faça referência ao Winusb.inf in-box.

Quando você conecta um dispositivo WinUSB, o sistema lê as informações do dispositivo e carrega Winusb.sys automaticamente.

Para obter mais informações, consulte Dispositivo WinUSB.

Instalando o WinUSB especificando a classe de dispositivo fornecida pelo sistema

Ao conectar seu dispositivo, você poderá observar que o Windows carrega Winusb.sys automaticamente (se o IHV tiver definido o dispositivo como um dispositivo WinUSB). Caso contrário, siga estas instruções para carregar o driver:

  1. Conecte seu dispositivo ao sistema host.
  2. Abra Gerenciador de Dispositivos e localize o dispositivo.
  3. Selecione e segure (ou clique com o botão direito do mouse) no dispositivo e selecione Atualizar software de driver... no menu de contexto.
  4. No assistente, selecione Procurar software de driver no meu computador.
  5. Selecione Deixe-me escolher em uma lista de drivers de dispositivo no meu computador.
  6. Na lista de classes de dispositivo, selecione Dispositivos de Barramento Serial Universal.
  7. O assistente exibe o Dispositivo WinUsb. Selecione-o para carregar o driver.

Se os dispositivos do Barramento Serial Universal não aparecerem na lista de classes de dispositivo, você precisará instalar o driver usando um INF personalizado. O procedimento anterior não adiciona um GUID de interface do dispositivo para um aplicativo (aplicativo UWP ou aplicativo da área de trabalho do Windows) para acessar o dispositivo. Você deve adicionar o GUID manualmente seguindo este procedimento.

  1. Carregue o driver conforme descrito no procedimento anterior.

  2. Gere um GUID de interface do dispositivo para seu dispositivo usando uma ferramenta como guidgen.exe.

  3. Localize a chave do Registro para o dispositivo sob esta chave:

    <HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_vvvv&PID_pppp>

  4. Na chave Parâmetros do Dispositivo , adicione uma entrada do Registro de cadeia de caracteres chamada DeviceInterfaceGUID ou uma entrada de várias cadeias de caracteres chamada DeviceInterfaceGUIDs. Defina o valor como o GUID gerado na etapa 2.

  5. Desconecte o dispositivo do sistema e reconecte-o à mesma porta física. Observação: se você alterar a porta física, deverá repetir as etapas 1 a 4.

Escrever uma instalação personalizada do INF para WinUSB

Como parte do pacote de driver, você fornece um arquivo .inf que instala Winusb.sys como o driver de função para o dispositivo USB.

O arquivo .inf de exemplo a seguir mostra a instalação do WinUSB para a maioria dos dispositivos USB com algumas modificações, como alterar USB_Install em nomes de seção para um valor DDInstall apropriado. Você também deve alterar as seções de versão, fabricante e modelo conforme necessário. Por exemplo, forneça o nome de um fabricante apropriado, o nome do arquivo de catálogo assinado, a classe de dispositivo correta e o VID (identificador de fornecedor) e o PID (identificador de produto) do dispositivo. Para obter informações sobre como criar um arquivo de catálogo, consulte Criando um arquivo de catálogo para Test-Signing um pacote de driver.

Observe também que a classe de instalação está definida como "USBDevice". Os fornecedores podem usar a classe de configuração "USBDevice" para dispositivos que não pertencem a outra classe e não são controladores de host USB ou hubs.

Se você estiver instalando o WinUSB como o driver de função para uma das funções em um dispositivo composto USB, deverá fornecer a ID de hardware associada à função, no INF. Você pode obter a ID de hardware para a função das propriedades do devnode em Gerenciador de Dispositivos. O formato da cadeia de caracteres de ID de hardware é "USB\VID_vvvv&PID_pppp".

O INF a seguir instala o WinUSB como o driver de função da placa USB FX2 do OSR em um sistema baseado em x64.

A partir do Windows 10, versão 1709, o Kit de Driver do Windows fornece InfVerif.exe que você pode usar para testar um arquivo INF do driver para garantir que não haja problemas de sintaxe e se o arquivo INF é universal. Recomendamos que você forneça um INF universal. Para obter mais informações, consulte Usando um arquivo INF universal.

;
;
; Installs WinUsb
;

[Version]
Signature   = "$Windows NT$"
Class       = USBDevice
ClassGUID   = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
Provider    = %ManufacturerName%
CatalogFile = WinUSBInstallation.cat
DriverVer   = 09/04/2012,13.54.20.543
PnpLockdown = 1

; ========== Manufacturer/Models sections ===========

[Manufacturer]
%ManufacturerName% = Standard,NTamd64

[Standard.NTamd64]
%DeviceName% =USB_Install, USB\VID_0547&PID_1002

; ========== Class definition (for Windows 8 and earlier versions)===========

[ClassInstall32]
AddReg = ClassInstall_AddReg

[ClassInstall_AddReg]
HKR,,,,%ClassName%
HKR,,NoInstallClass,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
HKR,,LowerLogoVersion,,5.2

; =================== Installation ===================

[USB_Install]
Include = winusb.inf
Needs   = WINUSB.NT

[USB_Install.Services]
Include =winusb.inf
Needs   = WINUSB.NT.Services

[USB_Install.HW]
AddReg=Dev_AddReg

[USB_Install.Wdf]
KmdfService=WINUSB, WinUsb_Install

[WinUsb_Install]
KmdfLibraryVersion=1.11

[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{9f543223-cede-4fa3-b376-a25ce9a30e74}"

; [DestinationDirs]
; If your INF needs to copy files, you must not use the DefaultDestDir directive here.
; You must explicitly reference all file-list-section names in this section.

; =================== Strings ===================

[Strings]
ManufacturerName=""
ClassName="Universal Serial Bus devices"
DeviceName="Fx2 Learning Kit Device"
REG_MULTI_SZ = 0x00010000

Inclua apenas uma seção ClassInstall32 em um arquivo INF do dispositivo para instalar uma nova classe de configuração de dispositivo personalizada. Os arquivos INF para dispositivos em uma classe instalada, seja uma classe de configuração de dispositivo fornecida pelo sistema ou uma classe personalizada, não devem incluir uma seção ClassInstall32.

Exceto para valores específicos do dispositivo e vários problemas que são observados na lista a seguir, você pode usar essas seções e diretivas para instalar o WinUSB para qualquer dispositivo USB. Esses itens de lista descrevem as diretivas Includes e no arquivo .inf anterior.

  • USB_Install: as diretivas Incluir e Necessidades na seção USB_Install são necessárias para instalar o WinUSB. Você não deve modificar essas diretivas.

  • USB_Install.Services: a diretiva Include na seção USB_Install.Services inclui o .inf fornecido pelo sistema para WinUSB (Winusb.inf). Esse arquivo .inf será instalado pelo co-instalador do WinUSB se ele ainda não estiver no sistema de destino. A diretiva Needs especifica a seção em Winusb.inf que contém informações necessárias para instalar Winusb.sys como o driver de função do dispositivo. Você não deve modificar essas diretivas.

  • USB_Install.HW: esta seção é a chave no arquivo .inf. Ele especifica o GUID (identificador global exclusivo) da interface do dispositivo para seu dispositivo. A diretiva AddReg define o GUID de interface especificado em um valor de registro padrão. Quando Winusb.sys é carregado como o driver de função do dispositivo, ele lê a chave DeviceInterfaceGUIDs do valor do registro e usa o GUID especificado para representar a interface do dispositivo. Você deve substituir o GUID neste exemplo por um criado especificamente para seu dispositivo. Se os protocolos do dispositivo forem alterados, crie um GUID de interface do dispositivo.

    Nota O software de modo de usuário deve chamar SetupDiGetClassDevs para enumerar as interfaces de dispositivo registradas associadas a uma das classes de interface do dispositivo especificadas na chave DeviceInterfaceGUIDs. SetupDiGetClassDevs retorna o identificador de dispositivo para o dispositivo que o software de modo de usuário deve passar para a rotina de WinUsb_Initialize para obter um identificador WinUSB para a interface do dispositivo. Para obter mais informações sobre essas rotinas, consulte Como acessar um dispositivo USB usando funções WinUSB.

O INF a seguir instala o WinUSB como o driver de função da placa USB FX2 do OSR em um sistema baseado em x64. O exemplo mostra INF com co-instaladores do WDF.

;
;
; Installs WinUsb
;

[Version]
Signature   = "$Windows NT$"
Class       = USBDevice
ClassGUID   = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
Provider    = %ManufacturerName%
CatalogFile = WinUSBInstallation.cat
DriverVer   = 09/04/2012,13.54.20.543
PnpLockdown = 1

; ========== Manufacturer/Models sections ===========

[Manufacturer]
%ManufacturerName% = Standard,NTamd64

[Standard.NTamd64]
%DeviceName% =USB_Install, USB\VID_0547&PID_1002

; ========== Class definition (for Windows 8 and earlier versions) ===========

[ClassInstall32]
AddReg = ClassInstall_AddReg

[ClassInstall_AddReg]
HKR,,,,%ClassName%
HKR,,NoInstallClass,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
HKR,,LowerLogoVersion,,5.2

; =================== Installation ===================

[USB_Install]
Include = winusb.inf
Needs   = WINUSB.NT

[USB_Install.Services]
Include =winusb.inf
Needs   = WINUSB.NT.Services

[USB_Install.HW]
AddReg=Dev_AddReg

[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{9f543223-cede-4fa3-b376-a25ce9a30e74}"

[USB_Install.CoInstallers]
AddReg=CoInstallers_AddReg
CopyFiles=CoInstallers_CopyFiles

[CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01011.dll,WdfCoInstaller","WinUsbCoInstaller2.dll"

[CoInstallers_CopyFiles]
WinUsbCoInstaller2.dll
WdfCoInstaller01011.dll

[DestinationDirs]
; If your INF needs to copy files, you must not use the DefaultDestDir directive here.
CoInstallers_CopyFiles=11
; ================= Source Media Section =====================

[SourceDisksNames]
1 = %DiskName%

[SourceDisksFiles]
WinUsbCoInstaller2.dll=1
WdfCoInstaller01011.dll=1


; =================== Strings ===================

[Strings]
ManufacturerName=""
ClassName="Universal Serial Bus devices"
DeviceName="Fx2 Learning Kit Device"
DiskName="MyDisk"
REG_MULTI_SZ = 0x00010000
  • USB_Install.CoInstallers: esta seção, que inclui as seções AddReg e CopyFiles referenciadas, contém dados e instruções para instalar os co-instaladores WinUSB e KMDF e associá-los ao dispositivo. A maioria dos dispositivos USB pode usar essas seções e diretivas sem modificação.

  • As versões baseadas em x86 e x64 do Windows têm co-instaladores separados.

    Cada co-instalador tem versões gratuitas e verificadas. Use a versão gratuita para instalar o WinUSB em builds gratuitos do Windows, incluindo todas as versões de varejo. Use a versão verificada (com o sufixo "_chk") para instalar o WinUSB em builds verificados do Windows.

Sempre queWinusb.sys é carregado, ele registra uma interface de dispositivo que tem as classes de interface do dispositivo especificadas no registro sob a chave DeviceInterfaceGUIDs .

HKR,,DeviceInterfaceGUIDs, 0x10000,"{D696BFEB-1734-417d-8A04-86D01071C512}"

Se você usar o pacote WinUSB redistribuível para Windows XP ou Windows Server 2003, certifique-se de não desinstalar o WinUSB em seus pacotes de desinstalação. Outros dispositivos USB podem estar usando WinUSB, portanto, seus binários devem permanecer na pasta compartilhada.

Como criar um pacote de driver que instala Winusb.sys

Para usar o WinUSB como o driver de função do dispositivo, crie um pacote de driver. O pacote de driver deve conter estes arquivos:

  • Co-instalador do WinUSB (Winusbcoinstaller.dll)
  • Co-instalador KMDF (WdfcoinstallerXXX.dll)
  • Um arquivo .inf que instala Winusb.sys como o driver de função do dispositivo. Para obter mais informações, consulte Escrevendo um INF personalizado para instalação do WinUSB.
  • Um arquivo de catálogo assinado para o pacote. Esse arquivo é necessário para instalar o WinUSB em versões x64 do Windows a partir do Vista.

Pacote de instalação do WinUSB.

Verifique se o conteúdo do pacote de driver atende a estes requisitos:

  • Os arquivos do co-instalador KMDF e WinUSB devem ser obtidos da mesma versão do WDK (Kit de Driver do Windows).
  • Os arquivos do co-instalador devem ser obtidos da versão mais recente do WDK, para que o driver dê suporte a todas as versões mais recentes do Windows.
  • O conteúdo do pacote de driver deve ser assinado digitalmente com uma assinatura de versão do Winqual. Para obter mais informações sobre como criar e testar arquivos de catálogo assinados, consulte Passo a passo da assinatura de código do modo Kernel no site do Centro de Desenvolvimento do Windows – Hardware.
  1. Baixe o WDK (Kit de Driver do Windows) e instale-o.

  2. Crie uma pasta de pacote de driver no computador ao qual o dispositivo USB está conectado. Por exemplo, c:\UsbDevice.

  3. Copie o co-instalador do WinUSB (WinusbcoinstallerX.dll) da pasta WinDDK\<BuildNumber>\redist\winusb para a pasta do pacote de driver.

    O co-instalador do WinUSB (Winusbcoinstaller.dll) instala o WinUSB no sistema de destino, se necessário. O WDK inclui três versões do co-instalador, dependendo da arquitetura do sistema: sistemas baseados em x86, baseados em x64 e itanium. Todos eles são nomeados WinusbcoinstallerX.dll e estão localizados no subdiretório apropriado na pasta WinDDK\<BuildNumber>\redist\winusb .

  4. Copie o co-instalador KMDF (WdfcoinstallerXXX.dll) da pasta WinDDK\<BuildNumber>\redist\wdf para a pasta do pacote do driver.

    O co-instalador KMDF (WdfcoinstallerXXX.dll) instala a versão correta do KMDF no sistema de destino, se necessário. A versão do co-instalador do WinUSB deve corresponder ao co-instalador KMDF porque os drivers de cliente baseados em KMDF, como Winusb.sys, exigem que a versão correspondente da estrutura KMDF seja instalada corretamente no sistema. Por exemplo, Winusbcoinstaller2.dll requer KMDF versão 1.9, que é instalada por Wdfcoinstaller01009.dll. As versões x86 e x64 do WdfcoinstallerXXX.dll são incluídas com o WDK na pasta WinDDK\<BuildNumber>\redist\wdf . A tabela a seguir mostra o co-instalador do WinUSB e o co-instalador KMDF associado a ser usado no sistema de destino.

    Use esta tabela para determinar o co-instalador do WinUSB e o co-instalador KMDF associado.

    Co-instalador do WinUSB Versão da biblioteca KMDF Co-instalador kmdf
    Winusbcoinstaller.dll Requer KMDF versão 1.5 ou posterior Wdfcoinstaller01005.dll
    Wdfcoinstaller01007.dll
    Wdfcoinstaller01009.dll
    Winusbcoinstaller2.dll Requer KMDF versão 1.9 ou posterior Wdfcoinstaller01009.dll
    Winusbcoinstaller2.dll Requer KMDF versão 1.11 ou posterior WdfCoInstaller01011.dll
  5. Escreva um arquivo .inf que instala Winusb.sys como o driver de função para o dispositivo USB.

  6. Crie um arquivo de catálogo assinado para o pacote. Esse arquivo é necessário para instalar o WinUSB em versões x64 do Windows.

  7. Anexe o dispositivo USB ao computador.

  8. Abra Gerenciador de Dispositivos para instalar o driver. Siga as instruções no assistente Atualizar Software do Driver e escolha instalação manual. Você precisará fornecer o local da pasta do pacote de driver para concluir a instalação.