다음을 통해 공유


System Set-Power IRP에 대한 응답으로 디바이스 Set-Power IRP 보내기

디바이스 전원 정책 소유자는 시스템 설정 전원 IRP에 응답하려면 다음 단계를 수행해야 합니다.

  1. IoAcquireRemoveLock을 호출하여 현재 IRP를 Tag 매개 변수로 전달하여 드라이버가 전원 IRP를 처리하는 동안 플러그 앤 플레이 IRP_MN_REMOVE_DEVICE 요청을 받지 않도록 합니다.

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

  2. IoCopyCurrentIrpStackLocationToNext를 호출하여 다음 하위 드라이버에 대한 IRP 스택 위치를 설정합니다.

  3. 시스템 설정 전원 IRP에서 IoCompletion 루틴을 설정합니다.

  4. IoMarkIrpPending을 호출하여 시스템 설정 전원 IRP를 보류 중으로 표시합니다.

  5. IoCallDriver(Windows Vista부터 시작) 또는 PoCallDriver(Windows Server 2003, Windows XP 및 Windows 2000)를 호출하여 시스템 설정 전원 IRP를 다음 하위 드라이버에 전달합니다.

  6. DispatchPower 루틴에서 STATUS_PENDING 반환합니다.

IoCompletion 루틴(이전 목록의 3단계 참조)에서 디바이스 전원 정책 소유자는 다음과 같이 디바이스 집합 전원 IRP를 보냅니다.

  1. 시스템 설정 전원 IRP를 검사하여 요청된 시스템 전원 상태를 가져옵니다. 해당 시스템 전원 상태에 적합한 디바이스 전원 상태를 선택합니다. 자세한 내용은 올바른 디바이스 전원 상태 확인 을 참조하세요.

  2. PoRequestPowerIrp를 호출하여 1단계에서 결정된 디바이스 전원 상태에 대한 IRP_MN_SET_POWER 보냅니다. 전원 정책 소유자는 디바이스가 이미 해당 상태인 경우에도 디바이스 설정 전원 요청을 보내야 합니다.

  3. PoRequestPowerIrp 호출에서 전원 완성 콜백 루틴(CompletionFunction)을 지정하고 컨텍스트 버퍼에서 시스템 세트 파워 IRP를 전달합니다.

  4. 드라이버가 전원 완성 콜백 루틴에서 시스템 set-power IRP 처리를 완료할 수 있도록 IoCompletion 루틴에서 STATUS_MORE_PROCESSING_REQUIRED 반환합니다.

디바이스 전원 정책 소유자는 디바이스 세트 전원 IRP를 보낼 뿐만 아니라 디바이스 스택을 통과할 때 이 IRP를 처리해야 합니다. 따라서 디바이스 전원 정책 소유자는 디바이스 집합 전원 IRP와 연결된 전원 완성 콜백 루틴 및 시스템 설정 전원 IRP에 대한 IoCompletion 루틴뿐만 아니라 디바이스 집합 전원 IRP에 대한 IoCompletion 루틴도 가질 수 있습니다. 자세한 내용은 디바이스 전원 상태에 대한 IRP_MN_SET_POWER 처리를 참조하세요.

I/O 관리자가 디바이스 세트 전원 IRP가 디바이스 스택 아래로 이동함에 따라 설정된 모든 IoCompletion 루틴을 호출한 후 I/O 관리자는 전원 완성 콜백 루틴을 호출합니다. 이 시간까지 스택의 모든 드라이버가 디바이스 설정 전원 IRP를 완료하고 디바이스 전원 전환이 완료됩니다.

전원 완성 콜백 루틴은 다음을 수행해야 합니다.

  1. PoStartNextPowerIrp를 호출하여 다음 전원 IRP를 시작합니다. (Windows Server 2003, Windows XP 및 Windows 2000에만 해당).

  2. 디바이스 집합 전원 IRP에 대해 반환된 상태 사용하여 시스템 설정 전원 IRP(IoCompleteRequest)를 완료합니다.

  3. IoReleaseRemoveLock을 호출하여 이전에 획득한 잠금을 해제합니다.

  4. set-power IRP가 완료된 상태 반환합니다.