Requeuing de solicitações de E/S

Os drivers podem redirecionar solicitações de E/S obtidas de uma fila de E/S. Um driver pode redirecionar uma solicitação de E/S para outra fila de E/S que o driver criou para o mesmo dispositivo. Além disso, um motorista de ônibus pode redirecionar uma solicitação de E/S da fila de E/S de um dispositivo filho para a fila de E/S de um dispositivo pai.

Enfileirar novamente uma solicitação de E/S para uma fila de E/S diferente para um dispositivo

Depois que os manipuladores de solicitação de um driver recebem uma solicitação de E/S da fila de E/S de um driver, o driver pode chamar WdfRequestForwardToIoQueue para redirecionar a solicitação para outra fila.

Por exemplo, se você quiser que o driver aloque recursos para uma solicitação antes de processar a solicitação, a função de retorno de chamada EvtIoDefault do driver poderá receber todas as solicitações, armazenar informações de recurso na memória de contexto de cada solicitação e, em seguida, chamar WdfRequestForwardToIoQueue para redirecionar cada solicitação para uma fila adicional.

Se o driver chamar WdfRequestForwardToIoQueue para solicitar novamente uma solicitação de E/S obtida de uma fila de E/S que esteja usando o método de expedição sequencial, a estrutura fornecerá a próxima solicitação de E/S da fila sequencial para o driver sem aguardar a conclusão da solicitação sequencial.

Se o driver estiver usando o método de expedição manual, ele poderá chamar o método WdfRequestRequeue para retornar uma solicitação de E/S para o cabeçalho da fila de E/S da qual o driver a obteve. Depois de chamar WdfRequestRequeue, a próxima chamada do driver para WdfIoQueueRetrieveNextRequest recupera a solicitação requeued.

Enfileirar novamente uma solicitação de E/S para a fila de E/S de um dispositivo pai

Um driver de função para um dispositivo pai pode atuar como um driver de barramento que enumera os dispositivos filho do dispositivo pai e cria PDOs ( objetos de dispositivo físico ) para os dispositivos filho. Às vezes, esses drivers podem receber solicitações de E/S para um dispositivo filho que o dispositivo pai deve manipular.

Por exemplo, um barramento de protocolo (como USB) normalmente controla os recursos de hardware atribuídos a cada dispositivo conectado. Portanto, o driver de função para o barramento pai normalmente lida com operações de E/S para cada dispositivo filho. Quando o gerenciador de E/S envia uma solicitação de E/S para a pilha de dispositivos de um dos dispositivos filho, o driver de função do barramento recebe a solicitação de E/S em uma das filas de E/S do dispositivo filho, porque esse driver criou o PDO do dispositivo filho. Antes que o driver possa processar a solicitação de E/S no contexto do dispositivo de barramento pai, ele deve redirecionar a solicitação de E/S da fila de E/S do dispositivo filho para uma fila de E/S que pertença ao dispositivo pai.

No entanto, os drivers não podem chamar WdfRequestForwardToIoQueue para mover solicitações da fila de um filho para a fila do pai. Como o gerenciador de E/S cria pilhas de dispositivo separadas para os dispositivos pai e filho, o objeto de dispositivo WDM subjacente deve primeiro ser alterado de um que represente o dispositivo filho para um que represente o pai.

Antes da versão 1.9 do KMDF, os drivers podiam enviar solicitações de E/S de um dispositivo filho para seu pai apenas criando destinos de E/S remotos, aumentando o tamanho da pilha de dispositivos do dispositivo filho e especificando o objeto de dispositivo WDM correto.

A partir do KMDF versão 1.9, um driver pode chamar WdfPdoInitAllowForwardingRequestToParent antes de criar um dispositivo filho e, em seguida, chamar WdfRequestForwardToParentDeviceIoQueue para redirecionar uma solicitação da fila de E/S do filho para uma fila pai. Se um driver usarWdfPdoInitAllowForwardingRequestToParent e WdfRequestForwardToParentDeviceIoQueue, a estrutura aumentará o tamanho da pilha do dispositivo filho e atribuirá o objeto de dispositivo WDM correto à solicitação de E/S.