Share via


デバイスが接続されているかどうかの判断

自動実行によって呼び出される デバイスインストールアプリケーション の動作は、ユーザーが最初にハードウェアを接続するか、最初に配布メディアを挿入するかによって異なります。 通常、独立系ハードウェアベンダー (IHV) はひとつのディストリビューションディスクを提供し、ディスクには AutoRun 呼び出しアプリケーションをひとつだけ含めることができるため、自動実行呼び出しデバイスインストールアプリケーションは、デバイスが接続されているかどうかを判断する必要があります。

デバイスが接続されているかどうかを確認するために、アプリケーションは UpdateDriverForPlugAndPlayDevices の関数を呼び出して、デバイスのハードウェア ID を渡すことができます。 次のいずれかに該当する場合、デバイスは接続されます。

  • 関数が TRUE を返す場合。 (これにより、デバイスのドライバーもインストールされます)。

  • 関数が FALSE を返し、Win32 GetLastError の関数は ERROR_NO_MORE_ITEMS を返す場合。 (インストールは行われません。)

関数が FALSE を返し、GetLastError が NO_SUCH_DEVINST を返す場合、デバイスは接続されません。 (インストールは行われません。)

取り外されたデバイスの再インストール

以前に接続されていたデバイスが取り外されると、デバイスの devnode がシステム内で残りますが、非アクティブと非表示の両方になります。 このようなデバイスを再インストールする前に、まずこの「ファントム」の開発ノードを見つけて、再インストールが必要とマークする必要があります。 デバイスが再び接続されると、プラグアンドプレイはデバイスを再び有効にし、デバイスの新しいドライバーを見つけて、デバイスのドライバーをインストールします。

取り外されたデバイスの再インストール方法

  1. SetupCopyOEMInf の関数を呼び出します。

    SetupCopyOEMInf の関数を使用すると、%SystemRoot%\inf のディレクトリに正しい INF ファイルが確実に存在します。

  2. 取り外されたデバイスを見つけます。

    SetupDiGetClassDevs の関数を呼び出します。 この関数の呼び出しで、Flags パラメーターの DIGCF_PRESENT をクリアします。 存在するデバイスだけでなく、すべてのデバイスを見つける必要があります。 ClassGuid のパラメーターで特定のデバイスクラスを指定することで、検索結果を絞り込むことができます。

  3. 取り外されたデバイスのハードウェア ID と互換性のある ID を見つけます。

    SetupDiGetClassDevs は、(最初の手順でデバイスクラスを指定したと仮定して) デバイスクラスに接続されているかどうかに関係なく、インストールされているすべてのデバイスを含むデバイス情報セットへのハンドルを返します。 SetupDiEnumDeviceInfo の関数を連続して呼び出すことで、このハンドルを使用して、デバイス情報セット内のすべてのデバイスを列挙できます。 各呼び出しでは、デバイスの SP_DEVINFO_DATA の構造が提供されます。 ハードウェア ID の一覧を取得するには、 SetupDiGetDeviceRegistryProperty の関数を、Property のパラメーターを SPDRP_HARDWAREID に設定して呼び出します。 互換性のある ID の一覧を取得するには、同じ関数を呼び出しますが、プロパティ のパラメーターを SPDRP_COMPATIBLEIDS に設定します。 どちらのリストも MULTI-SZ 文字列です。

  4. デバイスの ID と、前の手順のハードウェア ID (または互換性のある ID) の間で一致するものを探します。

    ハードウェア ID/互換性のある ID とデバイスの ID の間で完全な文字列比較を実行していることを確認します。 部分的な比較により、一致が正しくない可能性があります。

    一致するものが見つかると、CM_Get_DevNode_Status の関数を呼び出し、SP_DRVINFO_DATA を渡します。DevInst で、dnDevInst のパラメーターにあります。 この関数が CR_NO_SUCH_DEVINST を返す場合は、デバイスが接続されていないことを確認します (つまり、ファントム devnode があります)。

  5. デバイスをマークします。

    SetupDiGetDeviceRegistryProperty の関数を呼び出すには、プロパティ のパラメーターを SPDRP_CONFIGFLAGS に設定します。 この関数が返されると、 PropertyBuffer のパラメーターはレジストリからデバイスの ConfigFlags の値を指します。 CONFIGFLAG_REINSTALL (Regstr.h で定義) を使用して、この値のビットごとの OR を実行します。 これを行った後、SetupDiSetDeviceRegistryProperty の関数を呼び出し、プロパティのパラメーターを SPDRP_CONFIGFLAGS に設定し、PropertyBuffer パラメーターをデバイスの変更された ConfigFlags 値のアドレスに設定します。このアクションにより、レジストリの ConfigFlags 値が変更され、CONFIGFLAG_REINSTALL フラグが組み込まれます。 これにより、次回デバイスが再び有効になると、デバイスが再インストールされます。

  6. デバイスを接続します。

    プラグアンドプレイデバイスを再び有効にし、その新しいドライバーを見つけて、そのドライバーをインストールします。