IRP_MN_WAIT_WAKE
이 IRP를 사용하면 드라이버가 수면 시스템을 깨우거나 수면 장치를 깨우도록 할 수 있습니다.
주 코드
보낸 경우
전원 정책을 소유하는 드라이버는 들어오는 전화 통화와 같은 외부 이벤트에 대한 응답으로 디바이스가 각성할 수 있도록 이 IRP를 PDO로 대상으로 합니다. 드라이버는 PoRequestPowerIrp 를 호출하여 이 IRP를 보내야 합니다.
일반적으로 드라이버는 절전 모드 해제를 위해 디바이스를 사용하도록 설정해야 한다고 결정하는 즉시 이 IRP를 보내야 합니다. 따라서 대부분의 디바이스에 대한 드라이버는 디바이스에서 전원을 켜고 IRP_MN_START_DEVICE 요청을 완료하기 전에 이 IRP를 보냅니다.
그러나 디바이스가 작동 상태(PowerDeviceD0)일 때마다 드라이버가 IRP를 보낼 수 있습니다. 디바이스 스택이 전환 중이 아니어야 합니다. 즉, 다른 전원 IRP가 디바이스 스택에서 활성화되어 있는 동안 드라이버는 IRP_MN_WAIT_WAKE 보내지 않아야 합니다.
대기/절전 모드 해제 IRP는 디바이스 또는 시스템의 전원 상태를 변경하지 않습니다. 디바이스에서 절전 모드 해제 신호를 사용하도록 설정하기만 하면 됩니다. 절전 모드 해제 신호가 도착하면 정책 소유자는 PoRequestPowerIrp 를 호출하여 디바이스를 D0으로 반환하는 셋 파워 IRP를 보내야 합니다.
이 IRP를 보내려면 드라이버가 IRQL = PASSIVE_LEVEL 실행 중이어야 합니다. 그러나 IRP는 IRQL = DISPATCH_LEVEL 완료할 수 있습니다.
입력 매개 변수
Parameters.WaitWake.PowerState 에는 디바이스가 시스템을 깨우도록 허용해야 하는 가장 낮은(최소 전원) 시스템 전원 상태가 포함되어 있습니다.
출력 매개 변수
없음
I/O 상태 블록
드라이버는 Irp-IoStatus.Status>를 다음 중 하나로 설정합니다.
STATUS_PENDING
드라이버가 IRP를 수신했으며 디바이스가 절전 모드 해제 신호를 기다리고 있습니다.
STATUS_INVALID_DEVICE_STATE
디바이스가 디바이스의 DEVICE_CAPABILITIES 구조에 지정된 DeviceWake 상태보다 성능이 낮은 상태이거나 디바이스가 IRP에 전달된 SystemWake 상태에서 시스템을 깨우지 못합니다.
STATUS_NOT_SUPPORTED
디바이스는 절전 모드 해제를 지원하지 않습니다.
STATUS_DEVICE_BUSY
IRP_MN_WAIT_WAKE 요청은 이미 보류 중이며 다른 IRP_MN_WAIT_WAKE 요청을 실행하기 전에 완료하거나 취소해야 합니다.
STATUS_SUCCESS
디바이스에서 절전 모드 해제 이벤트를 알릴 수 있습니다.
STATUS_CANCELLED
IRP가 취소되었습니다.
드라이버가 이 IRP에 실패해야 하는 경우 IRP를 즉시 완료하고 IRP를 다음 하위 드라이버에 전달하지 않습니다.
작업
드라이버는 다음 두 가지 이유 중 하나를 위해 IRP_MN_WAIT_WAKE 보냅니다.
디바이스가 외부 절전 모드 해제 신호에 대응하여 절전 모드를 해제할 수 있도록 합니다.
디바이스가 외부 절전 모드 해제 신호에 대응하여 디바이스 절전 모드에서 각성할 수 있도록 합니다.
IRP는 IoMarkIrpPending 을 호출하고 DispatchPower 루틴에서 STATUS_PENDING 반환하는 디바이스의 버스 드라이버에 디바이스 스택을 전달해야 합니다. IRP는 절전 모드 해제 신호가 발생할 때까지 또는 IRP를 보낸 드라이버가 취소할 때까지 보류 상태로 유지됩니다.
지정된 시간에 하나의 대기/절전 모드 해제 IRP만 PDO에 대해 보류할 수 있습니다. 드라이버가 PDO에 대한 대기/절전 모드 해제 IRP를 이미 보유하고 있는 경우 STATUS_DEVICE_BUSY 추가 IRP가 실패해야 합니다. 둘 이상의 자식 PDO를 열거하는 드라이버는 각 PDO에 대해 대기/절전 모드 해제 IRP를 보류할 수 있습니다.
IRP가 디바이스 스택 아래로 이동함에 따라 각 드라이버는 IoCompletion 루틴을 설정합니다. 디바이스가 절전 모드 해제 이벤트에 신호를 보낼 때 버스 드라이버는 절전 모드 해제 신호를 서비스하고 IRP를 완료하고 STATUS_SUCCESS 반환합니다. 그런 다음 I/O 관리자는 디바이스 스택에서 다음 상위 드라이버의 IoCompletion 루틴을 호출합니다.
드라이버가 대기/절전 모드 해제 IRP를 보낼 때 PoRequestPowerIrp 호출에서 콜백 루틴을 지정해야 합니다. 콜백 루틴에서 드라이버는 일반적으로 디바이스를 서비스합니다. 예를 들어 디바이스의 전원 정책 소유자는 PoRequestPowerIrp 를 호출하여 디바이스 상태 D0에 대한 IRP_MN_SET_POWER 보내야 합니다.
한 디바이스의 버스 드라이버 역할을 하는 드라이버와 부모 디바이스의 정책 소유자가 자식 PDO로부터 IRP_MN_WAIT_WAKE 요청을 받으면 부모 디바이스 스택에 대한 IRP_MN_WAIT_WAKE IRP를 요청합니다. 드라이버가 둘 이상의 자식 PDO를 열거하는 경우 대기/절전 모드 해제 요청을 보내는 자식 PDO 수에 관계없이 부모의 디바이스 스택에 대해 하나의 대기/절전 모드 해제 IRP만 요청해야 합니다. 대신 이러한 드라이버는 요청을 받을 때마다 수를 증가시키고 요청을 완료할 때마다 수를 감소시키는 대기/절전 모드 해제 IRP의 내부 수를 유지해야 합니다. 대기/절전 모드 해제 IRP를 완료한 후 개수가 0이 아닌 경우 드라이버는 절전 모드 해제를 위해 디바이스 스택에 다른 대기/절전 모드 해제 IRP를 "다시 정렬"해야 합니다. 자세한 내용은 디바이스 트리를 통한 대기/절전 모드 해제 IRP의 경로 이해를 참조하세요.
IRP_MN_WAIT_WAKE 취소하기 위해 드라이버는 IoCancelIrp를 호출합니다. IRP를 시작한 드라이버만 취소할 수 있습니다. 드라이버는 다음 중 한 가지가 발생하면 보류 중인 IRP_MN_WAIT_WAKE 취소합니다.
드라이버는 디바이스를 중지하거나 제거하는 PnP IRP를 받습니다.
시스템이 절전 모드 해제되고 디바이스 절전 모드 해제 신호가 절전 모드 해제되지 않아야 합니다.
요구 사항
헤더 |
Wdm.h(Wdm.h, Ntddk.h 또는 Ntifs.h 포함) |