다음을 통해 공유


개별 디바이스용 전원 IRP

디바이스 전원 IRP는 주 IRP 코드 IRP_MJ_POWER, 아래에 나열된 부 전원 IRP 코드 중 하나 및 Power.Type 멤버의 DevicePowerState 값을 지정합니다.

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

IRP_MN_WAIT_WAKE

IRP_MN_POWER_SEQUENCE

디바이스 스택의 모든 드라이버는 이러한 IRP를 받습니다. 일반적으로 디바이스 전원 정책 관리자만 이러한 IRP를 보낼 수 있습니다. 그러나 유휴 검색에 Power Manager 루틴 사용에 설명된 대로 전원 관리자는 디바이스를 대신하여 유휴 검색을 수행할 때 디바이스 전원 IRP를 보낼 수 있습니다.

드라이버는 다음과 같은 이유로 디바이스 전원 IRP를 보냅니다.

  • 시스템 전원 IRP에 대한 응답으로 디바이스 전원 상태를 쿼리하거나 변경하려면

  • 전원을 절약하기 위해 디바이스를 절전 모드 상태로 설정하려면

  • 절전 모드가 된 후 디바이스를 작업 상태로 되돌리려면

  • 외부 신호에 대한 응답으로 디바이스가 깨어날 수 있도록 하려면

  • 디바이스 전원을 공급할 때 전원 시퀀스 값을 얻으려면

다음 그림에서는 디바이스 전원 IRP를 보내고, 전달하고, 완료하기 위해 발생하는 단계의 시퀀스를 보여줍니다.

디바이스 전원 irp의 경로를 보여 주는 다이어그램

이전 그림과 같이 디바이스 전원 IRP는 다음 단계에서 전송, 전달 및 완료됩니다.

  1. 디바이스 전원 정책 소유자는 PoRequestPowerIrp 를 호출하여 IRP의 대상인 PDO와 IRP가 완료될 때 호출할 콜백 루틴을 지정하여 디바이스 전원 IRP를 할당합니다.

  2. 전원 관리자는 디바이스 전원 IRP를 할당하고 대상 PDO에 대한 디바이스 스택의 최상위 드라이버로 보냅니다.

  3. 드라이버는 다음 작업을 수행합니다.

    • 필요한 경우 IoCompletion 루틴을 설정합니다.

    • 완료 루틴을 사용하지 않는 경우 PoStartNextPowerIrp (Windows Server 2003, Windows XP 및 Windows 2000)을 호출합니다. Windows Vista부터 이 호출은 필요하지 않으며 이러한 호출은 전원 관리 작업을 수행하지 않습니다.

    • IoCallDriver(Windows 7 및 Windows Vista)를 호출하거나 PoCallDriver(Windows Server 2003, Windows XP 및 Windows 2000)를 호출하여 IRP를 다음 하위 드라이버로 전달합니다.

    스택의 각 드라이버는 IRP가 버스 드라이버에 도달할 때까지 이 작업을 수행합니다. 드라이버가 IRP에 실패해야 하는 경우 즉시 이를 수행하고 IoCompleteRequest를 호출해야 합니다.

  4. 디바이스 PDO를 유지 관리하는 버스 드라이버는 요청된 작업을 수행한 다음 IoCompleteRequest 를 호출하여 IRP를 완료합니다. 디바이스가 제거되거나 제거되는 과정에서 버스 드라이버가 디바이스 전원 강화 IRP에 실패할 수 있습니다.

  5. I/O 관리자는 드라이버가 IRP를 스택 아래로 전달할 때 설정한 IoCompletion 루틴을 호출합니다. 모든 IoCompletion 루틴이 호출되면 콜백 루틴이 실행됩니다.

디바이스 전원 IRP에 대한 자세한 내용은 개별 디바이스에 대한 전원 관리Wake-Up 기능이 있는 디바이스 지원을 참조하세요. 전원 시퀀스 IRP에 대한 자세한 내용은 IRP_MN_POWER_SEQUENCE 참조하세요.