Compartilhar via


Usando filas de E/S de Power-Managed

Quando um driver cria uma fila de E/S, ele pode especificar se a fila é gerenciada por energia. Quando as solicitações de E/S estão disponíveis em uma fila gerenciada por energia, a estrutura entrega as solicitações ao driver somente se o dispositivo estiver em seu estado de trabalho (D0). A estrutura não permite que o dispositivo deixe seu estado de trabalho até que todas as solicitações de E/S que a estrutura entregou da fila gerenciada por energia para o driver tenham sido concluídas, canceladas ou adiadas.

Para obter mais informações sobre filas de E/S gerenciadas por energia, consulte Gerenciamento de energia para filas de E/S.

Funções de retorno de chamada para filas de Power-Managed

Se o driver usar filas de E/S gerenciadas por energia, ele poderá fornecer duas funções de retorno de chamada adicionais:

EvtIoStop
A função de retorno de chamada EvtIoStop para de processar uma solicitação de E/S especificada. Quando o dispositivo deixa seu estado de trabalho (D0) ou é removido, a estrutura chama a função de retorno de chamada EvtIoStop de uma fila de E/S uma vez para cada solicitação de E/S que o driver não concluiu, incluindo solicitações que o driver possui e aquelas que ele encaminhou para um destino de E/S.

EvtIoResume
A função de retorno de chamada EvtIoResume retoma o processamento de uma solicitação de E/S interrompida anteriormente. A estrutura chama a função de retorno de chamada EvtIoResume de uma fila de E/S quando retoma a entrega de solicitações de E/S ao driver da fila, depois que o dispositivo retorna ao seu estado de trabalho.

Sempre que a estrutura chama a função de retorno de chamada EvtIoStop de um driver, a função normalmente conclui ou cancela a solicitação de E/S ou chama WdfRequestStopAcknowledge para retornar a propriedade da solicitação para a estrutura.

Ao fazer isso é opcional, você deve, em geral, fornecer uma função de retorno de chamada EvtIoStop para uma fila gerenciada por energia. Ao fornecer o EvtIoStop, o driver pode ajudar a reduzir o tempo decorrido antes do dispositivo e, possivelmente, o sistema, entra em um estado de baixa potência.

Se você não fornecer EvtIoStop para uma fila gerenciada por energia, a estrutura aguardará até que todas as solicitações entregues da fila gerenciada por energia para o driver sejam concluídas antes de mover o dispositivo (ou sistema) para um estado de energia inferior ou remover o dispositivo. Potencialmente, essa inação pode impedir que um sistema insira seu estado de hibernação ou outro estado de baixa energia do sistema. Em casos extremos, isso pode fazer com que o sistema falhe com o código de verificação de bugs 9F.

Se o driver não encaminhar solicitações para um destino de E/S e não realizar solicitações por um tempo indeterminado, você poderá omitir EvtIoStop com segurança para uma fila gerenciada por energia.

Aguardando objetos Dispatcher

Em geral, os drivers devem usar apenas objetos dispatcher como mecanismos de sincronização dentro de um contexto de thread nonarbitrary.

Como os manipuladores de solicitação são executados em um contexto de thread arbitrário, um manipulador de solicitação para uma fila gerenciada por energia não deve esperar que os objetos do dispatcher do kernel sejam definidos. Isso pode resultar em deadlock.

Para obter mais informações sobre quando um driver pode esperar por objetos dispatcher e o que fazer quando não puder, consulte Introdução aos objetos do Dispatcher do Kernel.