Gerenciando filas de E/S

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 fornecer solicitações de E/S ao driver após o retorno da função de retorno de chamada EvtDriverDeviceAdd do driver.

Se o driver estiver usando filas de E/S gerenciadas por energia , a estrutura não poderá começar a fornecer solicitações ao driver até que o dispositivo entre em seu estado de trabalho e a estrutura tenha chamado a função de retorno de chamada EvtDeviceD0Entry do 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 usar filas de E/S gerenciadas por energia, a estrutura interromperá automaticamente as filas de um dispositivo quando o dispositivo deixar seu estado de trabalho (D0) e a estrutura reiniciará as filas quando o estado do dispositivo retornar para D0.

Adicionando solicitações a uma fila de E/S

Quando o sistema envia uma solicitação de controle de E/S de leitura, gravação ou dispositivo para um driver, a estrutura coloca a solicitação em uma 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 redirecionar solicitações recebidas da estrutura chamando WdfRequestForwardToIoQueue.

Obtendo solicitações de uma fila de E/S

Se um driver especificar o método de expedição 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 expedição manual ou sequencial, ele poderá obter solicitações chamando WdfIoQueueRetrieveNextRequest ou WdfIoQueueRetrieveRequestByFileObject.

Pesquisando uma solicitação de E/S

Se um driver especificar o método de expedição manual para uma fila de E/S, ele poderá usar as seguintes etapas para pesquisar solicitações específicas na fila:

  1. Chame WdfIoQueueFindRequest para localizar uma solicitação que corresponda aos critérios especificados pelo driver.

  2. Chame WdfIoQueueRetrieveFoundRequest para recuperar a solicitação que WdfIoQueueFindRequest localizou.

Limpar ou esvaziar 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 solicitações de E/S na fila, permitindo que todas as solicitações que já estão na fila sejam entregues ao driver.

Normalmente, os drivers limpam ou esvaziam suas filas somente se as filas não forem gerenciadas por energia. Para filas de E/S gerenciadas por energia, os drivers podem fornecer funções de retorno de chamada EvtIoStop e EvtIoResume .

Se algumas das filas do driver não forem gerenciadas por energia, talvez você queira limpar ou esvaziar uma fila se o dispositivo associado ou o canal de E/S ficar indisponível. Normalmente, você limpará, em vez de esvaziar, 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 esvaziaria suas filas.

Se você quiser que o driver limpe ou escorra uma fila de E/S, o driver pode chamar um dos seguintes métodos de objeto de fila:

Tenha cuidado ao chamar WdfIoQueueDrain e WdfIoQueueDrainSynchronously. Como uma operação de esvaziamento aguarda a conclusão das solicitações, você só deve esvaziar 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 requeira a solicitação em uma fila de E/S diferente. Para fazer isso, o driver chama WdfRequestForwardToIoQueue ou WdfRequestForwardToParentDeviceIoQueue, que adiciona a solicitação à parte final de uma fila especificada. Eventualmente, a estrutura entregará a solicitação ao driver novamente usando o método de expedição 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 Requeuing I/S Requests.

Interceptando uma solicitação de E/S antes de ser enfileirada

É possível que um driver intercepte uma solicitação de E/S antes que a estrutura coloque a solicitação em uma fila de E/S. Para interceptar solicitações de E/S, o driver deve chamar WdfDeviceInitSetIoInCallerContextCallback para registrar uma função de retorno de chamada EvtIoInCallerContext .

A estrutura associa a função de retorno de chamada EvtIoInCallerContext a um dispositivo. Como resultado, a estrutura chama a função de retorno de chamada EvtIoInCallerContext sempre 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 fornece a solicitação de volta para a estrutura. Em seguida, a estrutura pode 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 .

O principal motivo pelo qual um driver pode fornecer uma função de retorno de chamada EvtIoInCallerContext é que o driver precisa lidar com operações de E/S que dão suporte ao método de E/S chamado nem buffer nem E/S direto. Para esse método de E/S, o driver deve acessar buffers recebidos no contexto de processo do originador da solicitação de E/S. Para obter mais informações, consulte Acessando buffers de dados em drivers de Framework-Based.

Obtendo propriedades da fila de E/S

Para obter propriedades de um objeto de fila de estrutura, o driver pode chamar os seguintes métodos: