Partilhar via


Métodos de envio para solicitações de E/S

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

O driver estabelece o método de envio de uma fila especificando um valor do tipo WDF_IO_QUEUE_DISPATCH_TYPE na estrutura da fila WDF_IO_QUEUE_CONFIG.

Para exemplos de utilização de cada método de despacho, consulte Exemplos de Usos das Filas de E/S.

Despacho sequencial

Se o driver ou dispositivo puder processar apenas um pedido de entrada/saída de uma fila de cada vez, deve configurar as filas de E/S do dispositivo para usar o despacho sequencial, também chamado de despacho síncrono. Com esse tipo de despacho, a estrutura entrega solicitações ao motorista uma de cada vez. A plataforma não processa o próximo pedido até que o driver complete, cancele ou reencaminhe o pedido anterior.

Após o framework entregar um pedido a um dos manipuladores de pedidos do driver, o driver processa o pedido. Se o driver encaminhar a solicitação para um destino de E/S geral, ele normalmente chama um dos métodos síncronos do objeto de destino de E/S. Para obter mais informações sobre esses métodos, consulte Envio de Solicitações de E/S de Forma Síncrona. O driver deve concluir ou cancelar eventualmente cada solicitação que recebe de uma fila de E/S.

Um driver que configurou uma fila de E/S para despacho sequencial pode chamar #B0 #A1 WdfIoQueueRetrieveNextRequest #A2 #C3 ou #B4 #A5 WdfIoQueueRetrieveRequestByFileObject #A6 #C7 para obter outro pedido da fila antes que o último pedido recebido tenha sido concluído ou cancelado. Você pode querer fazer isso em um controlador de funções, para que o controlador possa iniciar a próxima operação de hardware enquanto a função de retorno de chamada EvtInterruptDpc do controlador ainda está processando dados da operação de hardware anterior.

Se você criar várias filas de E/S e configurá-las todas para despacho sequencial, a estrutura despachará 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 de cada vez, de qualquer tipo, deve usar uma única fila de E/S com uma função de retorno de chamada EvtIoDefault.

Despacho paralelo

Se o driver e o dispositivo puderem processar várias solicitações de E/S simultaneamente, poderá configurar as filas de E/S do dispositivo para usar despacho paralelo para que o driver possa processar as solicitações de forma assíncrona. Esse método de encaminhamento também é conhecido como encaminhamento assíncrono.

Se um driver configurar uma fila de E/S para usar despacho paralelo, a estrutura entregará 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.

Cada vez que um dos manipuladores de solicitações do condutor recebe uma solicitação, o condutor deve processar a solicitação e, em seguida, concluí-la. Se o driver encaminhar a solicitação para um destino de E/S geral, ele normalmente chama um dos métodos assíncronos do objeto de destino de E/S. Para obter mais informações sobre esses métodos, consulte Envio de pedidos de E/S de forma assíncrona. O driver deve, eventualmente, concluir ou cancelar cada pedido que recebe de uma fila de I/O.

Um driver que usa despacho paralelo pode chamar WdfIoQueueStop ou WdfIoQueueStopSynchronously para interromper temporariamente uma fila e, em seguida, chamar WdfIoQueueStart para reiniciar a fila.

Despacho Manual

Se quiser que o seu driver tenha controlo total sobre o envio de pedidos de E/S, pode configurar a fila de E/S de um dispositivo para usar despacho manual, o que significa que o framework não entrega pedidos ao driver, a menos que o driver solicite explicitamente um.

Para obter uma solicitação de uma fila manual, o driver pode chamar #B0 #A1 WdfIoQueueRetrieveNextRequest #A2 #C3 ou #B4 #A5 WdfIoQueueRetrieveRequestByFileObject #A6 #C7 em um loop que sonda a fila. Como alternativa, o driver pode invocar WdfIoQueueReadyNotify para registrar uma função callback que a estrutura chamará quando uma ou mais solicitações estiverem disponíveis na lista. Depois que a estrutura chama a função de retorno de chamada, o driver pode chamar #B0 WdfIoQueueRetrieveNextRequest #C1 ou #B2 WdfIoQueueRetrieveRequestByFileObject #C3 em um loop para recuperar as solicitações.

Depois que o driver obtém uma solicitação da fila, ele deve #B0 processar a solicitação #A1 . O motorista deve por fim completar ou cancelar cada solicitação.