Determinare se un dispositivo è collegato
Tenere presente che il comportamento di un'applicazione di installazione del dispositivo richiamata automaticamente deve dipendere dal fatto che il plug-in dell'utente nell'hardware venga prima o inserito il supporto di distribuzione. Poiché i fornitori di hardware indipendenti (IHV) in genere forniscono un disco di distribuzione e un disco può avere un'applicazione richiamata di esecuzione automatica, l'applicazione di installazione del dispositivo richiamata per l'esecuzione automatica deve determinare se il dispositivo è collegato.
Per determinare se un dispositivo è collegato, l'applicazione può chiamare la funzione UpdateDriverForPlugAndPlayDevices , passando l'ID hardware del dispositivo. Il dispositivo è collegato se uno dei seguenti è true:
La funzione restituisce TRUE. In questo modo viene installato anche il driver per il dispositivo.
La funzione restituisce FALSE e la funzione GetLastErrorWin32 restituisce ERROR_NO_MORE_ITEMS. (Nessuna installazione si verifica).
Il dispositivo non è collegato se la funzione restituisce FALSE e GetLastError restituisce NO_SUCH_DEVINST. (Nessuna installazione si verifica).
Reinstallazione di un dispositivo non collegato
Quando un dispositivo che in precedenza era collegato è ora scollegato, il devnode del dispositivo rimane nel sistema, anche se è sia inattivo che nascosto. Prima di reinstallare un dispositivo di questo tipo, devi prima trovare questo devnode "fantasma" e contrassegnarlo come necessario per la reinstallazione. Quando quindi il dispositivo viene collegato, Plug and Play rinumera il dispositivo, trova il nuovo driver e installa il driver per il dispositivo.
Per reinstallare un dispositivo non collegato:
Chiamare la funzione SetupCopyOEMInf .
La funzione SetupCopyOEMInf garantisce che il file INF corretto sia presente nella directory %SystemRoot%\inf .
Trovare i dispositivi scollegati.
Chiamare la funzione SetupDiGetClassDevs . Nella chiamata a questa funzione deselezionare il flag di DIGCF_PRESENT nel parametro Flags . Devi trovare tutti i dispositivi, non solo quelli presenti. È possibile restringere i risultati della ricerca specificando la classe di dispositivo specifica nel parametro ClassGuid .
Trovare gli ID hardware e gli ID compatibili dei dispositivi non collegati.
SetupDiGetClassDevs restituisce un handle al set di informazioni sul dispositivo che contiene tutti i dispositivi installati, sia che sia collegato o meno, nella classe del dispositivo (presupponendo che sia stata specificata una classe di dispositivo nel primo passaggio). Eseguendo chiamate successive alla funzione SetupDiEnumDeviceInfo , è possibile usare questo handle per enumerare tutti i dispositivi nel set di informazioni sul dispositivo. Ogni chiamata fornisce una struttura SP_DEVINFO_DATA per il dispositivo. Per ottenere l'elenco degli ID hardware, chiamare la funzione SetupDiGetDeviceRegistryProperty con il parametro Property impostato su SPDRP_HARDWAREID. Per ottenere l'elenco degli ID compatibili, chiamare la stessa funzione, ma con il parametro Property impostato su SPDRP_COMPATIBLEIDS. Entrambi gli elenchi sono stringhe MULTI-SZ.
Cercare una corrispondenza tra l'ID del dispositivo e gli ID hardware (o gli ID compatibili) del passaggio precedente.
Assicurarsi di eseguire confronti stringa completi tra l'ID hardware o l'ID compatibile e l'ID per il dispositivo. Un confronto parziale potrebbe causare corrispondenze non corrette.
Quando si trova una corrispondenza, chiamare la funzione CM_Get_DevNode_Status , passando SP_DRVINFO_DATA. DevInst nel parametro dnDevInst . Se questa funzione restituisce CR_NO_SUCH_DEVINST, che conferma che il dispositivo non è attaccato ,ovvero ha un devnode fantasma.
Contrassegnare il dispositivo.
Chiamare la funzione SetupDiGetDeviceRegistryProperty con il parametro Property impostato su SPDRP_CONFIGFLAGS. Quando questa funzione restituisce, il parametro PropertyBuffer punta al valore ConfigFlags del dispositivo dal Registro di sistema. Eseguire un OR bit per bit di questo valore con CONFIGFLAG_REINSTALL (definito in Regstr.h). Dopo aver eseguito questa operazione, chiamare la funzione SetupDiSetDeviceRegistryProperty , con il parametro Property impostato su SPDRP_CONFIGFLAGS e il parametro PropertyBuffer impostato sull'indirizzo del valore ConfigFlags modificato del dispositivo Questa azione modifica il valore ConfigFlags del Registro di sistema per incorporare il flag di CONFIGFLAG_REINSTALL. In questo modo, il dispositivo deve essere reinstallato la volta successiva in cui il dispositivo viene rinumerato.
Collegare il dispositivo.
Plug and Play rinumererà il dispositivo, troverà il nuovo driver per esso e installerà tale driver.