共用方式為


儲存體類別驅動程式的 ReleaseQueue 常式

除非儲存體類別驅動程式使用 SRB_FLAGS_NO_QUEUE_FREEZE 指定要求的 SrbFlags ,否則系統埠驅動程式會在下列任一項之後凍結指定邏輯單元的佇列:

  • 邏輯單元執行要求時發生匯流排重設。

  • 邏輯單元傳回SCSISTAT_CHECK_CONDITION或SCSISTAT_COMMAND_TERMINATED,類別驅動程式可以在 SRB 的 ScsiStatus 成員中找到。

  • 要求逾時。

  • 要求已由匯流排訊息命令終止,例如 SCSIMESS_ABORT。

埠驅動程式指出已藉由傳回 SrbStatus 成員中具有SRB_STATUS_QUEUE_FROZEN的要求,來凍結 LU 特定的佇列。 類別驅動程式的新要求可以插入佇列中,但只要佇列已凍結,則只會將自動傳送要求傳送至邏輯單元。

在這些情況下凍結佇列,可讓每個儲存體類別驅動程式有機會在執行其他佇列作業之前分析錯誤。 例如,如果媒體已變更,可能需要取消佇列作業。 若要排清佇列,驅動程式可以使用 SrbFlags ORed 與 SRB_FLAGS_BYPASS_FROZEN_QUEUE 傳送要求。

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 來釋放未凍結的佇列,而埠驅動程式只會忽略這類要求。