Tratamento de IRPs de Power-Up de dispositivo
Os IRPs de energia do dispositivo especificam IRP_MN_SET_POWER e um estado de energia do dispositivo que requer mais energia do que o estado de energia do dispositivo atual. Normalmente, um IRP de energia especifica o estado de trabalho do dispositivo PowerDeviceD0.
As solicitações para ligar um dispositivo devem ser tratadas primeiro pelo driver de ônibus subjacente para o dispositivo e, em seguida, por cada driver sucessivo voltando para cima da pilha.
A figura a seguir mostra as etapas envolvidas no tratamento de um IRP de energia.
Ao lidar com uma solicitação de IRP_MN_SET_POWER de energia, um driver de função ou filtro deve:
Chame IoAcquireRemoveLock para garantir que o driver não receba uma solicitação IRP_MN_REMOVE_DEVICE ao manipular o IRP de energia.
Se IoAcquireRemoveLock retornar uma falha status, o driver não deverá continuar processando o IRP. Em vez disso, a partir do Windows Vista, o driver deve chamar IoCompleteRequest para concluir o IRP e, em seguida, retornar a falha status. No Windows Server 2003, Windows XP e Windows 2000, o driver deve chamar IoCompleteRequest para concluir o IRP e, em seguida, chamar PoStartNextPowerIrp para iniciar o próximo IRP de energia e retornar a falha status.
Chame IoMarkIrpPending para marcar o IRP pendente.
Chame IoCopyCurrentIrpStackLocationToNext para definir o local da pilha IRP. Um driver não deve chamar IoSkipCurrentIrpStackLocation se ele definir uma rotina IoCompletion .
Chame IoSetCompletionRoutine para definir uma rotina de IoCompletion de ativação .
Ao lidar com um IRP de ativação de dispositivo, o driver deve definir uma rotina IoCompletion para restaurar o contexto, liberar o bloqueio de remoção e executar outras tarefas necessárias depois que o IRP for concluído e o dispositivo for ativado. O driver não deve restaurar o contexto antes da conclusão do IRP. Para obter mais informações, consulte Rotinas de IoCompletion para IRPs de energia do dispositivo.
Chame IoCallDriver (no Windows 7 e Windows Vista) ou PoCallDriver (Windows Server 2003, Windows XP e Windows 2000) para passar o IRP para o driver mais baixo. O IRP deve percorrer toda a pilha do dispositivo até o motorista do ônibus. Somente o motorista do ônibus tem permissão para concluir o IRP.
Retornar STATUS_PENDING.
Quando o motorista do ônibus recebe o IRP, ele deve primeiro marcar para garantir que o dispositivo ainda esteja presente e não tenha sido removido ou substituído enquanto estiver dormindo. Se o dispositivo não estiver mais presente, o motorista do barramento deverá chamar IoInvalidateDeviceRelations no dispositivo pai para notificar o gerenciador de Plug and Play de que o dispositivo desapareceu. Nessa situação, o motorista do barramento pode falhar ao ligar o IRP do dispositivo.
Se o dispositivo ainda estiver presente, o driver de barramento executará as tarefas necessárias para retornar o dispositivo a uma condição operacional, chamará PoSetPowerState para informar o power manager do novo estado de energia do dispositivo e concluirá o IRP (IoCompleteRequest). Se os drivers tiverem enfileirado E/S enquanto o dispositivo estava dormindo ou se o dispositivo exigir energia inrush, o motorista do barramento aplicará energia ao dispositivo. Caso contrário, o motorista do barramento aplica energia assim que precisa se comunicar com o dispositivo.
Para obter uma lista de práticas recomendadas para atingir tempos de inicialização rápidos de estados de ativação, espera e hibernação, consulte Aprimorando o desempenho de inicialização do sistema.