Usando rotinas do Power Manager para detecção ociosa
O power manager fornece suporte para detecção ociosa por meio das rotinas PoRegisterDeviceForIdleDetection e PoSetDeviceBusy .
Para habilitar a detecção ociosa para seu dispositivo, um proprietário da política de energia do dispositivo chama PoRegisterDeviceForIdleDetection e especifica:
O valor de tempo limite ocioso a ser aplicado quando o sistema otimiza o desempenho.
O valor de tempo limite ocioso a ser aplicado quando o sistema otimiza para conservação.
O estado de energia do dispositivo para o qual o dispositivo deve fazer a transição quando ocioso.
PoRegisterDeviceForIdleDetection retorna um ponteiro para um contador ocioso, que o driver usa posteriormente para desabilitar a detecção ociosa. Os chamadores de PoRegisterDeviceForIdleDetection devem estar em execução no IRQL < DISPATCH_LEVEL.
Um driver pode registrar seu dispositivo para detecção ociosa a qualquer momento após o dispositivo ter sido iniciado e está pronto para lidar com IRPs de energia do dispositivo. Por exemplo, um driver pode habilitar a detecção ociosa como parte de sua rotina IoCompletion para um IRP de dispositivo inicial PnP.
Os valores de tempo limite para qualquer dispositivo determinado devem ser proporcionais à latência de ativação do dispositivo e com base no comportamento observado do dispositivo. Para dispositivos de determinados tipos, um driver pode especificar valores de tempo limite de conservação e desempenho de -1 para usar os tempos limite de política de energia padrão para a classe de dispositivo. Consulte a documentação específica do dispositivo para obter detalhes.
Quando o dispositivo está em uso, o driver deve chamar PoSetDeviceBusy, passando o ponteiro retornado por PoRegisterDeviceForIdleDetection. PoSetDeviceBusy redefine o contador ocioso, reiniciando assim a contagem regressiva ociosa para o dispositivo. O driver deve chamar PoSetDeviceBusy em cada operação de E/S.
Para determinar se o dispositivo está ocioso, o power manager compara o valor do contador ocioso com o valor de tempo limite ocioso especificado pelo driver para a política de energia do sistema atual (conservação ou desempenho). Consulte o SDK do Microsoft Windows para funções relativas à política de energia do sistema.
Quando o dispositivo atende ao valor de tempo limite, o power manager envia um IRP de set-power do dispositivo, especificando o estado de energia do dispositivo que o driver passou em sua chamada para PoRegisterDeviceForIdleDetection. O power manager não envia um IRP de consulta antes de enviar o IRP set-power. Os drivers na pilha lidam com o IRP de set-power como eles lidariam com qualquer outro; eles devem concluí-lo em tempo hábil e não podem falhar. (Consulte Tratamento de IRPs de Power-Down do dispositivo.)
Quando o driver não precisar mais de detecção ociosa ou não estiver preparado para lidar com IRPs de desligar o dispositivo, ele deverá chamar PoRegisterDeviceForIdleDetection novamente, passando zero para os dois valores de tempo limite. Definir os tempos limite como zero desabilita a detecção ociosa para políticas de energia de conservação (bateria) e de desempenho (AC). O driver pode reabilitar rapidamente a detecção ociosa; ele simplesmente chama PoRegisterDeviceForIdleDetection com valores de tempo limite não zero. Depois que o driver tiver registrado o dispositivo, ele poderá habilitar e desabilitar a detecção ociosa alterando os valores de tempo limite, mesmo que o dispositivo tenha sido desligado e desacordado.