AVStream のパケットベースの DMA
パケット ベースのダイレクト メモリ アクセス (DMA) は、ミニドライバーが直接データを読み取ったり、ユーザー モードから受信したバッファーをキャプチャするためにデータを直接書き込んだりするときに発生します。 Windows Driver Kit (WDK) のサンプルにある AVStream Simulated Hardware Sample Driver (AVSHwS) は、このタイプの DMA を実行する AVStream ミニドライバの構築方法を示しています。
パケット ベースの DMA スキームを実装するには次を行います。
関連する KSPIN_DESCRIPTOR_EX 構造体の Flags メンバに KSPIN_FLAG_GENERATE_MAPPINGS を指定します。 このフラグは、スキャッター/ギャザーのサポートがあるバス マスターでのみ使用する必要があることに注意してください。
Writing AVStream Minidrivers for Hardware で説明されているように、割り込みサービスルーチン (ISR) を登録します。
その後、AVStrMiniDeviceStart で次のディスパッチを開始します。
IoGetDmaAdapter を使用して DMA アダプター オブジェクトを設定します。
KsDeviceRegisterAdapterObject を呼び出して、AVStream で DMA アダプタオブジェクトを登録します。
KsDeviceRegisterAdapterObject の呼び出しで MaxMappingByteCount パラメータを提供することにより、ミニドライバーは単一のスキャッター/ギャザー マッピングの最大サイズを指定します。
スキャッタ/ギャザーのマッピングがこの最大サイズを超えた場合、AVStream は自動的にマッピングを複数のスキャッタ/ギャザーのマッピングに分割し、それぞれのマッピングは MaxMappingByteCount で指定されたサイズ以下になります。
AVStrMiniPinProcess コールバックルーチンも提供する必要があります。 ドライバー ライターは、このコールバックに適した機能を選択する必要があります。 1つの例として、次のようにします。
KsPinGetLeadingEdgeStreamPointer を呼び出します。
KsStreamPointerClone を呼び出してリーディング エッジをクローンします。
クローンに基づいて DMA ハードウェアをプログラムします。
KsStreamPointerAdvanceOffsets または KsStreamPointerAdvance を呼び出してリーディング エッジを進めます。
追加のフレームについては、必要に応じて手順 2 から繰り返します。
ハードウェアが DMA 完了のために割り込みをかけると、カーネルはベンダーが事前に登録した ISR を呼出します。 ISR では、ミニドライバーは遅延プロシージャ 呼び出し (DPC) をキューに入れます。
DPCは DataUsed と、場合によっては KSSTREAM_HEADER 構造体の他のメンバーを更新する必要があります。 DPCは、KsStreamPointerDelete を呼び出してクローンを削除し、関連するフレームを解放します。
あるいは、DPC は、フレームの一部のみが完了した場合、クローンポインタを進めることができます。 これを行うには、KsStreamPointerAdvanceOffsets を呼び出します。
処理を再開する必要があれば、KsPinAttemptProcessing を呼び出します。
Note
マッピングの長さが物理ページの長さが 1 ページ未満の場合、1 つの物理ページに存在することは保証されません。