다음을 통해 공유


디바이스 전원 정책 소유자에서 시스템 Query-Power IRP 처리

디바이스 전원 정책 소유자가 시스템 전원 상태에 대한 IRP_MN_QUERY_POWER 받으면 쿼리를 전달하고 IoCompletion 루틴에서 디바이스 전원 상태에 대한 IRP_MN_QUERY_POWER 전송하여 응답합니다. 스택의 모든 드라이버가 디바이스 쿼리를 완료하면 디바이스 전원 정책 소유자가 시스템 쿼리를 완료합니다.

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

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

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

  2. 필터 또는 함수 드라이버에서 시스템 Query-Power IRP 실패에 설명된 대로 드라이버가 쿼리된 시스템 전원 상태를 지원할 수 있는지 확인합니다. 그렇지 않은 경우 해당 섹션에 설명된 대로 실패 상태 IRP를 완료합니다.

    그러나 디바이스가 절전 모드 해제를 사용하도록 설정되어 있지만 최대 절전 모드에서 시스템을 절전 모드에서 해제할 수 없는 경우 드라이버는 S4(PowerSystemHibernate)에 대한 쿼리에 실패하지 않아야 합니다. 이 경우 드라이버의 전원 정책 소유자( IRP_MN_WAIT_WAKE 전송)는 대기/절전 모드 해제 IRP를 취소하고 시스템 쿼리를 성공해야 합니다. 자세한 내용은 대기/절전 모드 해제 IRP 취소를 참조하세요.

  3. 드라이버가 쿼리된 시스템 전원 상태를 지원할 수 있는 경우 IoMarkIrpPending을 호출합니다.

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

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

  6. IoCallDriver(Windows 7 및 Windows Vista의 경우) 또는 PoCallDriver(Windows Server 2003, Windows XP 및 Windows 2000)를 호출하여 IRP를 다음 하위 드라이버에 전달합니다.

  7. STATUS_PENDING 반환합니다.

IoCompletion 루틴은 다음을 수행해야 합니다.

  1. Irp-IoStatus.Status>를 확인하여 낮은 드라이버가 IRP를 성공적으로 완료하는지 확인합니다. 낮은 드라이버가 성공하지 않는 NTSTATUS 값을 지정한 경우 IoCompletion 루틴은 NTSTATUS 값을 반환해야 합니다.

  2. 낮은 드라이버가 IRP를 성공적으로 완료한 경우 PoRequestPowerIrp 를 호출하여 쿼리된 시스템 전원 상태에 유효한 디바이스 전원 상태에 대한 디바이스 쿼리 전원 IRP를 보냅니다. 필요한 경우 DEVICE_CAPABILITIES 구조의 DEVICE_STATE 배열을 참조하여 쿼리된 시스템 전원 상태에 유효한 디바이스 전원 상태를 확인합니다.

  3. PoRequestPowerIrp 호출에서 콜백 루틴(CompletionFunction 매개 변수)을 지정하고 컨텍스트 영역에서 시스템 IRP를 전달합니다.

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

IRP가 완료되고 IRP 처리 중에 설정된 모든 IoCompletion 루틴이 실행된 후 전원 관리자는 I/O 관리자를 통해 전원 정책 관리자의 콜백 루틴( CompletionFunction 매개 변수를 PoRequestPowerIrp)을 호출합니다. 콜백 루틴은 다음을 수행해야 합니다.

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

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

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

디바이스 전원 정책 소유자는 디바이스 쿼리를 보낼 뿐만 아니라 디바이스 스택에서 처리해야 합니다. 자세한 내용은 디바이스 전원 상태에 대한 IRP_MN_QUERY_POWER 처리를 참조하세요.