디바이스 전원 상태에 대한 IRP_MN_SET_POWER 처리

디바이스 집합 전원 IRP는 단일 디바이스에 대한 상태 변경을 요청하고 디바이스에 대한 스택의 모든 드라이버로 전송됩니다. 이러한 IRP는 I/O 스택 위치의 Power.Type 멤버에서 DevicePowerState를 지정합니다.

드라이버는 스택 아래로 이동할 때 전원이 낮아진 IRP를 처리합니다. 전원 강화 IRP의 경우 드라이버는 IRP가 스택 아래로 이동할 때 IoCompletion 루틴을 설정한 다음 IRP가 스택을 다시 이동할 때 IoCompletion 루틴에서 IRP를 처리합니다. 일반적인 디바이스 스택의 드라이버는 다음과 같이 디바이스 설정 전원 IRP를 처리합니다.

  • 대부분의 필터 드라이버는 단순히 IoMarkIrpPending을 호출하고, IRP를 다음 하위 드라이버에 전달하고( Power IRP 전달 참조) DispatchPower 루틴에서 STATUS_PENDING 반환해야 합니다. 그러나 일부 필터 드라이버는 먼저 들어오는 IRP를 큐에 대기하거나 디바이스 전원 상태를 저장하는 것과 같은 디바이스별 작업을 수행해야 할 수 있습니다.

  • 함수 드라이버는 IoMarkIrpPending을 호출하고, 디바이스별 작업(예: 보류 중인 I/O 요청 완료, 들어오는 I/O 요청 큐 대기, 디바이스 컨텍스트 저장 또는 디바이스 전원 변경)을 수행하고, 필요한 경우 IoCompletion 루틴을 설정하고, 디바이스 전원 IRP를 다음 하위 드라이버에 전달합니다( Power IRP 전달 참조). DispatchPower 루틴에서 STATUS_PENDING 반환합니다.

  • 이렇게 할 수 있는 경우 버스 드라이버가 디바이스 전원을 변경한 다음 PoSetPowerState 를 호출하여 전원 관리자에게 새 디바이스 전원 상태를 알립니다. Windows Server 2003, Windows XP 및 Windows 2000에서만 드라이버는 PoStartNextPowerIrp 를 호출하여 전원 상태를 설정한 후 다음 전원 IRP를 시작해야 합니다. 그런 다음 드라이버는 IRP를 완료하고 IO_NO_INCREMENT 지정합니다. 드라이버가 IRP를 즉시 완료할 수 없는 경우 IoMarkIrpPending을 호출하고DispatchPower 루틴에서 STATUS_PENDING 반환하며 나중에 IRP를 완료합니다.

대상 디바이스가 이미 요청된 전원 상태에 있더라도 각 함수 또는 필터 드라이버는 IRP를 다음 하위 드라이버로 전달해야 합니다. 모든 설정 전원 IRP는 디바이스 스택을 따라 버스 드라이버까지 이동해야 하며, 이를 완료합니다.

버스 드라이버 위에 있는 함수 및 필터 드라이버는 디바이스 집합 전원 IRP에 실패하지 않아야 합니다. 디바이스가 제거되거나 제거되는 동안 버스 드라이버가 디바이스 전원 켜기 IRP에 실패할 수 있습니다.

드라이버 스택의 각 드라이버(함수, 필터 및 버스 드라이버)는 PoSetPowerState 를 호출하여 해당 디바이스 개체의 전원 상태 변경을 전원 관리자에게 알려야 합니다.

디바이스 전원 켜기 및 전원 다운과 관련된 다른 드라이버 작업과 마찬가지로 PoSetPowerState 에 대한 호출은 디바이스 전원이 켜진 후(새 상태가 D0인 경우) 또는 디바이스 전원이 꺼진 후(새 상태가 다른 상태인 경우) 발생해야 합니다.

각 드라이버는 디바이스의 전원 상태를 추적해야 합니다. 전원 관리자는 이 정보를 드라이버에 제공하지 않습니다.

디바이스 전원 상태에 대한 IRP_MN_SET_POWER 요청을 처리하는 동안 드라이버는 DispatchPower 루틴에서 최대한 빨리 돌아와야 합니다. 드라이버는 동일한 IRP를 처리하는 코드에서 신호를 받는 커널 이벤트에 대해 DispatchPower 루틴에서 대기해서는 안 됩니다. 전원 IRP는 시스템 전체에서 동기화되므로 교착 상태가 발생할 수 있습니다.

특히 멀티미디어 애플리케이션의 경우 가장 높은 수준의 시스템 성능을 보장하려면 드라이버는 PASSIVE_LEVEL 동일한 IRQL(인터럽트 요청 수준)에서 시간이 많이 걸리는 작업을 수행해야 합니다. IRQL= PASSIVE_LEVEL 작업을 수행하기 위해 드라이버는 전용 스레드 또는 시스템 작업자 스레드를 사용할 수 있습니다. 멀티미디어 플랫폼에 대한 드라이버 성능 최적화에 대한 지침은 스트리밍 미디어 디바이스 디자인 가이드를 참조하세요.

드라이버가 전원 IRP를 처리하기 위해 수행해야 하는 정확한 단계는 다음 섹션에 설명된 대로 디바이스의 전원이 켜지는지 여부에 따라 달라집니다.

디바이스 Power-Down IRP 처리

디바이스 Power-Up IRP 처리