다음을 통해 공유


IRP_MN_SET_POWER

이 IRP는 드라이버에 시스템 전원 상태 변경을 알리거나 디바이스의 디바이스 전원 상태를 설정합니다.

주 코드

IRP_MJ_POWER

보낸 경우

시스템 전원 관리자 또는 디바이스 전원 정책 소유자는 이 IRP를 보낼 수 있습니다.

전원 관리자는 이 IRP를 보내 드라이버에 시스템 전원 상태 변경을 알립니다. 드라이버가 유휴 검색을 위해 디바이스를 등록하는 경우 전원 관리자는 이 IRP를 보내 유휴 디바이스의 전원 상태를 변경합니다.

전원 정책을 소유하는 드라이버는 이 IRP를 전송하여 디바이스의 디바이스 전원 상태를 설정합니다. 드라이버는 이 IRP를 보내 려면 PoRequestPowerIrp 을 호출해야 합니다.

전원 관리자는 이 IRP를 IRQL = PASSIVE_LEVEL PDO에서 DO_POWER_PAGABLE 플래그를 설정하는 디바이스 스택으로 보냅니다. 이러한 스택의 드라이버는 페이징된 코드 또는 데이터를 터치하여 요청을 완료할 수 있습니다.

전원 관리자는 DO_POWER_INRUSH 플래그가 설정된 경우 IRQL = DISPATCH_LEVEL IRP를 보낼 수 있습니다. 이러한 드라이버는 페이징된 코드 또는 데이터에 직접 또는 간접적으로 액세스할 수 없습니다.

입력 매개 변수

Parameters.Power.Type 멤버는 SystemPowerState 또는 DevicePowerState 중에서 설정되는 전원 상태의 형식을 지정합니다.

Parameters.Power.State 멤버는 다음과 같이 전원 상태 자체를 지정합니다.

  • Parameters.Power.TypeSystemPowerState이면 값은 SYSTEM_POWER_STATE 형식의 열거자입니다.
  • Parameters.Power.TypeDevicePowerState인 경우 값은 DEVICE_POWER_STATE 형식의 열거자입니다.

Parameters.Power.ShutdownType 멤버는 요청된 전환에 대한 추가 정보를 지정합니다. 이 멤버의 가능한 값은 POWER_ACTION 열거형 값입니다. 자세한 내용은 시스템 전원 작업을 참조하세요.

Parameters.Power.SystemPowerStateContext 멤버는 컴퓨터의 이전 시스템 전원 상태에 대한 정보를 포함하는 읽기 전용의 부분적으로 불투명한 SYSTEM_POWER_STATE_CONTEXT 구조체입니다. Parameters.Power.TypeSystemPowerState이고 Parameters.Power.StatePowerSystemWorking인 경우 이 구조의 두 플래그 비트는 빠른 시작 또는 절전 모드 해제로 인해 컴퓨터가 S0(작동 중) 시스템 상태로 전환되었는지 여부를 나타냅니다. 자세한 내용은 절전 모드 해제빠른 시작 구분을 참조하세요.

IRP_MN_SET_POWER 대한 시스템 전원 전환 컨텍스트

다음 표에서는 IRP_MN_SET_POWER 내용을 보여 줍니다. Parameters.Power. {State| 각 시스템 전원 전환에 대한 SYSTEM_POWER_STATE_CONTEXT 구조의 ShutdownType} 및 CurrentSystemState, TargetSystemStateEffectiveSystemState 비트 필드입니다. 각 행은 하나의 IRP_MN_SET_POWER 나타냅니다.

전환 시스템 상태 종료 유형 현재 SystemState Target SystemState 유효 SystemState 코멘트
절전 모드... S3 자다 S0 S3 S3
... 웨이크 S0 자다 S3 S0 S0
하이브리드 절전 모드... S4 최대 절전 모드 S0 S3 S4 최대 절전 모드 파일(빠른 S4)
... 웨이크 S0 자다 S3 S0 S0
... Wake/PwrLost S0 자다 S4 S0 S0
최대 절전 모드로... S4 최대 절전 모드 S0 S4 S4
... 웨이크 S0 자다 S4 S0 S0
하이브리드 종료 대상... S4 최대 절전 모드 S0 S5 S4 닫힌 앱, 사용자가 종료된 것처럼 로그오프됨(최대 절전 모드 부팅)
... 빠른 시작 S0 자다 S4 S0 S0
종료 대상... S5 종료/다시 설정/해제 S0 S5 S5
... 시스템 부팅 부팅을 위한 S-IRP 없음

출력 매개 변수

Parameters.Power.SystemContext 는 시스템 사용을 위해 예약되어 있습니다.

I/O 상태 블록

드라이버는 Irp-IoStatus.Status>를 STATUS_SUCCESS 설정하여 디바이스가 요청된 상태를 입력했음을 나타냅니다.

드라이버가 시스템 전원 상태를 설정하라는 요청에 실패해서는 안 됩니다.

버스 드라이버 위에 있는 함수 및 필터 드라이버는 디바이스 전원 상태를 설정하라는 요청에 실패해서는 안 됩니다. 디바이스가 제거되거나 제거되는 동안 버스 드라이버가 디바이스 전원 켜기 요청에 실패할 수 있습니다.

