Bestimmen, ob ein Gerät angeschlossen ist

Beachten Sie, dass das Verhalten einer per AutoRun aufgerufenen Geräteinstallationsanwendung davon abhängig sein muss, ob der Benutzer zuerst die Hardware anschließt oder zuerst das Verteilungsmedium einfügt. Da unabhängige Hardwareanbieter (IHVs) in der Regel einen Distributionsdatenträger bereitstellen und ein Datenträger nur über eine AutoRun-aufgerufene Anwendung verfügen kann, muss Ihre autoRun-aufgerufene Geräteinstallationsanwendung bestimmen, ob Ihr Gerät angeschlossen ist.

Um festzustellen, ob ein Gerät angeschlossen ist, kann die Anwendung die UpdateDriverForPlugAndPlayDevices-Funktion aufrufen und die Hardware-ID des Geräts übergeben. Das Gerät ist angeschlossen, wenn eine der folgenden Bedingungen erfüllt ist:

  • Die Funktion gibt WAHR zurück. (Dadurch wird auch der Treiber für das Gerät installiert.)

  • Die Funktion gibt FALSE zurück, und die Win32-GetLastError-Funktion gibt ERROR_NO_MORE_ITEMS zurück. (Es erfolgt keine Installation.)

Das Gerät ist nicht angeschlossen, wenn die Funktion FALSE zurückgibt, und GetLastError gibt NO_SUCH_DEVINST zurück. (Es erfolgt keine Installation.)

Erneutes Installieren eines getrennten Geräts

Wenn ein Gerät, das zuvor angeschlossen war, jetzt ausgesteckt ist, verbleibt die Devnode des Geräts im System, obwohl es sowohl inaktiv als auch ausgeblendet ist. Bevor Sie ein solches Gerät neu installieren können, müssen Sie zuerst diesen "Phantom"-Devnode finden und ihn als zur Neuinstallation erforderlich kennzeichnen. Wenn das Gerät wieder angeschlossen ist, wird Plug & Play das Gerät neu erkennen, den neuen Treiber dafür suchen und den Treiber für das Gerät installieren.

So installieren Sie ein getrenntes Gerät erneut:

  1. Rufen Sie die SetupCopyOEMInf-Funktion auf.

    Die Funktion SetupCopyOEMInf stellt sicher, dass die richtige INF-Datei im Verzeichnis %SystemRoot%\inf vorhanden ist.

  2. Suchen Sie die nicht angeschlossenen Geräte.

    Rufen Sie die SetupDiGetClassDevs-Funktion auf. Löschen Sie im Aufruf dieser Funktion das DIGCF_PRESENT-Flag im Parameter Flags. Sie müssen alle Geräte finden, nicht nur diejenigen, die vorhanden sind. Sie können die Ergebnisse Ihrer Suche einschränken, indem Sie die bestimmte Geräteklasse im Parameter ClassGuid angeben.

  3. Suchen Sie die Hardware-IDs und kompatible IDs nicht verbundener Geräte.

    SetupDiGetClassDevs gibt ein Handle an den Geräteinformationssatz zurück, der alle installierten Geräte enthält, unabhängig davon, ob sie angeschlossen sind oder nicht, in der Geräteklasse (vorausgesetzt, Sie haben eine Geräteklasse im ersten Schritt angegeben). Durch aufeinander folgende Aufrufe der SetupDiEnumDeviceInfo-Funktion können Sie dieses Handle verwenden, um alle Geräte im Geräteinformationssatz aufzählen zu können. Jeder Aufruf gibt Ihnen eine SP_DEVINFO_DATA Struktur für das Gerät. Rufen Sie zum Abrufen der Liste der Hardware-IDs die SetupDiGetDeviceRegistryProperty-Funktion auf, wobei der Parameter Property auf SPDRP_HARDWAREID festgelegt ist. Rufen Sie zum Abrufen der Liste der kompatiblen IDs dieselbe Funktion auf, wobei der Parameter Property jedoch auf SPDRP_COMPATIBLEIDS festgelegt ist. Beide Listen sind MULTI-SZ Zeichenfolgen.

  4. Suchen Sie nach einer Übereinstimmung zwischen der ID Ihres Geräts und den Hardware-IDs (oder kompatiblen IDs) des vorherigen Schritts.

    Stellen Sie sicher, dass Sie vollständige Zeichenfolgenvergleiche zwischen der Hardware-ID/kompatiblen ID und der ID für Ihr Gerät ausführen. Ein teilweiser Vergleich kann zu falschen Übereinstimmungen führen.

    Wenn Sie eine Übereinstimmung finden, rufen Sie die CM_Get_DevNode_Status-Funktion auf, und übergeben Sie SP_DRVINFO_DATA.DevInst im Parameter "dnDevInst". Wenn diese Funktion CR_NO_SUCH_DEVINST zurückgibt, wird bestätigt, dass das Gerät nicht angeschlossen ist (d. h. einen Phantom-Devnode hat).

  5. Markieren Sie das Gerät.

    Rufen Sie die SetupDiGetDeviceRegistryProperty-Funktion auf, wobei der Property-Parameter auf SPDRP_CONFIGFLAGS festgelegt ist. Wenn diese Funktion zurückkehrt, verweist der PropertyBuffer-Parameter auf den ConfigFlags-Wert des Geräts aus der Registrierung. Führen Sie einen bitweisen OR dieses Werts mit CONFIGFLAG_REINSTALL (definiert in Regstr.h) aus. Rufen Sie anschließend die Funktion SetupDiSetDeviceRegistryProperty mit dem Parameter Property festgelegt auf SPDRP_CONFIGFLAGS und mit dem Parameter PropertyBuffer festgelegt auf die Adresse des geänderten ConfigFlags-Werts des Geräts auf. Durch diese Aktion wird der ConfigFlags-Wert der Registrierung so geändert, dass das Flag CONFIGFLAG_REINSTALL aufgenommen wird. Dies führt dazu, dass das Gerät bei der nächsten erneuten Auflistung neu installiert wird.

  6. Schließen Sie das Gerät an.

    Plug & Play wird das Gerät erneut enumerieren, den neuen Treiber dafür suchen und diesen Treiber installieren.