共用方式為


處理資料流程要求區塊

作業系統會將裝置上的所有 I/O 要求分派至類別驅動程式。 類別驅動程式會藉由將 SRB 傳遞至 minidriver 來要求迷你驅動程式的硬體特定資訊。 類別驅動程式會在資料流程要求區塊的 Command 成員中指定其要求的作業。

迷你驅動程式整體和迷你驅動程式內的每個資料流程都可能會收到 I/O 要求。 minidriver 必須提供 StrMiniReceiveDevicePacket 常式來處理全裝置的要求。 每個資料流程都必須支援兩個常式來處理 I/O 要求:一個用於資料要求,另一個用於控制要求。 類別驅動程式會呼叫資料要求回呼 StrMiniReceiveStreamDataPacket,以處理資料流程上的所有讀取和寫入要求。 資料流程的其他所有要求都會傳遞至 StrMiniReceiveStreamControlPacket

如果類別驅動程式正在處理 minidriver 的同步處理,它會將串流要求排入佇列,並一次將它們分派至 minidriver。 類別驅動程式會維護三個不同的佇列:一個用於裝置要求,一個用於資料流程資料和控制要求。 minidriver 可能會發出它準備好從下列其中一個佇列取得新要求,如下所示:

要求類型 常式傳回的值 常式的 NotificationType 參數

裝置要求

StreamClassDeviceNotification

ReadyForNextDeviceRequest

資料流程控制要求

StreamClassStreamNotification

ReadyForNextStreamControlRequest

資料流程資料要求

StreamClassStreamNotification

ReadyForNextStreamDataRequest

當類別驅動程式呼叫 StrMiniReceiveXXX封包時,它會將資料流程要求區塊交給迷你驅動程式。 minidriver 的常式可以唯一存取資料流程要求區塊,直到它向類別驅動程式發出訊號之前,它已完成要求。

當 minidriver 完成處理要求時,它應該向類別驅動程式發出其已完成要求的訊號,如下所示:

  1. minidriver 應該在資料流程要求區塊的 [ 狀態 ] 欄位中設定要求的狀態。

  2. minidriver 應該藉由呼叫 StreamClassDeviceNotificationStreamClassStreamNotification來發出已完成要求的訊號。 若要完成裝置要求,minidriver 會使用 DeviceRequestComplete 的NotificationType參數呼叫StreamClassDeviceNotification。 若要完成資料流程要求,minidriver 會使用 StreamRequestComplete 的NotificationType參數呼叫StreamClassStreamNotification

  3. 如果類別驅動程式正在處理同步處理,而且迷你驅動程式尚未向類別驅動程式發出訊號,表示它已準備好在此佇列上取得另一個要求,則現在應該這麼做。

minidriver 可以藉由呼叫 StreamClassCompleteRequestAndMarkQueueReady來結合 2 和 3。

minidriver 會以非同步方式處理要求,因此類別驅動程式可能需要取消或逾時要求。 為了這些目的,minidriver 必須提供 StrMiniCancelPacketStrMiniRequestTimeout 常式。 類別驅動程式會在取消或逾時要求時呼叫個別的 minidriver 常式。

當作業系統取消基礎 I/O 要求時,類別驅動程式會取消要求。 類別驅動程式會逾時處理太長的要求,它會遞減串流要求區塊的 TimeoutCounter 成員中逾時要求之前的秒數計數器。 如果 minidriver 必須在要求上延遲處理很長一段時間,它應該將 TimeoutCounter 成員設定為零 -- 類別驅動程式接著不會逾時要求。 一旦 minidriver 繼續處理要求,它應該重設 TimeoutCounter 以等於資料流程要求區塊的 TimeoutOriginal 成員。 minidriver 可以重設 TimeoutOriginal ,以變更要求逾時之前的時間長度。如需詳細資訊 ,請參閱HW_STREAM_REQUEST_BLOCK