Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os controladores podem re-enfileirar as solicitações de E/S que obtêm de uma fila de E/S. Um driver pode reencaminhar uma solicitação de E/S para outra fila de E/S que o mesmo driver criou para o dispositivo. Além disso, um driver de barramento pode recomputar 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.
Reencaminhando uma solicitação de E/S para uma fila de E/S diferente para um dispositivo
Depois que os gestores de pedidos de um driver recebem uma solicitação de E/S da fila de E/S de um driver, o driver pode chamar WdfRequestForwardToIoQueue para reencaminhar a solicitação para outra fila.
Por exemplo, se você quiser que o driver aloque recursos para uma solicitação antes de processá-la, a função de retorno de chamada EvtIoDefault do driver poderá receber todas as solicitações, armazenar informações de recursos na memória de contexto de cada solicitação e, em seguida, chamar WdfRequestForwardToIoQueue para enfileirar novamente cada solicitação para uma fila adicional.
Se o driver chamar WdfRequestForwardToIoQueue para repassar uma solicitação de E/S que o driver obteve de uma fila de E/S que está a usar o método de despacho sequencial, a estrutura entregará a próxima solicitação de E/S da fila sequencial ao driver sem esperar pela conclusão do pedido que foi repassado.
Se o driver estiver usando o método de despacho 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 faz com que a solicitação reenfileirada seja recuperada.
Enfileirando 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 filhos do dispositivo pai e cria objetos de dispositivo físico (ODP) para os dispositivos filhos. À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 funcional para o barramento pai normalmente lida com operações de E/S para cada dispositivo filho. Quando o gestor de E/S envia uma solicitação de E/S para a pilha de dispositivos de um dos dispositivos filho, o driver do barramento recebe a solicitação de E/S em uma fila de E/S do dispositivo filho, porque esse driver criou o Objeto do Dispositivo Físico (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 realinhar 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 uma criança para a fila de um pai. Como o gestor de E/S cria pilhas de dispositivos separadas para os dispositivos pai e filho, o objeto de dispositivo WDM subjacente deve primeiro ser alterado de um que representa o dispositivo filho para outro que representa o dispositivo pai.
Antes da versão 1.9 do KMDF, os drivers podiam enviar pedidos de E/S de um dispositivo filho para o respetivo dispositivo pai apenas criando alvos de E/S remotos, aumentando o tamanho da pilha do dispositivo filho e especificando o objeto de dispositivo WDM correto.
A partir da versão 1.9 do KMDF, um driver pode chamar WdfPdoInitAllowForwardingRequestToParent antes de criar um dispositivo filho e, em seguida, chamar WdfRequestForwardToParentDeviceIoQueue para reenfileirar uma solicitação da fila de E/S do dispositivo filho para a fila do dispositivo pai. Se um driver usaWdfPdoInitAllowForwardingRequestToParent e WdfRequestForwardToParentDeviceIoQueue, o framework aumenta o tamanho do stack de dispositivos do filho e atribui o objeto de dispositivo WDM correto à solicitação de E/S.