스토리지 클래스 드라이버의 ReleaseQueue 루틴
스토리지 클래스 드라이버가 SRB_FLAGS_NO_QUEUE_FREEZE 지정된 요청에 대해 SrbFlags 를 사용하지 않는 한 시스템 포트 드라이버는 다음 중 한 가지 후에 지정된 논리 단위에 대한 큐를 중지합니다.
논리 단위가 요청을 실행하는 동안 버스 재설정이 발생했습니다.
논리 단위는 클래스 드라이버가 SRB의 ScsiStatus 멤버에서 찾을 수 있는 SCSISTAT_CHECK_CONDITION 또는 SCSISTAT_COMMAND_TERMINATED 반환했습니다.
요청 시간이 초과되었습니다.
요청이 SCSIMESS_ABORT 같은 버스 메시지 명령에 의해 종료되었습니다.
포트 드라이버는 SrbStatus 멤버에서 SRB_STATUS_QUEUE_FROZEN 요청을 반환하여 LU 관련 큐가 고정되었음을 나타냅니다. 클래스 드라이버의 새 요청을 큐에 삽입할 수 있지만 해당 큐가 고정된 경우 자동 센스 요청만 논리 단위로 전송됩니다.
이러한 조건에서 큐를 동결하면 대기 중인 다른 작업이 실행되기 전에 각 스토리지 클래스 드라이버에서 오류를 분석할 수 있습니다. 예를 들어 미디어가 변경된 경우 큐에 대기된 작업을 취소해야 할 수 있습니다. 큐를 플러시하기 위해 드라이버는 SRB_FLAGS_BYPASS_FROZEN_QUEUE SrbFlags ORed를 사용하여 요청을 보낼 수 있습니다.
ReleaseQueue 루틴은 IRP 및 SRB를 할당하고 설정하여 고정된 큐를 해제하거나 플러시합니다. SRB의 Function 멤버는 SRB_FUNCTION_RELEASE_QUEUE 또는 SRB_FUNCTION_FLUSH_QUEUE 설정해야 합니다. 이 멤버는 모두 고정된 큐를 해제하고 대상 논리 단위에 대해 현재 큐에 대기 중인 모든 요청을 취소합니다. 포트 드라이버는 SrbStatus 멤버가 SRB_STATUS_REQUEST_FLUSHED 설정하여 플러시된 큐의 모든 요청을 완료합니다.
고정된 큐를 해제하지 못하면 디바이스에 액세스할 수 없으므로 낮은 메모리 조건에서도 드라이버의 ReleaseQueue 루틴이 성공하도록 설계되어야 합니다. ReleaseQueue 루틴은 먼저 NonPagedPool 메모리 형식으로 ExAllocatePool을 호출하여 SRB에 대한 메모리를 할당하려고 시도해야 하며, 할당이 실패하면 드라이버 초기화 중에 미리 할당된 SRB를 사용합니다. 스토리지 클래스 드라이버의 디바이스 확장 설정에 설명된 대로 드라이버가 디바이스 확장을 초기화할 때 보류할 SRB를 할당하는 경우 해당 ReleaseQueue 는 메모리 풀이 부족한 경우 해당 SRB를 사용할 수 있으며, 여러 동시 릴리스 작업이 필요할 수 있는 경우 적절한 동기화 메커니즘을 사용할 수 있습니다.
클래스 드라이버의 ReleaseQueue 루틴은 일반적으로 IoCompletion 루틴에서 비동기적으로 호출됩니다. 클래스 드라이버의 IoCompletion 루틴은 ReleaseQueue 를 호출하여 고정되지 않은 큐를 플러시할 수 없습니다. 그러나 ReleaseQueue 를 호출하여 고정되지 않은 큐를 해제할 수 있으며 포트 드라이버는 이러한 요청을 무시합니다.