Partilhar via


Rotinas DispatchPower

A rotina DispatchPower de um driver suporta a gestão de energia manipulando IRPs para o código de função de I/O IRP_MJ_POWER. Associados ao código de função IRP_MJ_POWER estão vários códigos de função de E/S menores para Gerenciamento de Energia. O gestor de energia utiliza estes códigos de função secundária para direcionar os condutores a alterar os estados de energia, para aguardar e responder a eventos de ativação do sistema e para consultar os controladores sobre os seus dispositivos.

A rotina DispatchPower de cada motorista executa as seguintes tarefas:

  • Manipule o IRP, se possível.

  • Passe o IRP para o próximo driver inferior na pilha de dispositivos, usando PoCallDriver.

  • Se for um driver de barramento, execute a operação de energia solicitada no dispositivo e complete o IRP.

Todos os drivers para um dispositivo devem ter a oportunidade de lidar com IRPs de energia para o dispositivo, exceto em alguns casos em que um driver de função ou de filtro pode falhar o IRP. A maioria dos drivers de função e filtro executam algum processamento ou definem uma rotina IoCompletion para cada IRP de alimentação e, em seguida, passam o IRP para o próximo driver inferior sem concluí-lo. Eventualmente, o IRP atinge o motorista do ônibus, que muda fisicamente o estado de energia do dispositivo, se necessário, e completa o IRP.

Quando o IRP for concluído, o gestor de E/S chamará todas as rotinas IoCompletion definidas pelos drivers à medida que o IRP percorre a pilha de dispositivos. Se um motorista precisa definir uma rotina de conclusão depende do tipo de IRP e dos requisitos individuais do motorista.

IRPs de potência que alimentam um equipamento devem ser manipulados primeiro pelo driver mais baixo na pilha de dispositivos (o driver de barramento subjacente) e, em seguida, por cada driver sucessivo na pilha. Pedidos de Pacote de Solicitação de Energia (IRPs) que desligam um dispositivo devem ser processados primeiro pelo driver no topo da pilha de dispositivos e, em seguida, por cada driver sucessivo descendo a pilha.

Manuseamento especial para dispositivos amovíveis

Em suas rotinas DispatchPower , os drivers de dispositivos removíveis devem verificar se o dispositivo ainda está presente. Se o dispositivo tiver sido removido, o driver não deve passar o IRP para o próximo driver inferior. Em vez disso, o condutor deve fazer o seguinte:

  • Chame PoStartNextPowerIrp para começar a processar o próximo IRP de potência.

  • Defina Irp-IoStatus.Status> como STATUS_DELETE_PENDING.

  • Chame IoCompleteRequest, especificando IO_NO_INCREMENT, para concluir o IRP.

  • Retornar STATUS_DELETE_PENDING.