Déterminer si un appareil est branché
N’oubliez pas que le comportement d’une application d’installation d’appareil appelée par auto-exécution doit dépendre du fait que l’utilisateur se connecte d’abord au matériel ou insère d’abord le support de distribution. Étant donné que les fournisseurs de matériel indépendants (IMV) fournissent généralement un disque de distribution et qu’un disque ne peut avoir qu’une seule application d’exécution automatique, votre application d’installation d’appareil appelée par auto-exécution doit déterminer si votre appareil est branché.
Pour déterminer si un appareil est branché, l’application peut appeler la fonction UpdateDriverForPlugAndPlayDevices , en transmettant l’ID matériel de l’appareil. L’appareil est branché si l’une des conditions suivantes est remplie :
La fonction retourne TRUE. (Cela installe également le pilote pour le périphérique.)
La fonction retourne FALSE et la fonction Win32 GetLastErrorretourne ERROR_NO_MORE_ITEMS. (Aucune installation ne se produit.)
L’appareil n’est pas branché si la fonction retourne FALSE et Que GetLastError retourne NO_SUCH_DEVINST. (Aucune installation ne se produit.)
Réinstallation d’un appareil débranché
Lorsqu’un appareil qui était précédemment attaché est maintenant débranché, le devnode de l’appareil reste dans le système, bien qu’il soit à la fois inactif et masqué. Avant de pouvoir réinstaller un tel appareil, vous devez d’abord trouver ce devnode « fantôme » et le marquer comme nécessitant une réinstallation. Ensuite, lorsque l’appareil est reconnecté, Plug-and-Play ré-énumérez l’appareil, recherchez le nouveau pilote pour celui-ci et installez le pilote pour l’appareil.
Pour réinstaller un appareil débranché :
Appelez la fonction SetupCopyOEMInf .
La fonction SetupCopyOEMInf garantit que le fichier INF correct est présent dans le répertoire %SystemRoot%\inf .
Recherchez les appareils débranchés.
Appelez la fonction SetupDiGetClassDevs . Dans l’appel à cette fonction, effacez l’indicateur DIGCF_PRESENT dans le paramètre Flags . Vous devez trouver tous les appareils, pas seulement ceux qui sont présents. Vous pouvez affiner les résultats de votre recherche en spécifiant la classe d’appareil particulière dans le paramètre ClassGuid .
Recherchez les ID matériels et les ID compatibles des appareils débranchés.
SetupDiGetClassDevs retourne un handle au jeu d’informations d’appareil qui contient tous les appareils installés, qu’ils soient branchés ou non, dans la classe d’appareil (en supposant que vous avez spécifié une classe d’appareil dans la première étape). En effectuant des appels successifs à la fonction SetupDiEnumDeviceInfo , vous pouvez utiliser ce handle pour énumérer tous les appareils dans le jeu d’informations sur l’appareil. Chaque appel vous donne une structure SP_DEVINFO_DATA pour l’appareil. Pour obtenir la liste des ID matériels, appelez la fonction SetupDiGetDeviceRegistryProperty avec le paramètre Property défini sur SPDRP_HARDWAREID. Pour obtenir la liste des ID compatibles, appelez la même fonction, mais avec le paramètre Property défini sur SPDRP_COMPATIBLEIDS. Les deux listes sont des chaînes MULTI-SZ.
Recherchez une correspondance entre l’ID de votre appareil et les ID matériels (ou les ID compatibles) de l’étape précédente.
Veillez à effectuer des comparaisons de chaînes complètes entre l’ID matériel/ID compatible et l’ID de votre appareil. Une comparaison partielle peut entraîner des correspondances incorrectes.
Lorsque vous trouvez une correspondance, appelez la fonction CM_Get_DevNode_Status , en passant SP_DRVINFO_DATA. DevInst dans le paramètre dnDevInst . Si cette fonction retourne CR_NO_SUCH_DEVINST, cela confirme que l’appareil n’est pas attaché (c’est-à-dire qu’il a un devnode fantôme).
Marquez l’appareil.
Appelez la fonction SetupDiGetDeviceRegistryProperty avec le paramètre Property défini sur SPDRP_CONFIGFLAGS. Lorsque cette fonction est retournée, le paramètre PropertyBuffer pointe vers la valeur ConfigFlags de l’appareil du Registre. Effectuez une opération OR au niveau du bit de cette valeur avec CONFIGFLAG_REINSTALL (défini dans Regstr.h). Après cela, appelez la fonction SetupDiSetDeviceRegistryProperty , avec le paramètre Property défini sur SPDRP_CONFIGFLAGS et le paramètre PropertyBuffer défini sur l’adresse de la valeur ConfigFlags modifiée de l’appareil Cette action modifie la valeur ConfigFlags du Registre pour incorporer l’indicateur CONFIGFLAG_REINSTALL. Cela entraîne la réinstallation de l’appareil la prochaine fois qu’il est réinumé.
Branchez l’appareil.
Plug-and-Play réévaluez l’appareil, recherchez le nouveau pilote et installez ce pilote.