스토리지 주변 장치에 대한 전원 요청 처리
스토리지 클래스 드라이버는 전원 요청을 처리하기 위해 디바이스별 명령을 실행해야 합니다. 가장 일반적으로 스토리지 클래스 드라이버는 다음과 같습니다.
이러한 I/O를 처리하면 드라이버가 적절한 시간 내에 설정 전원 요청을 성공하지 못할 수 있는 경우 쿼리 전원 요청( IRP_MN_QUERY_POWER IRP_MJ_POWER)에 대한 응답으로 디바이스에 대한 I/O를 차단합니다.
IRP_MN_SET_POWER IRP_MJ_POWER 전원 설정 요청에 대한 응답으로 디바이스의 전원 상태를 설정합니다.
디바이스 전원을 켜기 위한 전원 설정 요청에 대한 응답으로 디바이스에 I/O를 다시 시작합니다.
전원 요청을 다음 하위 드라이버에 전달합니다.
드라이버가 IoCallDriver가 아닌 PoStartNextPowerIrp 및 PoCallDriver를 호출하여 전원 요청을 보내야 합니다.
스토리지 클래스 드라이버에 StartIo 루틴이 없는 한 디바이스의 전원 상태를 설정하기 전에 스토리지 포트 드라이버의 LU 관련 큐(IRP_MJ_SCSI SRB_FUNCTION_LOCK_QUEUE)를 잠그고 전원 작업이 완료될 때까지 비동기 작업을 차단해야 합니다(여러 단계가 포함될 수 있음). 전원 작업을 처리하기 위해 발급된 모든 SRB는 포트 드라이버에 도달하도록 SRB_FLAGS_BYPASS_LOCKED_QUEUE 설정해야 합니다. 드라이버가 전원 상태 설정을 완료한 후 포트 드라이버가 전원이 켜지면 대기 중인 IRP를 디바이스로 다시 보낼 수 있도록 큐(SRB_FUNCTION_UNLOCK_QUEUE 및 SRB_FLAGS_BYPASS_LOCKED_QUEUE IRP_MJ_SCSI)의 잠금을 해제해야 합니다.
스토리지 클래스 드라이버에 StartIo 루틴이 있는 경우 해당 루틴은 동기화를 처리하므로 클래스 드라이버가 포트 드라이버의 LU 관련 큐를 명시적으로 잠그고 잠금을 해제할 필요가 없습니다.
클래스 드라이버는 다른 드라이버가 잠근 큐를 바이패스하려고 시도해서는 안 됩니다.