다음을 통해 공유


대기/절전 모드 해제 콜백 루틴

드라이버가 대기/절전 모드 해제 IRP를 요청하는 경우 절전 모드 해제 이벤트가 발생할 때 디바이스를 작업 상태(D0)로 반환할 수 있도록 콜백 루틴을 지정해야 합니다. 절전 모드 해제 이벤트가 발생하고 모든 드라이버가 IRP를 완료한 후 시스템은 PoRequestPowerIrp에 전달된 콜백 루틴을 호출합니다.

이 콜백 루틴은 IRP를 처리하는 드라이버가 아니라 IRP를 시작한 드라이버를 대신하여 설정되므로 PoStartNextPowerIrp를 호출해서는 안 됩니다. 드라이버가 IRP를 스택 아래로 전달할 때 설정된 IoCompletion 루틴만 다음 전원 IRP를 시작해야 합니다. 정책 소유자는 IRP를 보낼 뿐만 아니라 이를 처리하므로 대기/절전 모드 해제 IRP를 요청할 때 콜백 루틴을 설정하는 것 외에도 IRP를 스택 아래로 전달할 때 IoCompletion 루틴을 설정할 수 있습니다.

콜백 루틴에는 다음과 같은 책임이 있습니다.

  1. 드라이버가 둘 이상의 디바이스를 제어하는 경우 절전 모드 해제 신호를 받은 디바이스를 확인합니다.

  2. 절전 모드 해제 신호를 발생시킨 이벤트를 서비스합니다.

  3. PoRequestPowerIrp를 호출하여 PowerDeviceD0 요청을 보내 D0 상태에서 절전 모드 해제 신호를 보낸 디바이스를 설정합니다. 또한 드라이버는 PoSetPowerState 를 호출하여 전원 관리자에게 새 디바이스 전원 상태를 알려야 합니다. 자세한 내용은 디바이스 전원 상태에 대한 IRP_MN_QUERY_POWER 또는 IRP_MN_SET_POWER 보내기를 참조하세요.

  4. 드라이버가 IRP에 대해 Cancel 루틴을 설정한 경우 IoSetCancelRoutine 을 호출하여 취소 루틴을 NULL로 다시 설정합니다.

  5. 드라이버가 둘 이상의 디바이스에 대한 전원 정책을 소유하는 경우 대기/절전 모드 해제 참조 수를 감소합니다. 다른 디바이스가 이전에 대기/절전 모드 해제 IRP를 보냈음을 나타내는 0이 아닌 경우 PDO에 대해 다른 대기/절전 모드 해제 IRP(PoRequestPowerIrp)를 요청합니다.

    예를 들어 PCI 디바이스는 모뎀과 NIC(네트워크 인터페이스 카드) 모두에 대해 대기/절전 모드 해제를 사용하도록 설정했을 수 있습니다. NIC가 시스템을 절전 모드에서 해제하는 경우(따라서 IRP를 완료) PCI FDO는 모뎀이 여전히 절전 모드에서 해제될 수 있도록 다른 대기/절전 모드 해제 IRP를 자체에 보내야 합니다.

대기/절전 모드 해제 IRP를 요청한 드라이버는 디바이스 스택에 대한 전원 정책을 제어하므로 IRP가 완료되면 디바이스를 작업 상태로 반환해야 합니다. 하위 드라이버가 이미 디바이스에 물리적으로 전원을 적용했을 수 있지만 정책 소유자는 PoRequestPowerIrp 를 호출하여 디바이스 전원 상태 D0에 대한 IRP_MN_SET_POWER 요청을 보내야 합니다. 디바이스 스택의 모든 드라이버가 이 전원 강화 IRP를 처리한 후에만 디바이스가 작동 상태로 반환됩니다.