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.
A operação de E/S em andamento de um dispositivo (como uma solicitação para ler vários blocos de um disco) pode ser cancelada por um aplicativo, pelo sistema ou por um driver. Se a operação de E/S de um dispositivo for cancelada, o gerenciador de E/S tentará cancelar todas as solicitações de E/S não processadas associadas à operação de E/S. Os drivers do dispositivo podem se registrar para serem notificados quando o gerente de E/S tentar cancelar solicitações de E/S, e os drivers podem cancelar as solicitações que possuem completando-as com um status de conclusão de STATUS_CANCELLED.
O framework lida com parte do trabalho de cancelamento para drivers baseados no framework. Se a operação de E/S de um dispositivo for cancelada, a estrutura concluirá as seguintes solicitações de E/S (com um status de conclusão de STATUS_CANCELLED) associadas à operação cancelada:
Solicitações de E/S que não foram entregues e que a estrutura colocou na fila padrão de E/S do driver.
Pedidos de E/S não entregues que a estrutura encaminhou para outra fila porque o driver chamou WdfDeviceConfigureRequestDispatching.
Como a estrutura cancela essas solicitações, ela não as entrega ao motorista.
Após o framework entregar uma solicitação de E/S ao driver, o driver é proprietário da solicitação e o framework não pode cancelá-la. Neste ponto, apenas o driver pode cancelar a solicitação de E/S, mas a estrutura deve notificar o driver de que uma solicitação deve ser cancelada. Os drivers recebem esta notificação fornecendo uma função de retorno de chamada EvtRequestCancel.
Às vezes, um driver recebe uma solicitação de E/S de uma fila de E/S, mas, em vez de processar a solicitação, o driver coloca a solicitação novamente na fila para a mesma ou outra fila de E/S para processamento posterior. Exemplos desta situação incluem o seguinte:
A estrutura entrega uma solicitação de E/S a um dos manipuladores de solicitação do driver, e o driver em seguida chama WdfRequestForwardToIoQueue (ou WdfRequestForwardToParentDeviceIoQueue) para colocar a solicitação numa fila diferente ou WdfRequestRequeue para colocar a solicitação de volta na mesma fila.
A estrutura entrega uma solicitação de E/S para a função de retorno de chamada EvtIoInCallerContext do driver, o driver chama WdfDeviceEnqueueRequest para passar a solicitação de volta para a estrutura, que posteriormente coloca a solicitação em uma das filas de E/S do driver.
Nesses casos, a estrutura pode cancelar a solicitação de E/S porque a solicitação está em uma fila de E/S. No entanto, se o driver tiver registado uma função de retorno de chamada EvtIoCanceledOnQueue para a fila de E/S na qual a solicitação se encontra, a estrutura irá chamar essa função de retorno de chamada em vez de cancelar a solicitação, quando a operação de E/S associada estiver a ser cancelada. Se a estrutura chamar o do driver EvtIoCanceledOnQueue função de retorno de chamada, o driver deve concluído a solicitação.
Em resumo, quando uma operação de E/S é cancelada, a estrutura sempre cancela todas as solicitações de E/S associadas que nunca foram entregues ao driver. Se o driver receber uma solicitação e, em seguida, colocá-la novamente na fila, a estrutura cancelará a solicitação, desde que ela esteja na fila, a menos que o driver forneça uma função de retorno de chamada EvtIoCanceledOnQueue para a fila de E/S.
Chamando WdfRequestMarkCancelable ou WdfRequestMarkCancelableEx
Um driver pode chamar WdfRequestMarkCancelable ou WdfRequestMarkCancelableEx para registrar uma função de retorno de chamada EvtRequestCancel. Se o driver tiver chamado WdfRequestMarkCancelable ou WdfRequestMarkCancelableExe se a operação de E/S associada à solicitação for cancelada, a estrutura chamará a função de retorno de chamada EvtRequestCancel do driver, permitindo que este cancele a solicitação de E/S.
Um driver deve chamar WdfRequestMarkCancelable ou WdfRequestMarkCancelableEx se ele possuir uma solicitação por um tempo relativamente longo. Por exemplo, um driver pode ter que esperar que um dispositivo responda ou pode esperar que os drivers inferiores concluam um conjunto de solicitações que o driver criou quando recebeu uma única solicitação.
Se um driver não chamar WdfRequestMarkCancelable ou WdfRequestMarkCancelableEx, ou se um driver chamar WdfRequestUnmarkCancelable depois de chamar WdfRequestMarkCancelable ou WdfRequestMarkCancelableEx, o driver não está ciente do cancelamento e, portanto, lida com a solicitação normalmente.
Chamada de WdfRequestIsCanceled
Se um driver não tiver chamado WdfRequestMarkCancelable ou WdfRequestMarkCancelableEx para registar uma função de retorno de chamada EvtRequestCancel, pode chamar WdfRequestIsCanceled para determinar se o gestor de E/S tentou cancelar uma solicitação de E/S. Se WdfRequestIsCanceled retornar TRUE e o driver for o proprietário da solicitação, o driver deverá cancelar a solicitação. Se o driver não for o proprietário da solicitação, este não deve chamar WdfRequestIsCanceled.
Um driver que não chamou WdfRequestMarkCancelable ou WdfRequestMarkCancelableEx pode chamar WdfRequestIsCanceled nas seguintes circunstâncias:
Um driver que aguarda interrupções de dispositivo pode chamar WdfRequestIsCanceled a partir da função de retorno de chamada EvtInterruptDpc.
Um driver que sonda o seu dispositivo pode chamar WdfRequestIsCanceled a partir do seu thread de sondagem.
Um driver que divide uma transação DMA em várias transferências menores pode chamar WdfRequestIsCanceled após a conclusão de cada transferência.
Um driver que recebe uma solicitação de leitura ou gravação grande, que ele próprio divide em várias solicitações menores, pode chamar WdfRequestIsCanceled depois que o destino de E/S do driver concluir cada uma das solicitações menores, caso o driver não tenha chamado WdfRequestMarkCancelable ou WdfRequestMarkCancelableEx para a solicitação recebida.
Cancelar o pedido
O cancelamento de uma solicitação de E/S pode envolver qualquer um dos seguintes:
Interrompendo uma operação de E/S em andamento.
Não encaminhar a solicitação para um destino de E/S.
Chamar WdfRequestCancelSentRequest para tentar cancelar uma solicitação que o driver havia enviado anteriormente para um destino de E/S.
Se um driver estiver cancelando uma solicitação de E/S para um objeto de solicitação que o driver recebeu da estrutura, o driver sempre deverá concluir a solicitação chamando WdfRequestComplete, WdfRequestCompleteWithInformationou WdfRequestCompleteWithPriorityBoost, com um Status parâmetro de STATUS_CANCELLED. (Se o driver chamou WdfRequestCreate para criar um objeto de solicitação, o driver chamará WdfObjectDelete em vez de concluir a solicitação.)
Sincronização do cancelamento
Para obter informações sobre como sincronizar o código que cancela solicitações de E/S, consulte: