次の方法で共有


ストリーム ミニドライバーの作成

ストリーム クラス ドライバーのメインの設計目標は、マルチプロセッサ マシンのサポートとカーネル ストリーミング セマンティクスのサポートの複雑さを含むオペレーティング システムの処理の両方の作業を処理することです。 ミニドライバーは、実行する必要がある操作のデバイス固有の部分のみを処理する必要があります。 クラス ドライバーは、ミニドライバーのメモリを割り当て、ミニドライバーが必要とする可能性がある NT カーネル リソースのブックキーピングを実行し、(必要に応じて) すべての同期の問題を処理します。

クラス ドライバーは、ミニドライバーによって提供されるコールバックのセットを介してミニドライバーと通信します。 ストリーミング ミニドライバーを記述する作業のほとんどは、これらのコールバックを記述する場合に発生します。

このドキュメントでは、ミニドライバーによって提供される各ルーチンを StrMiniXxx と呼びます。 基になるハードウェアが実行できるさまざまな機能の数に応じて、ミニドライバーは各ルーチンの 1 つ以上のバージョンを提供する必要がある場合があります。

ストリーミング ドライバーは、通常、複数の異なるデータ ストリームをサポートできます。 たとえば、DVD プレーヤーはオーディオ ストリームとビデオ ストリームの両方を生成します。 カーネル ストリーミングのコンテキスト内では、データの各ストリームはピンで表されます。

ストリーム クラス ドライバーは、ミニドライバーの各ピンを追跡します。 クラス ドライバーの用語では、各ピンの種類はストリームです。 ピンの種類などのストリームには、複数のインスタンスが含まれる場合があります。 ストリームは I/O 要求を受信できるため、ドライバーはストリームごとにコールバックを提供する必要があります。

ミニドライバーが提供する必要があるルーチンを次に示します。 詳細については、以下とリファレンス ガイドを参照してください。

すべてのミニドライバーが提供するルーチン

StrMiniCancelPacket

StrMiniReceiveDevicePacket

StrMiniRequestTimeout

StrMiniEvent

StrMiniInterrupt

ミニドライバーが各ストリームに対して提供するルーチン

StrMiniReceiveStreamDataPacket

StrMiniReceiveStreamControlPacket

StrMiniEvent

StrMiniClock

ミニドライバーは、複数の異なるストリームに対して同じコールバックを使用できます。 コールバックは、その代わりにそのパラメーターから呼び出されたストリームを決定できます。

ミニドライバーは、すべての WDM ドライバーと同様に、DriverEntry ルーチンも提供する必要があります。 ミニドライバーの DriverEntry ルーチンのメインタスクは、ミニドライバーをクラス ドライバーに登録することです。

クラス ドライバーは、ミニドライバーの代わりにすべての I/O 要求を受け取ります。 要求を完了するために必要な情報を取得するために、クラス ドライバーはストリーム要求ブロック (SRB) を構築し、StrMiniXXXパケット ルーチンのいずれかに渡します。 クラス ドライバーは、デバイス全体として StrMiniReceiveDevicePacket ルーチンに I/O 要求をディスパッチします。 個々のストリームに要求を StrMiniReceiveStreamDataPacket (カーネル ストリーミングの読み取りおよび書き込み要求の場合) または StrMiniReceiveStreamControlPacket (他の要求の場合) に渡します。

通常、クラス ドライバーは要求をキューに入れ、一度に 1 つずつミニドライバーに渡します。 ミニドライバーは、必要に応じて独自の同期を行うことができます。その後、ミニドライバーは、すぐに処理できない要求をキューに入れる必要があります。 詳細については、「 ミニドライバーの同期 」を参照してください。

ミニドライバーは、ストリーム要求ブロックを操作するための 2 つの追加ルーチンを提供する必要があります。 クラス ドライバーは、キャンセル IRP を受け取ったときに StrMiniCancelPacket を呼び出し、ミニドライバーに特定のパケットを取り消すよう指示する必要があります。 また、クラス ドライバーは、ミニドライバーがストリーム要求ブロックの処理を完了するのにかかる時間を追跡します。 ミニドライバーに時間がかかりすぎる場合、クラス ドライバーは要求をタイムアウトし、ミニドライバーの StrMiniRequestTimeout ルーチンを呼び出します。

ハードウェア割り込みが発生すると、オペレーティング システムはクラス ドライバーに通知し、ミニドライバーの StrMiniInterrupt ルーチンを呼び出して割り込みを処理します。