수술

전원 관리자 또는 드라이버는 IRP_MN_SET_POWER IRP를 요청할 수 있습니다. 전원 관리자는 다음 이유 중 하나로 이 IRP를 보냅니다.

  • 드라이버에 시스템 전원 상태 변경을 알리려면

  • 전원 관리자가 유휴 검색을 수행하는 디바이스의 전원 상태를 변경하려면

  • 드라이버가 시스템 전원 상태에 대한 IRP_MN_QUERY_POWER 요청에 실패한 후 현재 시스템 상태를 재확인합니다. 자세한 내용은 IRP_MN_QUERY_POWER 참조하세요.

디바이스 전원 정책을 소유하는 드라이버는 디바이스의 전원 상태를 변경하기 위해 IRP_MN_SET_POWER 보냅니다.

지정된 시간에 시스템은 각 디바이스 개체에 대해 이러한 IRP를 하나만 활성화할 수 있도록 허용합니다.

각 드라이버는 IoCallDriver (Windows Vista부터 시작) 또는 PoCallDriver (Windows Server 2003, Windows XP 및 Windows 2000)를 호출하여 각 전원 IRP를 다음 하위 드라이버로 전달해야 합니다. PoCallDriver 인터페이스는 전원 관리 하위 시스템이 IRP를 다음 드라이버에 전달하기 전에 지연할 수 있다는 점을 제외하고 IoCallDriver의 인터페이스와 유사합니다. 예를 들어 디바이스에 inrush 전류가 필요하므로 이러한 다른 디바이스를 사용하여 직렬로 전원을 켜야 하는 경우 PowerDeviceD0 요청에서 지연이 발생할 수 있습니다.

드라이버가 Windows Server 2003, Windows XP 또는 Windows 2000에서 IRP_MN_SET_POWER 요청을 받은 후 드라이버는 PoStartNextPowerIrp 호출에 설명된 대로 PoStartNextPowerIrp를 호출해야 합니다. Windows Vista부터 PoStartNextPowerIrp 를 호출할 필요가 없으며 이러한 호출은 전원 관리 작업을 수행하지 않습니다.

시스템 전원 상태에 대한 IRP_MN_SET_POWER

시스템 전원 관리자만 시스템 집합 전원 IRP를 보낼 수 있습니다.

드라이버가 시스템 전원 상태를 설정하라는 요청에 실패해서는 안 됩니다.

가능하면 전원 관리자는 시스템 절전 모드 상태를 요청하기 위해 IRP_MN_SET_POWER 보내기 전에 IRP_MN_QUERY_POWER 보냅니다. 그러나 일부 조건(예: 전원 끄기 단추를 누르는 사용자 또는 배터리 만료)에서 전원 관리자는 첫 번째 쿼리 없이 IRP_MN_SET_POWER 발급할 수 있습니다. Power Manager는 절전 상태만 쿼리합니다. 전원을 켜기 전에 쿼리하지 않습니다.

IRP_MN_SET_POWER 요청은 디바이스에 대한 디바이스 스택의 최상위 드라이버로 전송됩니다. 최상위 드라이버는 IRP가 IRP를 완료해야 하는 버스 드라이버에 도달할 때까지 IRP를 다음 하위 드라이버로 전달합니다.

필터 드라이버는 일반적으로 시스템 집합 전원 IRP에서 작동할 필요가 없습니다.

그러나 디바이스 전원 정책 소유자는 IRP를 전달하기 전에 IoCompletion 루틴을 설정합니다. IoCompletion 루틴에서는 디바이스 전원 IRP에 대한 IRP_MN_SET_POWER 요청을 보냅니다. 자세한 내용은 디바이스 전원 정책 소유자에서 시스템 Set-Power IRP 처리를 참조하세요.

시스템 설정 전원 IRP는 시스템 전원 상태의 변경이 임박했으며 드라이버가 이를 준비해야 한다는 것을 드라이버에 알릴 수 있습니다. 그러나 드라이버는 디바이스 전원 상태에 대한 IRP_MN_SET_POWER 받을 때까지 디바이스 의 전원 상태를 변경해서는 안 됩니다.

Parameters.Power.ShutdownType의 값은 보류 중인 작업에 대한 추가 정보를 제공합니다. IRP가 PowerSystemShutdown (S5)을 지정하는 경우 드라이버는 시스템이 다시 설정 중인지(PowerActionShutdownReset) 또는 나중에 다시 부팅하도록 무기한 전원을 끄는지(PowerActionShutdownOff)를 결정할 수 있습니다. 대부분의 디바이스 드라이버의 경우 차이점은 중요하지 않습니다. 그러나 비디오 스트리밍 디바이스와 같은 특정 디바이스의 경우 시스템이 다시 설정될 때 I/O를 중지하기 위해 드라이버가 디바이스의 전원을 끌 수 있습니다.

ShutdownType의 값은 PowerActionShutdown일 수도 있습니다. 이 경우 드라이버는 요청된 종료 유형을 알 수 없으므로 재설정을 위해 계속 진행해야 합니다.

