Partilhar via


Métodos de expedição para solicitações de E/S

Quando um driver chama WdfIoQueueCreate para criar uma fila de E/S, ele especifica um método de expedição para a fila. A estrutura fornece três métodos de expedição: sequencial, paralelo e manual. O driver pode especificar qualquer um desses métodos de expedição para qualquer fila de E/S, incluindo a fila de E/S padrão de um dispositivo.

O driver define o método de expedição de uma fila especificando um valor do tipo WDF_IO_QUEUE_DISPATCH_TYPE na estrutura WDF_IO_QUEUE_CONFIG da fila.

Por exemplo, usos de cada método de expedição, consulte Usos de exemplo de filas de E/S.

Expedição Sequencial

Se o driver ou o dispositivo puder processar apenas uma solicitação de E/S de uma fila por vez, você deverá configurar as filas de E/S do dispositivo para usar a expedição sequencial, que também é chamada de expedição síncrona. Com esse tipo de expedição, a estrutura fornece solicitações ao driver uma de cada vez. A estrutura não entrega a próxima solicitação até que o driver seja concluído, cancelado ou requeuso a solicitação anterior.

Depois que a estrutura entrega uma solicitação a um dos manipuladores de solicitação do driver, o driver processa a solicitação. Se o driver encaminhar a solicitação para um destino de E/S geral, ele normalmente chamará um dos métodos síncronos do objeto de destino de E/S. Para obter mais informações sobre esses métodos, consulte Enviando solicitações de E/S de forma síncrona. O driver deve, eventualmente, concluir ou cancelar todas as solicitações recebidas de uma fila de E/S.

Um driver que configurou uma fila de E/S para expedição sequencial pode chamar WdfIoQueueRetrieveNextRequest ou WdfIoQueueRetrieveRequestByFileObject para obter outra solicitação da fila antes que a última solicitação recebida seja concluída ou cancelada. Talvez você queira fazer isso em um driver de função para que o driver possa iniciar a próxima operação de hardware enquanto a função de retorno de chamada EvtInterruptDpc do driver ainda estiver processando dados da operação de hardware anterior.

Se você criar várias filas de E/S e configurá-las para expedição sequencial, a estrutura enviará solicitações de cada fila sequencialmente, mas as filas serão executadas em paralelo. Se o driver ou dispositivo puder processar apenas uma solicitação por vez de qualquer tipo, você deverá usar uma única fila de E/S com uma função de retorno de chamada EvtIoDefault .

Expedição paralela

Se o driver e o dispositivo puderem processar várias solicitações de E/S simultaneamente, você poderá configurar as filas de E/S do dispositivo para usar a expedição paralela para que o driver possa processar as solicitações de forma assíncrona. Esse método de expedição também é chamado de expedição assíncrona.

Se um driver configurar uma fila de E/S para usar a expedição paralela, a estrutura fornecerá solicitações de E/S ao driver assim que estiverem disponíveis na fila. O resultado é que o driver pode ter que processar várias solicitações ao mesmo tempo.

Sempre que um dos manipuladores de solicitação do driver recebe uma solicitação, o driver deve processar a solicitação e , em seguida, concluir a solicitação. Se o driver encaminhar a solicitação para um destino de E/S geral, ele normalmente chamará um dos métodos assíncronos do objeto de destino de E/S. Para obter mais informações sobre esses métodos, consulte Enviando solicitações de E/S de forma assíncrona. O driver deve, eventualmente, concluir ou cancelar todas as solicitações recebidas de uma fila de E/S.

Um driver que usa expedição paralela pode chamar WdfIoQueueStop ou WdfIoQueueStopSynchronously para interromper temporariamente uma fila e, em seguida, chamar WdfIoQueueStart para reiniciar a fila.

Expedição Manual

Se quiser que o driver tenha controle total sobre a entrega de solicitações de E/S, você pode configurar a fila de E/S de um dispositivo para usar o envio manual, o que significa que a estrutura não fornece solicitações ao driver, a menos que o driver solicite explicitamente uma.

Para obter uma solicitação de uma fila manual, o driver pode chamar WdfIoQueueRetrieveNextRequest ou WdfIoQueueRetrieveRequestByFileObject em um loop que sonda a fila. Como alternativa, o driver pode chamar WdfIoQueueReadyNotify para registrar uma função de retorno de chamada que a estrutura chamará quando uma ou mais solicitações estiverem disponíveis na fila. Depois que a estrutura chamar a função de retorno de chamada, o driver poderá chamar WdfIoQueueRetrieveNextRequest ou WdfIoQueueRetrieveRequestByFileObject em um loop para recuperar as solicitações.

Depois que o driver obtém uma solicitação da fila, ele deve processar a solicitação. O driver deve, eventualmente, concluir ou cancelar cada solicitação.