クラス インストーラーと共同インストーラーの記述

Note

この項目で説明する機能は、ユニバーサル ドライバー パッケージまたはモバイル ドライバー パッケージではサポートされていません。 「ユニバーサル INF ファイルの使用」をご覧ください。

この項目では、共同インストーラーを作成するときに従う必要があるガイドラインを解説します。

ユーザー インターフェイスの表示

デバイスのインストール状態の保存

実行可能ファイルまたは DLL ファイルの読み込み

他のプロセスまたはサービスの開始

共同インストーラーの作成方法の詳細は、「共同インストーラーの作成」をご覧ください。

ユーザー インターフェイスの表示

デバイスのインストールは、主にシステム サービスで実行されます (非対話型) 。 つまり、ユーザーが目でとらえられない処理が実行され、その際にユーザー インターフェイスが表示されても、ユーザーはそれに応答することはできません。 デバイス インストール関数 (DIF) コードの処理中に、共同インストーラーにおいてダイアログ ボックスの使用があると、デバイスのインストールの応答が中断されます。

ほとんどの場合、インストール完了操作の処理時を除き、共同インストーラーとユーザーは対話しない必要があります。 インストール完了操作は、対話型の画面を通じて実行されます。

: ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION を含む DIF コードの失敗は、デバイスのインストール失敗につながるため、共同インストーラーはそれを避ける必要があります。 デバイスのインストールにユーザーとの対話が必要な場合は、共同インストーラーがインストール完了操作をサポートする必要があります。

デバイスのインストール状態の保存

共同インストーラー ダイナミック リンク ライブラリ (DLL) 内でデバイスのインストール状態を保存しないでください。 通常、Windows はインストーラーによって DIF コードが処理された後に DLL をアンロードするため、DLL 内に保存されている状態情報は保持されません。

デバイス インストーラーの状態を安全に保持するには、クラス インストーラーまたは共同インストーラーは、レジストリにあるデバイスのドライバー キー内のプロパティとして状態情報を保存する必要があります。 これを行うには、次の手順を実行します。

  1. デバイス インスタンスのドライバー キーに対するレジストリ ハンドルを取得するには、KeyType パラメーターを DIREG_DRV に設定し、SetupDiOpenDevRegKey を使用します。

  2. SetupDiGetDevicePropertyKeys (デバイス インスタンスのすべてのプロパティ キーを取得する場合) または SetupDiGetDeviceProperty (指定したデバイス インスタンス プロパティ キーを取得する場合) を使用します。

  3. SetupDiSetDeviceProperty を使用して、デバイス インスタンスのプロパティ キーを保存します。

実行可能ファイルまたは DLL ファイルの読み込み

Windows 64 ビット のプラットフォームでは、共同インストーラーが無署名の実行可能ファイルまたは DLL を読み込もうとすると、オペレーティング システムがセキュアな環境を守るために読み込みを防止します。

クラス インストーラーや共同インストーラーによって実行可能ファイルまたは DLL を安全に読み込むには、デジタル署名済みのドライバー パッケージに実行可能ファイルまたは DLL を含めることを強く推奨します。 ドライバー パッケージの署名方法の詳細は、「ドライバーの署名」をご覧ください。

: クラス インストーラーと共同インストーラーでは、LoadLibrary などの明示的な関数呼び出しやリンク依存関係の作成による DLL モジュールの読み込みは必ず避ける必要があります。

他のプロセスまたはサービスの開始

デバイスのインストール中、Windows は他のプロセスの追跡には対応できず、その処理状態や終了を認識することもできません。 たとえば、プロセスにおいて重要なアクションが実行されている最中に、Windows がデバイスを起動または停止したり、システムの再起動を開始したりする場合があります。

原則として、共同インストーラーが他のプロセスやサービスを開始することは、避ける必要があります。 ただし、インストーラーは、関数またはインストール完了操作を通じて表示されるダイアログで CreateProcess を呼び出すことにより、他のプロセスを安全に開始できます。 インストーラーは、作成されたプロセスが終了するまで、ユーザーによるダイアログや操作の続行を防止する必要があります。