次の方法で共有


ストリーム要求ブロックの処理

オペレーティング システムは、デバイス上のすべての I/O 要求をクラス ドライバーにディスパッチします。 クラス ドライバーは、さらに、ミニドライバーに SRB を渡すことによって、ミニドライバーにハードウェア固有の情報を要求します。 クラス ドライバーは、ストリーム要求ブロックの Command メンバーで要求する操作を指定します。

ミニドライバー全体とミニドライバー内の各ストリームの両方が、I/O 要求を受け取る場合があります。 ミニドライバーは、デバイス全体の要求を処理する StrMiniReceiveDevicePacket ルーチンを提供する必要があります。 各ストリームは、I/O 要求を処理するための 2 つのルーチン、すなわちデータ要求用と制御要求用をサポートする必要があります。 クラス ドライバーは、ストリーム上のすべての読み取りおよび書き込み要求を処理するために、データ要求コールバック StrMiniReceiveStreamDataPacket を呼び出します。 ストリームに対する他のすべての要求は、StrMiniReceiveStreamControlPacket に渡されます。

クラス ドライバーがミニドライバーの同期を処理している場合は、ストリーム要求をキューに入れ、一度に 1 つずつミニドライバーにディスパッチします。 クラス ドライバーには、3 つの個別のキュー (デバイス要求用に 1 つ、ストリーム データと制御要求用にそれぞれ 1 つ) が含まれています。 ミニドライバーは、次のように、これらのキューのいずれかからの新しい要求の準備ができていることを通知する場合があります。

要求の種類 ルーチンによって返される値 ルーチンの NotificationType パラメーター

デバイス要求

StreamClassDeviceNotification

ReadyForNextDeviceRequest

ストリーム制御要求

StreamClassStreamNotification

ReadyForNextStreamControlRequest

ストリーム データ要求

StreamClassStreamNotification

ReadyForNextStreamDataRequest

クラス ドライバーが StrMiniReceiveXXX パケットを呼び出すと、ストリーム要求ブロックをミニドライバーに渡します。 ミニドライバーのルーチンは、要求が完了したクラス ドライバーに通知するまで、ストリーム要求ブロックへの唯一のアクセス権を持ちます。

ミニドライバーは、要求の処理を完了すると、次のように、要求を完了したクラス ドライバーを通知する必要があります。

  1. ミニドライバーは、ストリーム要求ブロックの [状態] フィールドに要求の状態を設定する必要があります。

  2. ミニドライバーは、StreamClassDeviceNotification または StreamClassStreamNotification を呼び出すことによって、要求が完了したことを通知する必要があります。 デバイス要求を完了するために、ミニドライバーは DeviceRequestComplete の NotificationType パラメーターを使用して StreamClassDeviceNotification を呼び出します。 デバイス要求を完了するために、ミニドライバーは StreamRequestComplete の NotificationType パラメーターを使用して StreamClassDeviceNotification を呼び出します。

  3. クラス ドライバーが同期を処理していて、ミニドライバーがこのキューで別の要求の準備ができていることをクラス ドライバーにまだ通知していない場合は、ここで行う必要があります。

ミニドライバーは、StreamClassCompleteRequestAndMarkQueueReady を呼び出すことによって 2 と 3 を組み合わせることができます。

ミニドライバーは要求を非同期的に処理するため、クラス ドライバーは要求をキャンセルまたはタイムアウトする必要がある場合があります。 このような目的で、ミニドライバーは StrMiniCancelPacketStrMiniRequestTimeout ルーチンを提供する必要があります。 クラス ドライバーは、要求をキャンセルまたはタイムアウトするときに、それぞれのミニドライバー ルーチンを呼び出します。

基になる I/O 要求がオペレーティング システムによってキャンセルされると、クラス ドライバーは要求をキャンセルします。 クラス ドライバーは、処理に時間がかかりすぎる要求をタイム アウトします。ストリーム要求ブロックの TimeoutCounter メンバーで要求がタイムアウトするまでの秒数のカウンターがデクリメントされます。 ミニドライバーが要求の処理を長時間延期する必要がある場合は、TimeoutCounter メンバーを 0 に設定する必要があります。クラス ドライバーは要求をタイムアウトしません。 ミニドライバーは、要求の処理を再開すると、TimeoutCounter をストリーム要求ブロックの TimeoutOriginal メンバーにリセットする必要があります。 ミニドライバーは TimeoutOriginal をリセットして、要求がタイムアウトするまでの時間を変更できます。詳細については、「HW_STREAM_REQUEST_BLOCK」を参照してください。