Rotinas DispatchPower

A rotina DispatchPower de um driver dá suporte ao gerenciamento de energia manipulando IRPs para o código de função de E/ S IRP_MJ_POWER . Associados ao código da função IRP_MJ_POWER são vários códigos de função de E/S secundários para o Gerenciamento de Energia. O power manager usa esses códigos de função secundários para direcionar os drivers para alterar os estados de energia, aguardar e responder a eventos de ativação do sistema e consultar drivers sobre seus dispositivos.

A rotina DispatchPower de cada driver executa as seguintes tarefas:

  • Manipule o IRP, se possível.

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

  • Se um driver de ônibus, execute a operação de energia solicitada no dispositivo e conclua o IRP.

Todos os drivers de 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 filtro tem permissão para falhar no IRP. A maioria dos drivers de função e filtro executa algum processamento ou define uma rotina IoCompletion para cada IRP de energia e, em seguida, passa o IRP para o próximo driver inferior sem concluí-lo. Eventualmente, o IRP atinge o driver de ônibus, o que altera fisicamente o estado de energia do dispositivo, se necessário, e conclui o IRP.

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

Os IRPs de energia que ativam um dispositivo devem ser manipulados primeiro pelo driver mais baixo na pilha do dispositivo (o driver de ônibus subjacente) e, em seguida, por cada driver sucessivo na pilha. Os IRPs de energia que desligam um dispositivo devem ser manipulados primeiro pelo driver na parte superior da pilha do dispositivo e, em seguida, por cada driver sucessivo descendo a pilha.

Tratamento especial para dispositivos removíveis

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

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

  • Defina Irp-IoStatus.Status> como STATUS_DELETE_PENDING.

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

  • Retornar STATUS_DELETE_PENDING.