IRP_MN_WAIT_WAKE
이 IRP를 사용하면 드라이버가 수면 시스템을 깨우거나 절전 모드 장치를 깨우는 데 사용할 수 있습니다.
주 코드
보낸 경우
전원 정책을 소유하는 드라이버는 수신 전화 통화와 같은 외부 이벤트에 대한 응답으로 디바이스가 깨어날 수 있도록 이 IRP를 해당 PDO로 대상으로 합니다. 드라이버는 이 IRP를 보내려면 PoRequestPowerIrp 을 호출해야 합니다.
일반적으로 드라이버는 절전 모드 해제를 위해 디바이스를 사용하도록 설정해야 한다고 결정하는 즉시 이 IRP를 보내야 합니다. 따라서 대부분의 디바이스에 대한 드라이버는 디바이스에서 전원을 공급한 후 IRP_MN_START_DEVICE 요청을 완료하기 전에 이 IRP를 보냅니다.
그러나 디바이스가 작동 상태(PowerDeviceD0)일 때마다 드라이버는 IRP를 보낼 수 있습니다. 디바이스 스택이 전환 중이 아니어야 합니다. 즉, 디바이스 스택에서 다른 전원 IRP가 활성화되어 있는 동안에는 드라이버가 IRP_MN_WAIT_WAKE 보내지 않아야 합니다.
대기/절전 모드 해제 IRP는 디바이스 또는 시스템의 전원 상태를 변경하지 않습니다. 디바이스에서 절전 모드 해제 신호를 사용하도록 설정하기만 하면 됩니다. 절전 모드 해제 신호가 도착하면 정책 소유자는 PoRequestPowerIrp 를 호출하여 설정 전원 IRP를 보내 디바이스를 D0으로 반환해야 합니다.
이 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를 보낸 드라이버가 취소할 때까지 보류 중인 상태로 유지됩니다.
지정된 시간에 PDO에 대해 하나의 대기/절전 모드 해제 IRP만 보류할 수 있습니다. 드라이버가 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 포함) |