Partilhar via


Manipulando solicitações de energia para periféricos de armazenamento

Um driver de classe de armazenamento é responsável por emitir comandos específicos do dispositivo para lidar com solicitações de energia. Mais comumente, um driver de classe de armazenamento:

  • Bloqueia a E/S em seu dispositivo em resposta a uma solicitação de energia de consulta (IRP_MJ_POWER com IRP_MN_QUERY_POWER) se a manipulação dessa E/S pode impedir que o driver tenha êxito em uma solicitação de energia definida em um período razoável de tempo

  • Define o estado de energia de seu dispositivo em resposta a uma solicitação set-power (IRP_MJ_POWER com IRP_MN_SET_POWER)

  • Reinicia a E/S em seu dispositivo em resposta a uma solicitação set-power para ligar o dispositivo

  • Encaminha solicitações de energia para o driver mais baixo.

Observe que um driver deve chamar PoStartNextPowerIrp e PoCallDriver, não IoCallDriver, para enviar solicitações de energia.

A menos que o driver de classe de armazenamento tenha uma rotina StartIo , ele deve bloquear a fila específica de LU do driver de porta de armazenamento (IRP_MJ_SCSI com SRB_FUNCTION_LOCK_QUEUE) antes de definir o estado de energia do dispositivo, para bloquear operações não sincronizadas até que a operação de energia (que pode envolver várias etapas) seja concluída. Todos os SRBs emitidos para lidar com a operação de energia devem definir SRB_FLAGS_BYPASS_LOCKED_QUEUE para garantir que eles cheguem ao driver de porta. Depois que o driver terminar de definir o estado de energia, ele deverá desbloquear a fila (IRP_MJ_SCSI com SRB_FUNCTION_UNLOCK_QUEUE e SRB_FLAGS_BYPASS_LOCKED_QUEUE) para que o driver de porta possa retomar o envio de IRPs enfileirados para o dispositivo depois que ele for ligado.

Se um driver de classe de armazenamento tiver uma rotina StartIo , essa rotina manipulará a sincronização para que o driver de classe não precise bloquear e desbloquear explicitamente a fila específica de LU do driver de porta.

Um driver de classe não deve tentar ignorar uma fila bloqueada por outro driver.