Função WdfRequestForwardToParentDeviceIoQueue (wdfrequest.h)

[Aplica-se somente ao KMDF]

O método WdfRequestForwardToParentDeviceIoQueue recoloca 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 do filho.

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.

Retornar valor

WdfRequestForwardToParentDeviceIoQueue retornará STATUS_SUCCESS se a operação for bem-sucedida. Caso contrário, esse método pode 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 dos seguintes 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 destino são as mesmas.
  • A fila de E/S especificada não pertence ao dispositivo pai.
  • O driver habilitou o progresso de encaminhamento garantido e a solicitação de E/S especificada está reservada para situações de baixa memória.
  • 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.

Um bug marcar ocorrerá se o driver fornecer um identificador de objeto inválido.

Comentários

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

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

Se o driver chamar WdfRequestForwardToParentDeviceIoQueue para enfileirar novamente uma solicitação de E/S, o driver não deverá usar o objeto de solicitação como 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 dispositivo pai , 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 os objetos de solicitação do dispositivo filho 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 requeuidas. Portanto, lembre-se de que, no momento em que a estrutura exclui um objeto de solicitação requeutado, ele pode já 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 da execução da função EvtCleanupCallback ou EvtDestroyCallback .

Para obter mais informações sobre WdfRequestForwardToParentDeviceIoQueue, consulte Requeuing I/O 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, ele requeusa 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
Plataforma de Destino Universal
Versão mínima do KMDF 1,9
Cabeçalho wdfrequest.h (inclua Wdf.h)
Biblioteca Wdf01000.sys (consulte Controle de versão da biblioteca de estrutura.)
IRQL <=DISPATCH_LEVEL
Regras de conformidade da DDI DriverCreate(kmdf)

Confira também

WdfPdoInitAllowForwardingRequestToParent