시스템에 대한 전원 IRP

시스템 전원 IRP는 주 IRP 코드 IRP_MJ_POWER, 아래에 나열된 부 전원 IRP 코드 중 하나 및 IRP 스택의 Power.Type 멤버에 있는 SystemPowerState 값을 지정합니다. 전원 관리자만 이러한 IRP를 보낼 수 있습니다. 드라이버가 시스템 전원 IRP를 보낼 수 없습니다.

전원 관리자는 다음 이유 중 하나로 시스템 전원 IRP를 보냅니다.

  • 유휴 시간 제한, 시스템 활동 변경, 사용자 요청 또는 만료된 배터리에 대한 응답으로 시스템 전원 상태를 변경하려면(IRP_MN_SET_POWER)

  • 디바이스를 쿼리하여 시스템이 절전 모드로 돌아갈 수 있는지 확인하려면(IRP_MN_QUERY_POWER)

  • 쿼리 후 현재 시스템 전원 상태를 재확인하려면(IRP_MN_SET_POWER)

전원 관리자는 시스템을 대신하여 IRP_MN_QUERY_POWERIRP_MN_SET_POWER 요청을 보냅니다. 드라이버는 IRP_MN_QUERY_POWER 요청에 실패할 수 있지만 IRP_MN_SET_POWER 실패할 수는 없습니다.

예를 들어 시스템 전원 상태를 변경하기 위해 전원 관리자는 디바이스 트리의 각 디바이스 노드에 있는 스택의 최상위 드라이버에 시스템 전원 IRP를 보냅니다. 다음 그림에서는 단일 디바이스 스택 내의 드라이버가 시스템 전원 IRP를 처리하는 방법을 보여줍니다.

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

이전 그림과 같이 다음을 수행합니다.

  1. 전원 관리자는 I/O 관리자를 호출하여 디바이스 트리의 각 리프 노드에 시스템 전원 IRP를 보냅니다.

  2. 드라이버는 가능한 경우 IRP를 처리하고, 필요한 경우 IoCompletion 루틴을 설정하고, IoCallDriver (Windows 7 및 Windows Vista) 또는 PoCallDriver (Windows Server 2003, Windows XP 및 Windows 2000)를 호출하여 IRP를 스택 아래로 전달합니다. 드라이버가 IRP에 실패해야 하는 경우 드라이버는 즉시 실패하고 IRP를 완료합니다. 드라이버는 IRP_MN_QUERY_POWER IRP에 실패할 수 있지만 시스템 전원 상태를 설정하는 IRP_MN_SET_POWER IRP에 실패해서는 안됩니다.

  3. 디바이스에 대한 전원 정책을 소유하는 드라이버가 IRP를 받으면 해당 드라이버는 시스템 IRP에 대한 IoCompletion 루틴을 설정한 다음 IRP를 전달합니다.

  4. 스택의 다른 모든 드라이버는 가능하면 IRP를 처리하고, 필요한 경우 IoCompletion 루틴을 설정하고, 2단계와 같이 IRP를 다음 하위 드라이버로 전달합니다.

  5. 결국 버스 드라이버는 시스템 IRP를 수신하고 완료합니다.

  6. I/O 관리자는 드라이버가 시스템 IRP를 디바이스 스택 아래로 전달함에 따라 설정된 모든 IoCompletion 루틴을 호출합니다.

  7. IoCompletion 루틴에서 디바이스 전원 정책 소유자는 PoRequestPowerIrp를 호출하여 디바이스 전원 IRP를 보내고 시스템 IRP의 시스템 전원 상태에 유효한 디바이스 전원 상태를 지정합니다. 드라이버는 디바이스 전원 IRP가 완료될 때 호출할 콜백 루틴을 설정합니다.

    필요한 경우 드라이버는 DEVICE_CAPABILITIES 구조의 캐시된 복사본에서 DeviceState 멤버를 참조하여(보고 디바이스 전원 기능 참조) IRP의 시스템 전원 상태에 해당하는 디바이스 전원 상태를 확인합니다.

  8. 디바이스 IRP가 완료되고 모든 디바이스 IRP 완료 루틴이 실행되면 전원 정책 소유자의 콜백 루틴이 호출됩니다. 콜백 루틴에서 드라이버는 반환된 상태 시스템 IRP에 복사합니다. Windows Server 2003, Windows XP 및 Windows 2000에서 콜백은 PoStartNextPowerIrp 을 호출하여 다음 전원 IRP를 시작합니다. 그러나 Windows 7 및 Windows Vista에서는 PoStartNextPowerIrp 를 호출할 필요가 없으며 이러한 호출은 전원 관리 작업을 수행하지 않습니다. 마지막으로 콜백은 IoCompleteRequest 를 호출하여 시스템 IRP를 완료합니다.

자세한 내용은 시스템 전원 상태 요청 처리를 참조하세요.

일부 디바이스는 전원을 켭니다. 전원을 켭니다. 시스템 내부 전원 IRP는 시스템 전체에서 동기 및 직렬로 처리됩니다. 이러한 IRP는 한 번에 하나만 활성화할 수 있습니다. 자세한 내용은 IoCallDriver 호출 및 PoCallDriver 호출을 참조하세요.