次の方法で共有


デバイスのインストール時の自動構成

次の図は、デバイスのインストール時の自動構成のデータ フローを示しています。

diagram illustrating the data flow in autoconfiguration when a device is installed.

  1. プリンターがインストールされると、スプーラーは、DrvPrinterEvent を呼び出し、その呼び出しで PRINTER_EVENT_INITIALIZE を渡すことで、ドライバーを初期化します。

  2. ドライバーは、bidi 通信インターフェイスを使用して、\Printer.Configuration.DuplexUnit:Installed や \Printer.Configuration.HardDisk:Installed などのインストール可能なオプションの値を含む、関連データを取得します。

  3. bidi 通信インターフェイスは、これらの属性の値をポート モニターに照会します。 ポート モニターのキャッシュに、要求されたデータの一部が含まれている場合があります。 次の手順の説明では、\Printer.Configuration.HardDisk:Installed の値はポート モニターのキャッシュに含まれているが、\Printer.Configuration.DuplexUnit:Installed の値は含まれていないと仮定します。

  4. ポート モニターにキャッシュがあり、その中に 1 つ以上の要求された値が保存されている場合、ポート モニターはこれらの値を bidi 通信インターフェイスに返します。 キャッシュに値が含まれていない場合、ポート モニターは ERROR_NO_DATA を返します。 ポート モニターがキャッシュを実装しているがキャッシュが空の場合、bidi クエリは失敗する可能性があることにご注意ください。 この問題を防ぐために、ポート モニターは、キャッシュに格納されたときに bidi 通信インターフェイスに通知する必要があります。

  5. bidi 通信インターフェイスは、ポート モニターから受信した情報をドライバーに渡します。 bidi 通信インターフェイスからポート モニターへの呼び出しで何らかの理由によりエラーが発生した場合、ドライバーはこれらの属性の既定値を設定する必要があります。 ポート モニターは、要求された属性に関する情報を受信するとすぐに、この情報を含む通知を bidi 通信インターフェイスに送信する必要があります。

    ドライバーは、\Printer.Configuration.HardDisk:Installed の値 (ポート モニターのキャッシュから取得) と \Printer.Configuration.DuplexUnit:Installed の既定値でレジストリを更新します。

  6. ポート モニターは、キャッシュされた値 (\Printer.Configuration.HardDisk:Installed) を含む両方の値をデバイスに照会します。

  7. デバイスは、照会された属性の値をポート モニターに送信します。 値がまだキャッシュに存在しない属性、または値がキャッシュ内と異なる属性の場合、ポート モニターは新しい値をキャッシュに加えます。

  8. ポート モニターは、以前はキャッシュに含まれていなかった値や変更された値を含む通知をスプーラーに送信します。 この例では、ポート モニターは \Printer.Configuration.DuplexUnit:Installed の新しい値に関する通知をスプーラーに送信します。 キャッシュされた値がデバイスから受信した新しい値と同じ場合、ポート モニターはスプーラーに通知を送信しないことにご注意ください。

  9. スプーラーは、DrvPrinterEvent を呼び出し、その呼び出し内のすべての変更された値に関する情報に加えて、PRINTER_EVENT_CONFIGURATION_UPDATE を渡すことでポート モニターからの通知に応答します。 このアクションでは、値が初めてキャッシュに配置された属性、または値が変更された属性 (この例では \Printer.Configuration.DuplexUnit:Installed) の値をドライバーに通知する、レジストリを更新するという 2 つの目的を果たします。 スプーラーはドライバーがスレッドセーフでなくてもいいように、プリンターごとにその呼び出しを DrvPrinterEvent にシリアル化します。

    デバイス情報はレジストリに格納されるため、ドライバーは、物理デバイスと直接通信することなく、UI またはデバイスの機能情報を更新する呼び出しを満たすことができます。 変更通知によってドライバーがトリガーされ、デバイスのクエリが実行され、デバイスの構成状態が更新されるため、ドライバーは、レジストリに格納されている情報が正しいことを確認できます。

  10. ドライバーは、最新の構成に従って UI を更新します。

    通知メッセージには変更された値が含まれているため、ドライバーは、デバイスのインストール中に変更が発生したタイミングを確認できます。 ただし、通知が大きすぎて通知メカニズムを介して送信できない場合は、通知に 1 つ以上の ReducedSchema インスタンスが追加され、そのそれぞれによってデバイスの特性が変更されたことが示されますが、その新しい値の詳細は含まれません。