다음을 통해 공유


대기/절전 모드 해제 IRP 취소

대기/절전 모드 해제 IRP를 보낸 드라이버만 해당 IRP를 취소할 수 있습니다.

드라이버는 다음과 같은 상황에서 보류 중인 대기/절전 모드 해제 IRP를 취소해야 할 수 있습니다.

  • 드라이버는 디바이스에 대한 PnP IRP_MN_STOP_DEVICE, IRP_MN_QUERY_REMOVE_DEVICE, IRP_MN_REMOVE_DEVICE 또는 IRP_MN_SURPRISE_REMOVAL 요청을 받습니다. 드라이버는 디바이스를 다시 시작한 후 대기/절전 모드 해제 IRP(PoRequestPowerIrp)를 다시 실행해야 합니다.

  • 시스템이 절전 모드로 설정되어 있지만 디바이스를 사용하도록 설정하여 시스템을 절전 모드 해제하면 안 됩니다.

    예를 들어 USB 허브 드라이버는 나중에 입력 디바이스 중 하나를 절전 모드 상태로 전환할 경우 디바이스 시작 시 IRP_MN_WAIT_WAKE 요청을 보낼 수 있습니다. 시스템이 작동 상태에 있는 동안 디바이스의 절전 모드 해제 신호는 디바이스를 작동 상태로 반환하지만 시스템 전원 상태에는 영향을 주지 않습니다. 시스템이 종료를 준비하면 디바이스가 시스템을 깨우는 것을 허용하면 USB 허브 드라이버가 이 IRP를 취소합니다.

  • 시스템이 디바이스에서 절전 모드를 해제할 수 없는 절전 모드 상태가 됩니다. 즉, DEVICE_CAPABILITIES 구조에 지정된 SystemWake 값보다 전력이 적은 상태로 진입합니다.

  • 디바이스가 절전 모드 해제 신호에 응답할 수 없는 전원 상태를 입력합니다. 즉, DEVICE_CAPABILITIES 구조에 지정된 DeviceWake 값보다 성능이 낮은 상태를 입력합니다.

IRP를 보낸 드라이버는 대기/절전 모드 해제 IRP를 취소하기 위해 IoCancelIrp를 호출하고, 드라이버가 PoRequestPowerIrp를 호출할 때 이전에 반환된 IRP에 포인터를 전달합니다.

드라이버는 전송하지 않은 대기/절전 모드 해제 IRP를 취소해서는 안 됩니다.

대기/절전 모드 해제 IRP에 대한 루틴 취소

많은 함수 및 버스 드라이버가 대기/절전 모드 해제 IRP에 대해 취소 루틴을 설정해야 합니다. 다음 유형의 드라이버는 이러한 루틴을 설정해야 합니다.

  • 절 해제를 사용하거나 사용하지 않도록 디바이스 설정을 변경하는 드라이버입니다.

  • 부모 디바이스의 드라이버에 IRP_MN_WAIT_WAKE 요청을 보내는 드라이버입니다.

취소 루틴을 사용하면 드라이버가 디바이스에 대해 절전 모드 해제를 사용하지 않도록 설정하고 보류 중인 대기/절전 모드 해제 IRP와 관련된 모든 데이터를 클린 수 있습니다. 부모 디바이스에 대한 대기/절전 모드 해제 IRP를 요청하는 드라이버도 해당 IRP를 취소할 수 있습니다.

대기/절전 모드 해제 취소 루틴에서 드라이버는 다음 단계를 수행해야 합니다.

  1. IoSetCancelRoutine을 호출하여 IRP의 취소 루틴을 NULL로 다시 설정합니다.

  2. IoReleaseCancelSpinLock을 호출하여 IRP에 지정된 CancelIRQL을 전달하여 IRP에 대한 취소 스핀 잠금을 해제합니다.

  3. 디바이스 확장의 관련 필드를 다시 설정합니다. 예를 들어 대기/절전 모드 해제 IRP가 보류 중인 경우 대부분의 드라이버는 플래그를 설정하고 디바이스 확장에서 IRP에 대한 포인터를 유지합니다.

    드라이버가 다른 IRP를 취소하는 동안 대기/절전 모드 해제 IRP를 받을 수 있습니다. 드라이버는 스핀 잠금 보호(또는 해당)에 IRP가 이미 있는지 확인하기 위해 검사 합니다. 이 경우 드라이버는 처리를 신중하게 동기화하여 올바른 IRP를 취소해야 합니다. 루틴 취소 에서 스핀 잠금을 사용하는 방법에 대한 자세한 내용은 IRP 취소를 참조하세요.

  4. 필요한 디바이스 설정을 변경합니다. 예를 들어 모뎀 드라이버는 디바이스의 절전 모드 해제 설정을 사용하지 않도록 설정합니다.

  5. Irp-IoStatus.Status>를 STATUS_CANCELLED 설정합니다.

  6. IoCompleteRequest를 호출하여 대기/절전 모드 해제 IRP를 완료하고 IO_NO_INCREMENT 지정합니다.

  7. 드라이버가 이전에 부모 디바이스에 대한 관련 IRP_MN_WAIT_WAKE 요청한 경우 드라이버는 취소 루틴 내에서 해당 IRP를 취소해야 합니다. 드라이버는 부모의 IRP를 취소하기 전에 취소 스핀 잠금을 해제해야 합니다.

    예를 들어 디바이스의 버스 드라이버 역할을 하고 부모에 대한 전원 정책 드라이버를 소유하는 드라이버는 이전에 부모에게 보낸 관련 대기/절전 모드 해제 IRP를 취소해야 합니다. IoCancelIrp을 호출하면 디바이스 스택 아래로 부모의 취소 루틴이 호출됩니다.