Compartilhar via


Função WdfRequestForwardToParentDeviceIoQueue (wdfrequest.h)

[Aplica-se somente ao KMDF]

O método WdfRequestForwardToParentDeviceIoQueue requeus uma solicitação de E/S da fila de E/S de um dispositivo filho para uma fila de E/S especificada do dispositivo pai da criança.

Sintaxe

NTSTATUS WdfRequestForwardToParentDeviceIoQueue(
  [in] WDFREQUEST                   Request,
  [in] WDFQUEUE                     ParentDeviceQueue,
  [in] PWDF_REQUEST_FORWARD_OPTIONS ForwardOptions
);

Parâmetros

[in] Request

Um identificador para um objeto de solicitação de estrutura.

[in] ParentDeviceQueue

Um identificador para um objeto de fila de estrutura.

[in] ForwardOptions

Um ponteiro para uma estrutura de WDF_REQUEST_FORWARD_OPTIONS alocada pelo chamador.

Valor de retorno

WdfRequestForwardToParentDeviceIoQueue retornará STATUS_SUCCESS 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
STATUS_INFO_LENGTH_MISMATCH
O tamanho da estrutura de WDF_REQUEST_FORWARD_OPTIONS fornecida é inválido.
STATUS_INVALID_PARAMETER
Um membro da estrutura de WDF_REQUEST_FORWARD_OPTIONS fornecida contém um valor inválido.
STATUS_INVALID_DEVICE_REQUEST
Esse valor será retornado se ocorrer um destes procedimentos:
  • O driver não obteve a solicitação de E/S de uma fila de E/S.
  • As filas de E/S de origem e de destino são as mesmas.
  • A fila de E/S especificada não pertence ao dispositivo pai.
  • O driver habilitou progresso de encaminhamento garantido e a solicitação de E/S especificada é reservada para situações de memória baixa.
  • O driver não chamou WdfPdoInitAllowForwardingRequestToParent.
STATUS_WDF_BUSY
A fila de E/S especificada não está aceitando novas solicitações.
 

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

Antes que um driver possa chamar WdfRequestForwardToParentDeviceIoQueue, ele deve chamar WdfPdoInitAllowForwardingRequestToParent.

O driver deve usar o mesmo método para acessar buffers de dados (em buffer, direto ou nenhum deles) para o dispositivo pai e o dispositivo filho.

Se o driver chamar WdfRequestForwardToParentDeviceIoQueue para enviar novamente uma solicitação de E/S, o driver não deverá usar o objeto de solicitação como o pai de outros objetos de estrutura, como objetos de temporizador ou objetos de item de trabalho.

Se o driver tiver chamado WdfDeviceInitSetRequestAttributes para especificar espaço de contexto para os objetos de solicitação do pai do dispositivo, a estrutura não adicionará esse espaço de contexto para solicitar objetos que o driver recebe na fila de um dispositivo filho. O driver pode chamar WdfObjectAllocateContext para adicionar o espaço de contexto a um objeto de solicitação antes que o driver chame WdfRequestForwardToParentDeviceIoQueue. Por outro lado, se o driver chamado WdfDeviceInitSetRequestAttributes para o filho objetos de solicitação do dispositivo e se os objetos de solicitação do dispositivo pai usarem espaço de contexto igual ou menor que o espaço de contexto do dispositivo filho, o driver poderá usar o espaço de contexto do objeto de solicitação sem chamar WdfObjectAllocateContext.

Atualmente, o driver deve usar a opção enviar e esquecer para todas as solicitações de E/S requeuídas. Portanto, lembre-se de que, quando a estrutura excluir um objeto de solicitação requeued, ele já pode ter removido o dispositivo filho que recebeu originalmente o objeto de solicitação. Portanto, o driver não deve usar a função EvtCleanupCallback ou EvtDestroyCallback de um objeto de solicitação requeued para acessar recursos de dispositivo filho, pois os recursos podem ser removidos antes que a função EvtCleanupCallback ou EvtDestroyCallback seja executada.

Para obter mais informações sobre WdfRequestForwardToParentDeviceIoQueue, consulte Requeuing I/S Requests.

Exemplos

O exemplo de código a seguir primeiro determina o dispositivo pai de um dispositivo que recebeu uma solicitação de E/S e, em seguida, requeus a solicitação de E/S para a fila de E/S padrão do dispositivo pai.

WDFDEVICE device, parentDevice;
WDF_REQUEST_FORWARD_OPTIONS forwardOptions;
NTSTATUS status;

device = WdfIoQueueGetDevice(WdfRequestGetIoQueue(Request));
parentDevice = WdfPdoGetParent(device);

WDF_REQUEST_FORWARD_OPTIONS_INIT(&forwardOptions);
status = WdfRequestForwardToParentDeviceIoQueue(
             Request,
             WdfDeviceGetDefaultQueue(parentDevice),
             &forwardOptions
             );
if (!NT_SUCCESS(status)) {
    WdfRequestComplete(
                       Request,
                       status
                       );
  }

Requisitos

Requisito Valor
da Plataforma de Destino Universal
versão mínima do KMDF 1.9
cabeçalho wdfrequest.h (inclua Wdf.h)
biblioteca Wdf01000.sys (consulte o Controle de Versão da Biblioteca da Estrutura.)
IRQL <=DISPATCH_LEVEL
regras de conformidade de DDI DriverCreate(kmdf)

Consulte também

WdfPdoInitAllowForwardingRequestToParent