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.
Iniciando uma fila de E/S
Quando um driver chama WdfIoQueueCreate para criar uma fila de E/S, a estrutura habilita automaticamente a fila para receber solicitações de E/S e entregá-las a um driver.
Os drivers normalmente chamam WdfIoQueueCreate de dentro de uma função de retorno de chamada EvtDriverDeviceAdd. A estrutura pode começar a entregar solicitações de E/S para o driver depois que o do driver EvtDriverDeviceAdd função de retorno de chamada retorna.
Se o driver estiver usando filas de E/S de gerenciadas por energia, o framework não poderá começar a entregar solicitações ao driver até que o dispositivo entre em seu estado operacional e o framework tenha chamado a função callbackEvtDeviceD0Entrydo driver.
Parando e reiniciando uma fila de E/S
Seu driver pode chamar WdfIoQueueStop ou WdfIoQueueStopSynchronously para impedir temporariamente que a estrutura entregue solicitações de E/S de uma fila de E/S. Para retomar a entrega de solicitações de E/S, o driver chama WdfIoQueueStart.
Se o driver usa filas de E/S gerenciadas por energia, a estrutura interrompe automaticamente as filas de um dispositivo quando o dispositivo sai de seu estado de trabalho (D0) e a estrutura reinicia as filas quando o estado do dispositivo retorna a D0.
Adicionando solicitações a uma fila de E/S
Quando o sistema envia uma solicitação de leitura, gravação ou controle de E/S de dispositivo para um driver, a arquitetura coloca a solicitação numa fila de E/S. O driver pode controlar os tipos de solicitações que a estrutura armazena em cada fila chamando WdfDeviceConfigureRequestDispatching.
Um driver também pode enfileirar novamente as solicitações que recebeu da estrutura, chamando WdfRequestForwardToIoQueue.
Obtendo solicitações de uma fila de E/S
Se um driver especificar o método de despacho de sequencial ou paralelo para uma fila de E/S, ele receberá solicitações em manipuladores de solicitação.
Se um driver especificar o método de despacho manual ou sequencial, ele poderá obter solicitações chamando WdfIoQueueRetrieveNextRequest ou WdfIoQueueRetrieveRequestByFileObject.
Procurando uma solicitação de E/S
Se um driver especificar o método de despacho de manual para uma fila de E/S, ele poderá usar as seguintes etapas para pesquisar solicitações específicas na fila:
Chame WdfIoQueueFindRequest para localizar uma solicitação que corresponda aos critérios especificados pelo driver.
Chame WdfIoQueueRetrieveFoundRequest para recuperar a solicitação que WdfIoQueueFindRequest encontrou.
Limpeza ou drenagem de uma fila de E/S
Limpar uma fila de E/S significa interromper a inserção de solicitações de E/S na fila e cancelar todas as solicitações que já estão na fila.
Esvaziar uma fila de E/S significa interromper a inserção de pedidos de E/S na fila, permitindo que quaisquer pedidos que já estão na fila sejam entregues ao driver.
Os motoristas normalmente limpam ou drenam suas filas somente se elas não forem gerenciadas pela energia. Para filas de E/S geridas por energia, os drivers podem fornecer as funções de retorno de chamada EvtIoStop e EvtIoResume.
Se algumas das filas do driver não forem geridas por energia, poderá querer eliminar ou drenar uma fila se o dispositivo associado ou o canal de E/S ficarem indisponíveis. Normalmente, você limpará, em vez de drenar, uma fila, a menos que haja uma alta probabilidade de que cada solicitação contenha informações muito importantes. Por exemplo, um driver para um dispositivo de rede pode limpar suas filas, enquanto um driver para um dispositivo de armazenamento provavelmente drenaria suas filas.
Se quiser que o controlador limpe ou esvazie uma fila de E/S, pode invocar um dos seguintes métodos de objeto de fila:
WdfIoQueuePurge ou WdfIoQueuePurgeSynchronously, para interromper o enfileiramento de solicitações de E/S para uma fila de E/S e cancelar solicitações não processadas.
WdfIoQueueDrain ou WdfIoQueueDrainSynchronously, para interromper o enfileiramento de solicitações de E/S para uma fila de E/S e, ao mesmo tempo, permitir que solicitações já enfileiradas sejam entregues e processadas.
Tenha cuidado ao chamar WdfIoQueueDrain e WdfIoQueueDrainSynchronously. Como uma operação de drenagem aguarda a conclusão das solicitações, você só deve drenar uma fila se tiver certeza de que as solicitações pendentes da fila serão concluídas em tempo hábil. Se você não souber quanto tempo as solicitações de E/S levarão para serem concluídas e for aceitável cancelar solicitações pendentes, considere limpar a fila.
Movendo solicitações de uma fila de E/S para outra
Depois que o driver receber uma solicitação de E/S, talvez você queira que o driver coloque a solicitação novamente em outra fila de E/S. Para fazer isso, o driver chama WdfRequestForwardToIoQueue ou WdfRequestForwardToParentDeviceIoQueue, que adiciona a solicitação à cauda de uma fila especificada. Eventualmente, a estrutura vai entregar novamente a solicitação ao controlador, usando o método de despacho da fila especificada. Para obter mais informações sobre como mover solicitações de E/S de uma fila de E/S para outra, consulte Enfileiramento de solicitações de E/S.
intercetando uma solicitação de E/S antes que ela seja colocada na fila
É possível que um driver intercete uma solicitação de E/S antes que a estrutura coloque a solicitação em uma fila de E/S. Para intercetar solicitações de E/S, o driver deve chamar WdfDeviceInitSetIoInCallerContextCallback para registar uma função de retorno de chamada EvtIoInCallerContext.
A estrutura associa a função de callback EvtIoInCallerContext a um dispositivo. Como resultado, a estrutura chama o EvtIoInCallerContext função de retorno de chamada toda vez que recebe uma solicitação que o sistema está enviando para o dispositivo.
Normalmente, quando uma função de retorno de chamada EvtIoInCallerContext recebe uma solicitação, ela executa algum processamento preliminar para a solicitação. Em seguida, a função de retorno de chamada chama WdfDeviceEnqueueRequest, que devolve a solicitação ao framework. A estrutura pode então colocar a solicitação na fila de E/S adequada, assim como faria se não tivesse chamado a função de retorno de chamada EvtIoInCallerContext.
A principal razão pela qual um driver pode fornecer uma função de retorno de chamada EvtIoInCallerContext é que o driver tem que lidar com operações de E/S que suportam o método de E/S chamado , que não utiliza nem E/S direta nem em buffer. Para esse método de E/S, o driver deve acessar os buffers recebidos no contexto do processo do originador da solicitação de E/S. Para obter mais informações, consulte Acessando buffers de dados no Framework-Based Drivers.
Obtendo propriedades da fila de E/S
Para obter propriedades de um objeto de fila de framework, o driver pode chamar os seguintes métodos:
WdfIoQueueGetDevice, para obter um identificador para o objeto de dispositivo ao qual o objeto de fila pertence.
WdfIoQueueGetState, para obter informações de estado sobre a fila.