Bestimmen, ob ein Gerät angeschlossen ist
Beachten Sie, dass das Verhalten einer Automatisch ausgeführten Geräteinstallationsanwendung davon abhängen muss, ob der Benutzer zuerst die Hardware einsteckt oder zuerst das Verteilungsmedium einfügt. Da unabhängige Hardwarehersteller (IHVs) in der Regel einen Verteilungsdatenträger bereitstellen und ein Datenträger nur über eine von autoRun aufgerufene Anwendung verfügen kann, muss Ihre Von AutoRun aufgerufene Geräteinstallationsanwendung ermitteln, 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 einer der folgenden Punkte zutrifft:
Die Funktion gibt TRUE zurück. (Dadurch wird auch der Treiber für das Gerät installiert.)
Die Funktion gibt FALSE zurück, und die Win32 GetLastError-Funktiongibt ERROR_NO_MORE_ITEMS zurück. (Es erfolgt keine Installation.)
Das Gerät ist nicht angeschlossen, wenn die Funktion FALSE zurückgibt und GetLastError NO_SUCH_DEVINST zurückgibt. (Es erfolgt keine Installation.)
Erneutes Installieren eines nicht angeschlossenen Geräts
Wenn ein gerät, das zuvor angeschlossen wurde, jetzt nicht mehr angeschlossen ist, verbleibt der Devnode des Geräts im System, obwohl er 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 neu installieren markieren. Wenn das Gerät wieder eingesteckt ist, zählt Plug & Play das Gerät erneut auf, sucht den neuen Treiber dafür und installiert den Treiber für das Gerät.
So installieren Sie ein nicht angeschlossenes Gerät neu:
Rufen Sie die Funktion SetupCopyOEMInf auf.
Die SetupCopyOEMInf-Funktion stellt sicher, dass die richtige INF-Datei im Verzeichnis %SystemRoot%\inf vorhanden ist.
Suchen Sie die nicht angeschlossenen Geräte.
Rufen Sie die SetupDiGetClassDevs-Funktion auf . Deaktivieren Sie im Aufruf dieser Funktion das flag DIGCF_PRESENT im Flags-Parameter . Sie müssen alle Geräte finden, nicht nur die, die vorhanden sind. Sie können die Ergebnisse Ihrer Suche einschränken, indem Sie die jeweilige Geräteklasse im ClassGuid-Parameter angeben.
Suchen Sie die Hardware-IDs und kompatiblen IDs von nicht angeschlossenen Geräten.
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 im ersten Schritt eine Geräteklasse angegeben). Durch aufeinanderfolgende Aufrufe der SetupDiEnumDeviceInfo-Funktion können Sie dieses Handle verwenden, um alle Geräte im Geräteinformationssatz aufzulisten. Jeder Aufruf gibt Ihnen eine SP_DEVINFO_DATA Struktur für das Gerät. Um die Liste der Hardware-IDs abzurufen, rufen Sie die SetupDiGetDeviceRegistryProperty-Funktion auf, wobei der Property-Parameter auf SPDRP_HARDWAREID festgelegt ist. Um die Liste der kompatiblen IDs abzurufen, rufen Sie dieselbe Funktion auf, wobei der Property-Parameter jedoch auf SPDRP_COMPATIBLEIDS festgelegt ist. Beide Listen sind MULTI-SZ-Zeichenfolgen.
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 durchführen. Ein Teilvergleich kann zu falschen Übereinstimmungen führen.
Wenn Sie eine Übereinstimmung gefunden haben, rufen Sie die funktion CM_Get_DevNode_Status auf, und übergeben Sie SP_DRVINFO_DATA. DevInst im dnDevInst-Parameter . Wenn diese Funktion CR_NO_SUCH_DEVINST zurückgibt, bestätigt dies, dass das Gerät nicht angefügt ist (d. a. verfügt über einen Phantom-Devnode).
Markieren Sie das Gerät.
Rufen Sie die SetupDiGetDeviceRegistryProperty-Funktion auf, wobei der Property-Parameter auf SPDRP_CONFIGFLAGS festgelegt ist. Wenn diese Funktion zurückgegeben wird, zeigt 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 SetupDiSetDeviceRegistryProperty-Funktion auf, wobei der Parameter Property auf SPDRP_CONFIGFLAGS und der PropertyBuffer-Parameter auf die Adresse des geänderten ConfigFlags-Werts des Geräts festgelegt ist. Diese Aktion ändert den ConfigFlags-Wert der Registrierung, um das flag CONFIGFLAG_REINSTALL zu integrieren. Dies bewirkt, dass das Gerät erneut installiert wird, wenn das Gerät das nächste Mal erneut aufgezählt wird.
Schließen Sie das Gerät an.
Plug & Play werden das Gerät erneut aufzählen, den neuen Treiber dafür suchen und diesen Treiber installieren.