デバイス ミューテックスを使用して、階層内のオブジェクトをデバイスからフィルターに同期します。 各 AVStream デバイスには、1 つのデバイス ミューテックスが関連付けられています。 フィルター ファクトリとフィルターの両方の作成と破棄は、このミューテックスによって同期されます。 特定のプラグ アンド プレイおよび電源管理操作も、このミューテックスと同期されます。 ミニドライバーは、デバイス ミューテックスに関する 2 つの主な問題に焦点を当てています。
オブジェクト階層は、デバイス ミューテックスが保持されている場合に、デバイスから個々のフィルター までのみ 安定することが保証されます。 その結果、ミニドライバーは 、KsCreateFilterFactory を呼び出してフィルター ファクトリを手動で作成する前に、デバイス ミューテックスを取得する必要があります。 ミニドライバーは、オブジェクト階層を走査する前に、デバイスミューテックスを取得し、KsXxxGetFirstChildXxx関数とKsXxxGetNextSiblingXxx関数を呼び出す必要があります。
AVStream は、次の要求を受信すると、ミニドライバーの代わりにデバイス ミューテックスを保持します。
フィルターとピンのスリープとウェイクアップの通知。 KsFilterRegisterPowerCallbacks と KsPinRegisterPowerCallbacks を参照してください。
デバイス ミューテックスを再帰的に取得できないことに注意することが重要です。 下記の例を検討してください。 AVStream はスリープ通知を受信します。 前述のように、ミニドライバーの代わりにデバイス ミューテックスを受け取ります。 AVStream がスレッド A のコンテキストでミニドライバー提供のコールバック ルーチンを呼び出す場合、ミニドライバーは、その後、スレッド A でデバイス ミューテックスを取得しようとしないでください。これを行うと、スレッド A がそれ自体でデッドロックします。
AVStream は、多くの場合、デバイス ミューテックスが既に保持されている間にフィルター 制御ミューテックスを取得します。 したがって、一般的な規則として、フィルター 制御ミューテックスを取得したスレッドは、その後、デバイス ミューテックスを受け取るべきではありません。
デバイス ミューテックスを操作するには、次の関数を使用します。