IRP_MN_SET_POWER
이 IRP는 드라이버에 시스템 전원 상태 변경을 알리거나 디바이스의 디바이스 전원 상태를 설정합니다.
주 코드
보낸 경우
시스템 전원 관리자 또는 디바이스 전원 정책 소유자는 이 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.Type이 SystemPowerState이면 값은 SYSTEM_POWER_STATE 형식의 열거자입니다.
Parameters.Power.Type이 DevicePowerState이면 값은 DEVICE_POWER_STATE 형식의 열거자입니다.
Parameters.Power.ShutdownType 멤버는 요청된 전환에 대한 추가 정보를 지정합니다. 이 멤버에 사용할 수 있는 값은 POWER_ACTION 열거형 값입니다. 자세한 내용은 시스템 전원 작업을 참조하세요.
Windows Vista부터 Parameters.Power.SystemPowerStateContext 멤버는 컴퓨터의 이전 시스템 전원 상태에 대한 정보를 포함하는 읽기 전용의 부분적으로 불투명한 SYSTEM_POWER_STATE_CONTEXT 구조체입니다. Parameters.Power.Type이 SystemPowerState이고 Parameters.Power.State가 PowerSystemWorking인 경우 이 구조의 두 플래그 비트는 빠른 시작 또는 절전 모드 해제 최대 절전 모드에서 컴퓨터가 S0(작업) 시스템 상태로 전환되었는지 여부를 나타냅니다. 자세한 내용은 절전 모드 해제 에서 최대 절전 모드에서 빠른 시작 구분을 참조하세요.
다음 표에서는 IRP_MN_SET_POWER 내용을 보여 줍니다. Parameters.Power. {State| 각 시스템 전원 전환에 대한 SYSTEM_POWER_STATE_CONTEXT 구조의 ShutdownType} 및 CurrentSystemState, TargetSystemState 및 EffectiveSystemState 비트 필드입니다. 각 행은 하나의 IRP_MN_SET_POWER 나타냅니다.
전환 | 시스템 상태 | 종료 유형 | 현재 SystemState | 대상 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의 인터페이스와 유사합니다. 예를 들어 디바이스에 인러시브 전류가 필요하므로 이러한 다른 디바이스를 사용하여 직렬로 전원을 켜야 하는 경우 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 실행할 수 있습니다. 전원 관리자는 절전 모드 상태에 대해서만 쿼리합니다. 전원을 켜기 전에 쿼리하지 않습니다.
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를 중지하기 위해 드라이버가 디바이스의 전원을 끌 수 있습니다.
Windows 2000 이상 버전의 운영 체제에서 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 을 요청하고 ShutdownType 이 PowerActionHibernate인 경우 이러한 드라이버는 디바이스를 복원하는 데 필요한 컨텍스트를 저장해야 하지만 디바이스 전원을 끄면 안 됩니다. 컴퓨터의 전원이 끊어지면 디바이스가 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 를 호출하여 디바이스의 새 전원 상태를 전원 관리자에게 알릴 수 있습니다.
버스 드라이버가 전원 강화 IRP를 완료한 후 함수 및 필터 드라이버는 디바이스 스택을 백업할 때 IoCompletion 루틴에서 IRP를 처리합니다. IoCompletion 루틴에서 각 드라이버는 디바이스 컨텍스트를 복원하거나 다시 초기화하고 다른 필수 시작 작업을 수행합니다.
자세한 내용은 디바이스 전원 상태에 대한 IRP_MN_SET_POWER 처리를 참조하세요.
요구 사항
헤더 |
Wdm.h(Wdm.h, Ntddk.h 또는 Ntifs.h 포함) |