Aplicativo de desktop do Windows para um dispositivo USB
Neste artigo, você aprenderá sobre como um aplicativo pode chamar funções WinUSB para se comunicar com um dispositivo USB. Para esse aplicativo, o WinUSB (Winusb.sys) deve ser instalado como o driver de função do dispositivo. WinUSB na pilha de modo kernel do dispositivo. Esse driver está incluído no Windows na pasta \Windows\System32\drivers.
Se você estiver usando o Winusb.sys como driver de função de um dispositivo USB, poderá chamar funções WinUSB de um aplicativo para se comunicar com o dispositivo. Essas funções, expostas pela Winusb.dll DLL do modo de usuário, simplificam o processo de comunicação. Em vez de construir solicitações de controle de E/S do dispositivo para executar operações USB padrão (como configurar o dispositivo, enviar solicitações de controle e transferir dados de ou para o dispositivo), os aplicativos chamam a função WinUSB equivalente.
Winusb.dll usa os dados fornecidos pelo aplicativo para construir a solicitação de controle de E/S do dispositivo apropriada e, em seguida, envia a solicitação ao Winusb.sys para processamento. Para se comunicar com a pilha USB, a função WinUSB chama a função DeviceIoControl com o IOCTL apropriado que se correlaciona com a solicitação do aplicativo. Quando a solicitação é concluída, a função WinUSB passa todas as informações retornadas por Winusb.sys (como dados de uma solicitação de leitura) de volta para o processo de chamada. Se a chamada para DeviceIoControl for bem-sucedida, ela retornará um valor diferente de zero. Se a chamada falhar ou estiver pendente (não processada imediatamente), DeviceIoControl retornará um valor zero. Se ocorrer um erro, o aplicativo poderá chamar GetLastError para obter uma mensagem de erro mais detalhada.
É mais simples usar as funções WinUSB para se comunicar com um dispositivo do que implementar um driver. No entanto, observe as seguintes limitações:
As funções WinUSB permitem que um aplicativo por vez se comunique com o dispositivo. Se você precisar que mais de um aplicativo se comunique simultaneamente com um dispositivo, deverá implementar um driver de função.
Antes do Windows 8.1, as funções WinUSB não dão suporte ao streaming de dados de ou para pontos de extremidade isócronos.
As funções WinUSB não dão suporte a dispositivos que já têm suporte ao modo kernel. Exemplos desses dispositivos incluem modems e adaptadores de rede, que são suportados pela API de telefonia (TAPI) e NDIS, respectivamente.
Para dispositivos multifuncionais, você pode usar o arquivo INF do dispositivo para especificar um driver de modo kernel in-box ou Winusb.sys para cada função USB separadamente. No entanto, você pode especificar apenas uma dessas opções para uma função específica, não ambas.
Observação
As funções WinUSB requerem Windows XP ou posterior. Você pode usar essas funções em seu aplicativo C/C++ para se comunicar com seu dispositivo USB. Para escrever um aplicativo UWP que usa APIs WinUSB, consulte Aplicativo UWP para um dispositivo USB.
Introdução
Obtenha as ferramentas necessárias para escrever um aplicativo da área de trabalho do Windows para dispositivos
- Siga as instruções em Baixando o Windows Driver Kit.
Obtenha um dispositivo USB de teste e sua especificação de hardware.
Use a especificação para determinar a funcionalidade do aplicativo e as decisões de design relacionadas.
Os dispositivos Microsoft USB Test Tool (MUTT) estão disponíveis na JJG Technologies. Este dispositivo requer firmware da Microsoft disponível em Baixar pacote de software MUTT.
Escreva um aplicativo esqueleto que obtenha um identificador para o dispositivo.
Há duas abordagens para escrever o primeiro aplicativo:
Escreva com base no modelo WinUSB incluído no Visual Studio. Para obter mais informações, consulte Escrever um aplicativo da área de trabalho do Windows com base no modelo WinUSB.
Chame rotinas SetupAPI para obter um identificador para o dispositivo e abri-lo chamando WinUsb_Initialize. Para obter mais informações, consulte Como acessar um dispositivo USB usando funções WinUSB.
Instale Winusb.sys para o seu dispositivo.
Se estiver usando o Visual Studio, instale o pacote de driver no computador de destino usando a implantação do Visual Studio. Para obter instruções, consulte Escrever um aplicativo da área de trabalho do Windows com base no modelo WinUSB. Caso contrário, instale manualmente o driver no Gerenciador de dispositivos escrevendo um INF personalizado. Para obter mais informações, consulte Instalação do WinUSB (Winusb.sys).
Obtenha informações sobre seu dispositivo e visualize seus descritores.
Para obter informações conceituais, consulte Conceitos para todos os desenvolvedores USB. Obtenha informações sobre os recursos do dispositivo lendo o descritor de configuração, os descritores de interface para cada configuração alternativa com suporte e seus descritores de ponto de extremidade. Para obter mais informações, consulte Consultar o dispositivo para descritores USB.
Envie uma transferência de controle USB.
Envie solicitações de controle padrão e comandos do fornecedor para seu dispositivo. Para obter mais informações, consulte Enviar transferência de controle para o ponto de extremidade padrão.
Envie transferências em massa ou interrupções.
Execute operações de leitura e gravação de e para os pontos de extremidade em massa, interrupção e isócronos suportados pelo seu dispositivo. Para obter mais informações, consulte Emitir solicitações de E/S.
Envie transferências isócronas.
Envie solicitações de leitura e gravação isócronas, usadas principalmente para streaming de dados. Esse recurso está disponível apenas no Windows 8.1 e posterior. Para obter mais informações, consulte Enviando transferências isócronas USB de um aplicativo da área de trabalho WinUSB.