디바이스 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를 대기했거나 디바이스에 인러시브 전원이 필요한 경우 버스 드라이버가 디바이스에 전원을 적용합니다. 그렇지 않으면 버스 드라이버는 디바이스와 통신해야 하는 즉시 전원을 적용합니다.
전원 끄기, 대기 및 최대 절전 모드 상태에서 빠른 시작 시간을 달성하기 위한 모범 사례 목록은 시스템 시작 성능 향상을 참조하세요.