Unless a storage class driver ORs the SrbFlags for a given request with SRB_FLAGS_NO_QUEUE_FREEZE, the system port driver freezes a queue for a given logical unit after any of the following:
邏輯單元執行要求時發生匯流排重設。
The logical unit returned SCSISTAT_CHECK_CONDITION or SCSISTAT_COMMAND_TERMINATED, which the class driver can find in the SRB's ScsiStatus member.
請求逾時。
要求已由匯流排訊息指令終止,例如 SCSIMESS_ABORT。
The port driver indicates that an LU-specific queue has been frozen by returning a request with SRB_STATUS_QUEUE_FROZEN in the SrbStatus member. 類別驅動程式的新要求可以插入佇列,但只要邏輯單元的佇列已凍結,就只會將自動感應要求傳送至邏輯單元。
在這些情況下凍結佇列,可讓每個記憶體類別驅動程式有機會在執行其他佇列作業之前分析錯誤。 例如,如果媒體已變更,則可能需要取消佇列工作。 To flush the queue, the driver can send a request with the SrbFlags ORed with SRB_FLAGS_BYPASS_FROZEN_QUEUE.
A ReleaseQueue routine allocates and sets up an IRP and an SRB to either release or flush a frozen queue. The Function member of the SRB must be set to SRB_FUNCTION_RELEASE_QUEUE or SRB_FUNCTION_FLUSH_QUEUE, which both releases a frozen queue and cancels all currently queued requests for the target logical unit. The port driver completes all requests in a flushed queue with their SrbStatus members set to SRB_STATUS_REQUEST_FLUSHED.
Failing to release a frozen queue makes the device inaccessible, so a driver's ReleaseQueue routine should be designed to succeed even in low memory conditions. A ReleaseQueue routine should first attempt to allocate memory for an SRB by calling ExAllocatePool with the NonPagedPool memory type and, if that allocation fails, use an SRB that was preallocated during driver initialization. 如果驅動程式在初始化其裝置延伸模組時配置 SRB 以保留,如 設定儲存體類別驅動程式的裝置延伸模組中所述,如果記憶體集區不足,其 ReleaseQueue 可以使用該 SRB,並具有適當的同步處理機制,以防可能需要多個並行發行作業。
Note that a class driver's ReleaseQueue routine is called asynchronously, generally from its IoCompletion routine. A class driver's IoCompletion routine cannot call ReleaseQueue to flush a queue that is not frozen. However, it can call ReleaseQueue to release an unfrozen queue, and the port driver simply ignores such a request.