função WinUsb_ControlTransfer (winusb.h)
A função WinUsb_ControlTransfer transmite dados de controle sobre um ponto de extremidade de controle padrão.
Sintaxe
BOOL WinUsb_ControlTransfer(
[in] WINUSB_INTERFACE_HANDLE InterfaceHandle,
[in] WINUSB_SETUP_PACKET SetupPacket,
[out] PUCHAR Buffer,
[in] ULONG BufferLength,
[out, optional] PULONG LengthTransferred,
[in, optional] LPOVERLAPPED Overlapped
);
Parâmetros
[in] InterfaceHandle
Um identificador opaco para uma interface na configuração selecionada.
Para especificar o destinatário de uma solicitação de controle como o dispositivo inteiro ou a primeira interface, use o identificador retornado por WinUsb_Initialize. Para todas as outras interfaces, obtenha o identificador para a interface de destino chamando WinUsb_GetAssociatedInterface e chame WinUsb_ControlTransfer especificando o identificador de interface obtido.
[in] SetupPacket
O pacote de configuração de 8 bytes do tipo WINUSB_SETUP_PACKET.
[out] Buffer
Um buffer alocado pelo chamador que contém os dados a serem transferidos. O comprimento desse buffer não deve exceder 4 KB.
[in] BufferLength
O número de bytes a serem transferidos, sem incluir o pacote de instalação. Esse número deve ser menor ou igual ao tamanho, em bytes, de Buffer.
[out, optional] LengthTransferred
Um ponteiro para uma variável ULONG que recebe o número real de bytes transferidos. Se o aplicativo não espera que nenhum dado seja transferido durante a fase de dados (BufferLength é zero), LengthTransferred poderá ser NULL.
[in, optional] Overlapped
Um ponteiro opcional para uma estrutura OVERLAPPED , que é usada para operações assíncronas. Se esse parâmetro for especificado, WinUsb_ControlTransfer retornará imediatamente e o evento será sinalizado quando a operação for concluída. Se Sobreposto não for fornecido, a função WinUsb_ControlTransfer transferirá dados de forma síncrona.
Retornar valor
WinUsb_ControlTransferretornará TRUE se a operação for bem-sucedida. Caso contrário, essa rotina retornará FALSE e o chamador poderá recuperar o erro registrado chamando GetLastError.
GetLastError pode retornar um dos seguintes códigos de erro.
Código de retorno | Descrição |
---|---|
|
O chamador passou NULL no parâmetro InterfaceHandle . |
|
Indica que não há memória suficiente para executar a operação. |
Comentários
Uma solicitação de controle sempre é enviada pelo host para o ponto de extremidade padrão de um dispositivo USB, mas o destinatário da solicitação pode ser todo o dispositivo, uma interface ou um ponto de extremidade na configuração alternativa selecionada. Na chamada WinUsb_ControlTransfer , o aplicativo deve indicar o destinatário por meio de dois parâmetros: InterfaceHandle e SetupPacket.
Se o destinatário de uma solicitação de controle for todo o dispositivo, a primeira interface ou qualquer ponto de extremidade nessa interface, o aplicativo deverá usar o identificador retornado por WinUsb_Initialize. Se o destinatário for qualquer outra interface ou seu ponto de extremidade, o aplicativo deverá obter o identificador WinUSB associado à interface de destino chamando WinUsb_GetAssociatedInterface e, em seguida, chamar WinUsb_ControlTransfer especificando o identificador de interface obtido.
De acordo com a Seção 9.3 da especificação USB oficial, o token de instalação de uma transferência de controle contém informações sobre a solicitação. Para um aplicativo WinUSB, esse token de instalação é descrito usando a estrutura WINUSB_SETUP_PACKET .
Dentro do token de instalação, os campos bmRequestType e wIndex são usados para indicar o destinatário da solicitação. Esses campos correspondem aos membros RequestType e Index de WINUSB_SETUP_PACKET, respectivamente.
Os dois bits mais baixos de RequestType indicam o destinatário da solicitação. O destinatário pode ser o dispositivo, uma interface, um ponto de extremidade ou outro (para solicitação de fornecedor). Dependendo do destinatário, o byte inferior de Index indica o índice definido pelo dispositivo do destinatário. O valor de Index depende do tipo de solicitação. Por exemplo, para solicitações de controle padrão, o valor é 0 ou indica a interface ou o número do ponto de extremidade. Para determinados tipos de solicitações padrão, como uma solicitação GET_DESCRIPTOR para obter um descritor de cadeia de caracteres, o valor Index indica a ID da linguagem.
Se o destinatário for o dispositivo, o aplicativo deverá definir os valores RequestType e Index . Os dois bits mais baixos do valor RequestType devem ser 0. O byte inferior do valor index depende do tipo de solicitação. O InterfaceHandle deve ser o identificador WinUSB retornado por WinUsb_Initialize.
Se o destinatário da solicitação for uma interface, o aplicativo deverá definir os dois bits mais baixos de RequestType como 0x01. O aplicativo não é necessário para definir o byte inferior de Index para qualquer tipo de solicitação. Para solicitações padrão, de classe e de fornecedor, Winusb.sys define o valor como o número de interface da interface de destino. O InterfaceHandle deve ser associado à interface de destino. O aplicativo pode obter esse identificador chamando WinUsb_GetAssociatedInterface.
Se o destinatário for um ponto de extremidade, o aplicativo deverá definir os dois bits mais baixos de RequestType como 0x02 e byte inferior de Index para o endereço do ponto de extremidade. Nesse caso, InterfaceHandle está associado à interface que contém o ponto de extremidade. O aplicativo pode obter esse identificador chamando WinUsb_GetAssociatedInterface.
Requisitos
Requisito | Valor |
---|---|
Plataforma de Destino | Universal |
Cabeçalho | winusb.h (inclua Winusb.h) |
Biblioteca | Winusb.lib |
DLL | Winusb.dll |