Avc.sys の使用
Windows が Avc.sys を読み込んで初期化した後、Avc.sysは標準の AV/C ユニットとサブユニット コマンドを使用して、IEEE 1394 バスに接続されているすべての AV/C デバイス (コンピューターが仮想 AV/C ユニットの場合は仮想サブユニットを含む) でアクティブなサブユニットを検出します。 Avc.sys は、その後、アクティブなすべてのサブユニットのデバイス識別子 (ID) を生成します。 次に、Avc.sysでは、標準のプラグ アンド プレイ (PnP) メカニズムを使用して、各サブユニットの適切なサブユニット ドライバーを読み込みます。 読み込まれるサブユニット ドライバーは、サブユニット ドライバーをインストールする INF ファイルとサブユニットのデバイス識別子に基づいて選択されます。これは、Avc.sys によって生成され、AV/C デバイス ID で説明されています。 デバイス識別子は、サブユニットの SubunitTypeフィールドとSubunitID フィールドと組み合わせて、AV/C デバイスのユニット情報から生成されます。 サブユニットをサポートするドライバーは、ベンダー固有にすることも、サブユニットの種類に応じた汎用的なものにすることもできます。 たとえば、ほとんどの DV ビデオカメラのサブユニット ドライバーは、Microsoft が提供する Msdv.sys です。
サブユニット ドライバーは、すべてのドライバーで使用されるWDM アーキテクチャに基づく標準的な IRP ベースのメカニズムを介して Avc.sys と通信します。 サブユニット ドライバーは、ドライバー スタックから AV/C プロトコル ドライバー (Avc.sys) に IRP を割り当てて送信することで、AV/C サブユニットと通信します。 I/O 要求を行うには、Microsoft Windows Driver Kit (WDK) に付属しているヘッダー ファイル Avc.h を含めます。
サブユニット・ドライバは Avc.sysによって処理されるIRPを割り当て、初期化します。 サブユニット ドライバーは、IRP の Parameters.DeviceIoControl.IoControlCode メンバーを、目的の AV/C 操作に対応する IOCTL に設定します。
Avc.sys は、サポートするために読み込まれたサブユニット ドライバー スタック (ピアまたは仮想) に応じて、2 つのデバイス インターフェイスの 1 つを登録します。 これらのインターフェイスは、Avc.sys が、サブユニット ドライバー、その他のドライバー、およびアプリケーションが使用するためにエクスポートする機能を定義します。 Avc.sys は、その後ドライバーの PnP 状態に応じて、インターフェイスの状態を有効または無効に変更します。
Avc.sys は、GUID_AVC_CLASSの新しいインスタンスを登録し、読み込まれた場合、外部 AV/C サブユニット (ピア スタック) のサポートを提供します。 このインターフェイスでは、次の I/O 制御 (IOCTL) コードのみがサポートされます。
IOCTL_AVC_CLASSでは、複数の関数コードがサポートされます。 ピア サブユニットをサポートする Avc.sys のインスタンスの子ドライバーは、親デバイス オブジェクトを介してこのインターフェイスへのアクセスを保証されます。
GUID_AVC_CLASS インターフェイスは、すべてのIOCTL_AVC_CLASS関数コードをサポートしますが、各関数のリファレンス ページで説明されているように、一部、使用に制限があります。
Avc.sys は、GUID_VIRTUAL_AVC_CLASSの新しいインスタンスを登録し、読み込まれた場合、外部 仮想 AV/C サブユニット (仮想スタック) のサポートを提供します。 このインターフェイスは、次の 4 つの I/O 制御 (IOCTL) コードをサポートします。
GUID_VIRTUAL_AVC_CLASS インターフェイスは、すべてのIOCTL_AVC_CLASS関数コードをサポートしているわけではありません。 個々の関数コードのリファレンス ページには、Avc.sysの GUID_VIRTUAL_AVC_CLASS インスタンスでサポートされているかどうかが明記されています。
IOCTL_AVC_CLASS IRP は、IRP_MJ_INTERNAL_DEVICE_CONTROL を介して、カーネル モードでのみサポートされます (通常、ドライバー間の通信用)。 そのため、アプリケーションは、IOCTL_AVC_CLASS IOCTL コードによって提供される関数に直接アクセスすることはできません。
最後の 3 つの IOCTL コードは、カーネル モードとユーザー モードの両方で IRP_MJ_DEVICE_CONTROL でサポートされています。 つまり、アプリケーションは、これらの IOCTL を直接 Avc.sys 送信できます。
IOCTL_AVC_CLASS IOCTL コードには、常に I/O 要求ブロック (IRB) が伴う必要があります。これは、実行する AV/C 操作をさらに記述します。 IRB ヘッダーには、IRB の残りの部分の構造を決定する関数番号が含まれています。 IRB の構造とサイズは、関数によって異なります。 Avc.sys は、次の 2 つのカスタム IRB を使用します。
サブユニット ドライバーで使用する必要がある IRB の選択は、目的の関数によって異なります。 さらに詳しいAvc.sysがサポートするIOCTL_AVC_CLASSファンクションコードについては、AV/C プロトコルドライバファンクションコードを参照してください。
サブユニット ドライバーで使用されるプライマリ AV/C 関数は、 AVC_FUNCTION_COMMANDであり、AVC_COMMAND_IRB 構造体を使用します。 AVC_FUNCTION_COMMAND AV/C 要求を送信し、対応する AV/C 応答を受信します。 AV/C コマンドのビルドの詳細は Avc.sys によって処理されますが、サブユニット ドライバーは、各コマンドの AV/C オペコードとオペランドを提供する必要があります。