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 URB inicializada pelo driver.
Se o driver anteriormente chamado WdfUsbTargetDeviceCreateWithParameters criar UsbDevice, o driver deverá usar WdfUsbTargetDeviceCreateUrb ou WdfUsbTargetDeviceCreateIsochUrb para criar esse URB.
Retornar valor
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 WDF_REQUEST_SEND_OPTIONS que o parâmetro RequestOptions especificou estava incorreto. |
|
Um parâmetro inválido foi detectado. |
|
Memória insuficiente 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 IRP (pacote de solicitação de E/S) que o parâmetro Request representa não fornece estruturas de IO_STACK_LOCATION suficientes para permitir que o driver encaminhe a solicitação. |
Esse método também pode retornar outros valores NTSTATUS.
Um bug marcar ocorrerá se o driver fornecer um identificador de objeto inválido.
Comentários
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 para a 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 recebida pelo driver 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 Request do método WdfUsbTargetPipeSendUrbSynchronously.
Para criar e enviar uma nova solicitação, forneça um identificador de solicitação NULL para o parâmetro Request ou crie um novo objeto de solicitação e forneça seu identificador:
- 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, poderá reutilizar esses objetos de solicitação chamando WdfRequestReuse. Essa técnica habilita a função de retorno de chamada EvtDriverDeviceAdd do driver 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 |
---|---|
Plataforma de Destino | Universal |
Versão mínima do KMDF | 1.0 |
Cabeçalho | wdfusb.h (inclua Wdfusb.h) |
Biblioteca | Wdf01000.sys (consulte Controle de versão da biblioteca de 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) |
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de