Determinare se un dispositivo è collegato

Tenere presente che il comportamento di un'applicazione di installazione del dispositivo richiamata da AutoRun deve dipendere dal fatto che l'utente colleghi prima l'hardware o inserisca prima il supporto di distribuzione. Poiché i fornitori di hardware indipendenti (IHV) in genere forniscono un disco di distribuzione e un disco può avere solo un'applicazione richiamata dall'esecuzione automatica, l'applicazione di installazione del dispositivo richiamata dall'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 una delle condizioni seguenti è vera:

  • 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. Non viene eseguita alcuna installazione.

Il dispositivo non è collegato se la funzione restituisce FALSE e GetLastError restituisce NO_SUCH_DEVINST. Non viene eseguita alcuna installazione.

Reinstallazione di un dispositivo scollegato

Quando un dispositivo collegato in precedenza è ora scollegato, il devnode del dispositivo rimane nel sistema, anche se è sia inattivo che nascosto. Prima di reinstallare un dispositivo di questo tipo, è necessario trovare questo devnode "fantasma" e contrassegnarlo come da reinstallare. Quindi, quando il dispositivo viene collegato nuovamente, Plug and Play enumererà nuovamente il dispositivo, troverà il nuovo driver per esso e installerà il driver per il dispositivo.

Per reinstallare un dispositivo scollegato:

  1. Chiamare la funzione SetupCopyOEMInf .

    La funzione SetupCopyOEMInf garantisce che il file INF corretto sia presente nella directory %SystemRoot%\inf.

  2. Trovare i dispositivi scollegati.

    Chiamare la funzione SetupDiGetClassDevs . Nella chiamata a questa funzione deselezionare il flag DIGCF_PRESENT nel parametro Flags . Devi trovare tutti i dispositivi, non solo quelli presenti. È possibile restringere i risultati della ricerca specificando la particolare classe di dispositivo nel parametro ClassGuid .

  3. Trovare gli ID hardware e gli ID compatibili dei dispositivi scollegati.

    SetupDiGetClassDevs restituisce un handle al set di informazioni sul dispositivo che contiene tutti i dispositivi installati, collegati o meno, nella classe del dispositivo (presupponendo che sia stata specificata una classe di dispositivo nel primo passaggio). Effettuando 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 MULTI-SZ stringhe.

  4. Cercare una corrispondenza tra l'ID del dispositivo e gli ID hardware (o ID compatibili) del passaggio precedente.

    Assicurarsi di eseguire confronti di stringhe complete 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, ciò conferma che il dispositivo è scollegato (vale a dire, ha un nodo devnode fantasma).

  5. Contrassegna il dispositivo.

    Chiamare la funzione SetupDiGetDeviceRegistryProperty con il parametro Property impostato su SPDRP_CONFIGFLAGS. Al ritorno di questa funzione, il parametro PropertyBuffer punta al valore ConfigFlags del dispositivo nel Registro di sistema. Eseguire un OR bit per bit di questo valore con CONFIGFLAG_REINSTALL (definito in Regstr.h). Dopo 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 CONFIGFLAG_REINSTALL. In questo modo il dispositivo verrà reinstallato la volta successiva in cui il dispositivo viene nuovamente enumerato.

  6. Collegare il dispositivo.

    Plug and Play rieseguirà l'enumerazione del dispositivo, troverà il nuovo driver e installerà tale driver.