Função WdfUsbTargetPipeSendUrbSynchronously (wdfusb.h)
[Aplica-se somente ao KMDF]
O método WdfUsbTargetPipeSendUrbSynchronously cria uma solicitação USB para um pipe USB especificado, usando parâmetros de solicitação que um URB especificado descreve.
Sintaxe
NTSTATUS WdfUsbTargetPipeSendUrbSynchronously(
[in] WDFUSBPIPE Pipe,
[in, optional] WDFREQUEST Request,
[in, optional] PWDF_REQUEST_SEND_OPTIONS RequestOptions,
[in] PURB Urb
);
Parâmetros
[in] Pipe
Um identificador para um objeto de pipe de estrutura que foi obtido chamando WdfUsbInterfaceGetConfiguredPipe.
[in, optional] Request
Um identificador para um objeto de solicitação de estrutura. Esse parâmetro é opcional e pode ser NULL. Para obter mais informações, consulte a seção Comentários a seguir.
[in, optional] RequestOptions
Um ponteiro para uma estrutura de WDF_REQUEST_SEND_OPTIONS alocada pelo chamador que especifica opções para a solicitação. Esse ponteiro é opcional e pode ser NULL. Para obter mais informações, consulte a seção Comentários a seguir.
[in] Urb
Um ponteiro para uma estrutura de URB
Se o driver chamado anteriormente WdfUsbTargetDeviceCreateWithParameters criar UsbDevice, o driver deverá usar WdfUsbTargetDeviceCreateUrb ou WdfUsbTargetDeviceCreateIsochUrb para criar essa URB.
Valor de retorno
WdfUsbTargetPipeSendUrbSynchronously retorna o valor de status de conclusão do destino de E/S se a operação for bem-sucedida. Caso contrário, esse método poderá retornar um dos seguintes valores:
Código de retorno | Descrição |
---|---|
|
O tamanho da estrutura de WDF_REQUEST_SEND_OPTIONS que o parâmetro RequestOptions especificado estava incorreto. |
|
Um parâmetro inválido foi detectado. |
|
Memória insuficiente estava disponível. |
|
O IRQL do chamador não foi PASSIVE_LEVEL ou a solicitação de E/S especificada já estava na fila para um destino de E/S. |
|
O driver forneceu um valor de tempo limite e a solicitação não foi concluída dentro do tempo alocado. |
|
O pacote de solicitação de E/S ( |
Esse método também pode retornar outros valores NTSTATUS .
Uma verificação de bug ocorre se o driver fornece um identificador de objeto inválido.
Observações
Use o método WdfUsbTargetPipeSendUrbSynchronously para enviar uma solicitação USB de forma síncrona. Para enviar essas solicitações de forma assíncrona, use WdfUsbTargetPipeFormatRequestForUrb, seguido por WdfRequestSend.
O método WdfUsbTargetPipeSendUrbSynchronously não retorna até que a solicitação seja concluída, a menos que o driver forneça um valor de tempo limite na estrutura WDF_REQUEST_SEND_OPTIONS à qual o parâmetro RequestOptions aponta ou a menos que um erro seja detectado.
A estrutura não examina a solicitação USB. Se a solicitação alterar o estado do pipe USB, a estrutura não estará ciente da alteração.
Você pode encaminhar uma solicitação de E/S que seu driver recebeu em uma fila de E/S ou pode criar e enviar uma nova solicitação.
Para encaminhar uma solicitação de E/S recebida pelo driver em uma fila de E/S, especifique o identificador da solicitação recebida para o parâmetro WdfUsbTargetPipeSendUrbSynchronously parâmetro de solicitação de do método.
Para criar e enviar uma nova solicitação, forneça um identificador de solicitação
- Se você fornecer um identificador de solicitação NULL, a estrutura usará um objeto de solicitação interno. Essa técnica é simples de usar, mas o driver não pode cancelar a solicitação.
- Se você chamar WdfRequestCreate para criar um ou mais objetos de solicitação, você poderá reutilizar esses objetos de solicitação chamando WdfRequestReuse. Essa técnica permite que o do driver EvtDriverDeviceAdd função de retorno de chamada para pré-alocar objetos de solicitação para um dispositivo. Além disso, outro thread de driver pode chamar WdfRequestCancelSentRequest para cancelar a solicitação, se necessário.
Para obter informações sobre como obter informações de status após a conclusão de uma solicitação de E/S, consulte Obtendo informações de conclusão.
Para obter mais informações sobre o método WdfUsbTargetPipeSendUrbSynchronously e destinos de E/S USB, consulte destinos de E/S USB.
Exemplos
O exemplo de código a seguir inicializa um URB e envia o URB para um pipe USB.
URB urb;
PURB pUrb = NULL;
NTSTATUS status;
pUrb = &urb;
pUrb->UrbHeader.Length = (USHORT) sizeof(struct _URB_GET_CURRENT_FRAME_NUMBER);
pUrb->UrbHeader.Function = URB_FUNCTION_GET_CURRENT_FRAME_NUMBER;
pUrb->UrbGetCurrentFrameNumber.FrameNumber = 0;
status = WdfUsbTargetPipeSendUrbSynchronously(
Pipe,
Request,
NULL,
pUrb
);
Requisitos
Requisito | Valor |
---|---|
da Plataforma de Destino |
Universal |
versão mínima do KMDF | 1.0 |
cabeçalho | wdfusb.h (inclua Wdfusb.h) |
biblioteca | Wdf01000.sys (consulte o Controle de Versão da Biblioteca da Estrutura.) |
IRQL | PASSIVE_LEVEL |
regras de conformidade de DDI | DriverCreate(kmdf), IoctlReqs(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit (kmdf), SyncReqSend(kmdf), UsbKmdfIrql(kmdf), UsbKmdfIrql2(kmdf), UsbKmdfIrqlExplicit(kmdf) |