다음을 통해 공유


디바이스 Power-Up IRP 처리

디바이스 전원 강화 IRP는 현재 디바이스 전원 상태보다 더 많은 전원이 필요한 IRP_MN_SET_POWER 및 디바이스 전원 상태를 지정합니다. 일반적으로 전원이 켜진 IRP는 디바이스 작업 상태 PowerDeviceD0을 지정합니다.

디바이스 전원을 켜는 요청은 먼저 디바이스의 기본 버스 드라이버에서 처리한 다음 스택을 백업하는 각 연속 드라이버에 의해 처리되어야 합니다.

다음 그림에서는 전원 켜기 IRP 처리와 관련된 단계를 보여줍니다.

디바이스 전원 켜기 요청 처리를 보여 주는 다이어그램

전원 공급에 대한 IRP_MN_SET_POWER 요청을 처리할 때 함수 또는 필터 드라이버는 다음을 수행해야 합니다.

  • IoAcquireRemoveLock을 호출하여 드라이버가 전원 켜기 IRP를 처리하는 동안 IRP_MN_REMOVE_DEVICE 요청을 받지 않도록 합니다.

    IoAcquireRemoveLock이 오류 상태 반환하는 경우 드라이버는 IRP를 계속 처리해서는 안 됩니다. 대신 Windows Vista부터 드라이버는 IoCompleteRequest를 호출하여 IRP를 완료한 다음 실패 상태 반환해야 합니다. Windows Server 2003, Windows XP 및 Windows 2000에서 드라이버는 IoCompleteRequest를 호출하여 IRP를 완료한 다음 PoStartNextPowerIrp를 호출하여 다음 전원 IRP를 시작한 다음 실패 상태 반환해야 합니다.

  • IoMarkIrpPending을 호출하여 보류 중인 IRP를 표시합니다.

  • IoCopyCurrentIrpStackLocationToNext를 호출하여 IRP 스택 위치를 설정합니다. 드라이버는 IoCompletion 루틴을 설정하는 경우 IoSkipCurrentIrpStackLocation을 호출하지 않아야 합니다.

  • IoSetCompletionRoutine을 호출하여 전원 강화 IoCompletion 루틴을 설정합니다.

    디바이스 전원 강화 IRP를 처리할 때 드라이버는 IoCompletion 루틴을 설정하여 컨텍스트를 복원하고, 잠금 제거를 해제하고, IRP가 완료되고 디바이스가 켜진 후 다른 필수 작업을 수행해야 합니다. 드라이버는 IRP가 완료되기 전에 컨텍스트를 복원해서는 안 됩니다. 자세한 내용은 디바이스 전원 IRP에 대한 IoCompletion 루틴을 참조하세요.

  • IoCallDriver(Windows 7 및 Windows Vista) 또는 PoCallDriver(Windows Server 2003, Windows XP 및 Windows 2000)를 호출하여 IRP를 다음 하위 드라이버에 전달합니다. IRP는 디바이스 스택 아래로 버스 드라이버까지 이동해야 합니다. 버스 드라이버만 IRP를 완료할 수 있습니다.

  • STATUS_PENDING 반환합니다.

버스 드라이버가 IRP를 받으면 먼저 검사 디바이스가 여전히 존재하고 절전 모드에서 제거되거나 교체되지 않았는지 확인해야 합니다. 디바이스가 더 이상 없는 경우 버스 드라이버는 부모 디바이스에서 IoInvalidateDeviceRelations를 호출하여 디바이스가 사라졌다는 것을 플러그 앤 플레이 관리자에게 알려야 합니다. 이 경우 버스 드라이버가 디바이스 전원 강화 IRP에 실패할 수 있습니다.

디바이스가 여전히 있는 경우 버스 드라이버는 디바이스를 작동 상태로 되돌리는 데 필요한 작업을 수행하고 PoSetPowerState 를 호출하여 새 디바이스 전원 상태를 전원 관리자에게 알리고 IRP(IoCompleteRequest)를 완료합니다. 디바이스가 절전 모드인 동안 드라이버가 I/O를 대기했거나 디바이스에 인러시브 전원이 필요한 경우 버스 드라이버가 디바이스에 전원을 적용합니다. 그렇지 않으면 버스 드라이버는 디바이스와 통신해야 하는 즉시 전원을 적용합니다.

전원 끄기, 대기 및 최대 절전 모드 상태에서 빠른 시작 시간을 달성하기 위한 모범 사례 목록은 시스템 시작 성능 향상을 참조하세요.