Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Somente o motorista que enviou um IRP de espera/despertar pode cancelar esse IRP.
Um motorista pode precisar cancelar um IRP pendente de espera/despertar nas seguintes circunstâncias:
O driver recebe uma solicitação PnP IRP_MN_STOP_DEVICE, IRP_MN_QUERY_REMOVE_DEVICE, IRP_MN_REMOVE_DEVICE ou IRP_MN_SURPRISE_REMOVAL para o dispositivo. O driver deve reemitir o IRP de espera/despertar (PoRequestPowerIrp) depois que o dispositivo for reiniciado.
O sistema vai entrar em suspensão, mas o dispositivo não deve ser ativado para despertar o sistema.
Por exemplo, o driver do hub USB pode enviar uma solicitação IRP_MN_WAIT_WAKE na inicialização do dispositivo, caso mais tarde coloque um dos seus dispositivos de entrada em estado de suspensão. Enquanto o sistema está no estado de trabalho, um sinal de despertar do dispositivo retorna o dispositivo para o estado de trabalho (mas não tem efeito sobre o estado de energia do sistema). Quando o sistema se prepara para desligar, o driver do hub USB cancela este IRP se o dispositivo não deve ter permissão para despertar o sistema.
O sistema está entrando em um estado de suspensão do qual o dispositivo não pode despertá-lo. Ou seja, ele está entrando em um estado de alimentação menos potente ao valor SystemWake especificado na estrutura de DEVICE_CAPABILITIES.
O dispositivo está entrando em um estado de energia a partir do qual ele não pode responder a um sinal de despertar. Ou seja, ele está entrando em um estado menos potente do que o valor DeviceWake especificado em sua estrutura DEVICE_CAPABILITIES .
Para cancelar um IRP de espera/despertar, o driver que enviou o IRP chama IoCancelIrp, passando o ponteiro para o IRP que foi retornado anteriormente quando o driver chamou PoRequestPowerIrp.
Um condutor não deve cancelar um IRP de espera/despertar que não enviou.
Cancelar rotinas para IRPs de espera/despertar
Muitos motoristas de função e ônibus devem definir rotinas de cancelamento para IRPs pendentes de espera/despertar; Os seguintes tipos de condutores devem definir essas rotinas:
Drivers que alteram as configurações do dispositivo para ativar ou desativar o despertar.
Drivers que enviam solicitações IRP_MN_WAIT_WAKE para drivers de dispositivos pai.
Uma rotina de cancelamento permite que um controlador desative a funcionalidade de acordar do seu dispositivo e limpe todos os dados relacionados ao IRP de espera/acordar pendente. Os drivers que solicitam IRPs de espera/despertar para dispositivos pai também podem cancelar esses IRPs.
Na sua rotina de espera/vigília Cancelar , o condutor deve seguir os seguintes passos:
Chame IoSetCancelRoutine para redefinir a rotina Cancel do IRP para NULL.
Chame IoReleaseCancelSpinLock, passando o CancelIRQL especificado no IRP para liberar o spin lock de cancelamento para o IRP.
Redefina todos os campos relevantes na extensão do dispositivo. Por exemplo, quando um IRP de espera/despertar está pendente, a maioria dos drivers define um indicador e mantém um ponteiro para o IRP na extensão do dispositivo.
Observe que é possível que um motorista receba um IRP de espera/despertar enquanto está cancelando outro IRP desse tipo. O controlador deve verificar se já tem um IRP sob proteção de bloqueio de rotação (ou seu equivalente). Em caso afirmativo, o driver deve sincronizar cuidadosamente a sua gestão para garantir que cancela o IRP correto. Para obter mais informações sobre como usar bloqueios de rotação em rotinas Cancel, consulte Cancelar IRPs.
Altere todas as configurações necessárias do dispositivo. Por exemplo, um driver de modem desativaria a configuração de despertar do dispositivo.
Defina Irp-IoStatus.Status> como STATUS_CANCELLED.
Chame IoCompleteRequest para completar o IRP de espera/despertar, especificando IO_NO_INCREMENT.
Se o driver solicitou anteriormente um IRP_MN_WAIT_WAKE relacionado para um dispositivo pai, o driver deve cancelar esse IRP de dentro da sua rotina Cancelar. O motorista deve liberar o bloqueio de rotação de cancelamento antes de cancelar o IRP do pai.
Por exemplo, um driver que atua como driver de barramento para um dispositivo e possui o driver de gestão de energia para o seu controlador principal deve cancelar o IRP de espera/despertar relacionado que enviou anteriormente para o seu controlador principal. Chamar IoCancelIrp invocaria a rotina Cancel do pai e assim por diante na pilha de dispositivos.