디바이스 전원 상태

버스 드라이버 위에 있는 함수 및 필터 드라이버는 디바이스 전원 상태를 설정하라는 요청에 실패해서는 안 됩니다. 디바이스가 제거되거나 제거되는 동안 버스 드라이버가 디바이스 전원 켜기 요청에 실패할 수 있습니다.

드라이버는 IRP를 완료하기 전에 디바이스를 요청된 상태로 설정해야 합니다.

IRP가 낮은 전원 상태로의 전환을 요청하면 드라이버가 디바이스 스택 아래로 이동할 때 IRP를 처리하여 드라이버가 디바이스를 작업 상태로 복원하는 데 필요한 컨텍스트를 저장해야 합니다. 버스 드라이버가 IRP를 수신하면 드라이버는 다음과 같습니다.

  • 드라이버가 디바이스를 작업 상태로 복원하는 데 필요한 컨텍스트를 저장합니다.

  • 디바이스를 요청된 전원 상태로 설정합니다.

  • PoSetPowerState를 호출하여 전원 관리자에게 알립니다.

  • PoStartNextPowerIrp를 호출하여 다음 전원 IRP(Windows Server 2003, Windows XP 및 Windows 2000만 해당)를 시작합니다.

  • 디바이스 전원 IRP를 완료합니다.

드라이버는 적시에 이 IRP를 완료해야 합니다. 일반적으로 드라이버는 일반적인 사용자가 눈에 띄게 느리게 나타나는 지연을 피해야 합니다. 예를 들어 드라이버는 캐시된 디스크 또는 네트워크 데이터를 플러시하기 위해 시스템 상태 변경을 지연시킬 수 있지만 네트워크 연결을 활성 상태로 유지하거나 테이프의 형식을 지정해서는 안 됩니다. 자세한 내용은 Power IRP 전달을 참조하세요.

Windows 2000 이상 버전의 운영 체제에서 IRP가 PowerDeviceD1, PowerDeviceD2 또는 PowerDeviceD3을 지정하고 시스템 집합 전원 IRP가 활성화된 경우 Parameters.Power.ShutdownType의 값은 시스템 IRP에 대한 정보를 제공합니다.

최대 절전 모드 경로의 디바이스 드라이버는 이 값을 검사해야 합니다. IRP가 PowerDeviceD3 을 요청하고 ShutdownTypePowerActionHibernate인 경우 이러한 드라이버는 디바이스를 복원하는 데 필요한 컨텍스트를 저장해야 하지만 디바이스의 전원을 끄면 안 됩니다. 컴퓨터의 전원이 끊어지면 디바이스가 D3 상태로 들어갑니다.

Windows 2000 이상 버전의 운영 체제에서는 요청된 전원 상태가 PowerDeviceD0인 경우 드라이버가 ShutdownType의 값을 사용하지 않아야 합니다.

Windows 98/Me에서 IRP가 디바이스 전원 상태를 요청하는 경우 ShutdownType 은 항상 PowerActionNone입니다.

디바이스 전원을 켭니다 때 결정 하는 드라이버는 디바이스 클래스에 따라 달라 줍니다.

디바이스 전원을 켜는 시기를 결정하는 드라이버는 거의 항상 디바이스 레지스터에 액세스하는 드라이버입니다. 드라이버는 디바이스의 하드웨어 레지스터에 액세스하기 전에 디바이스가 D0 상태인지 확인해야 합니다. 디바이스가 D0 상태가 아닌 경우 드라이버는 PoRequestPowerIrp 를 호출하여 IRP를 보내 디바이스의 전원을 켜야 합니다. 디바이스가 D0 상태인 경우가 아니면 드라이버는 디바이스에 액세스할 수 없습니다.

드라이버는 디바이스 상태 D0에 대한 설정 전원 IRP를 받으면 IoCompletion 루틴을 설정하고 IRP를 다음 하위 드라이버로 전달합니다.

IRP가 버스 드라이버에 도달하면 해당 드라이버가 디바이스에 전원을 적용(또는 다시 설정)하고 PoStartNextPowerIrp (Windows Server 2003, Windows XP 및 Windows 2000에만 해당)를 호출하고 PoSetPowerState 를 호출하여 디바이스에 대한 새 전원 상태를 Power Manager에 알릴 수 있습니다.

버스 드라이버가 전원 켜기 IRP를 완료한 후 함수 및 필터 드라이버는 디바이스 스택을 백업할 때 IoCompletion 루틴에서 IRP를 처리합니다. IoCompletion 루틴에서 각 드라이버는 디바이스 컨텍스트를 복원하거나 다시 초기화하고 다른 필요한 시작 작업을 수행합니다.

자세한 내용은 디바이스 전원 상태에 대한 IRP_MN_SET_POWER 처리를 참조하세요.

요구 사항

머리글: Wdm.h(Wdm.h, Ntddk.h 또는 Ntifs.h 포함)

참고하십시오

DEVICE_POWER_STATE

IoCallDriver

IRP_MN_QUERY_POWER

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT