Informazioni su quando vengono rilasciati i runtime di integrazione rimossi
Nella figura seguente viene illustrata la sequenza tipica di irP coinvolti nella rimozione dei driver per un dispositivo.
Le note seguenti corrispondono ai numeri cerchiati nella figura precedente:
Rimozione di query
Il gestore PnP rilascia un IRP_MN_QUERY_REMOVE_DEVICE per chiedere se un dispositivo può essere rimosso senza interrompere il computer. Invia anche questo IRP quando un utente richiede di aggiornare i driver per il dispositivo e (in Windows 2000 e versioni successive) quando Gestione dispositivi disabilita il dispositivo. In Windows 98/Me, il gestore PnP invia i runtime di integrazione di arresto in questa situazione. Per informazioni dettagliate, vedere Arresto di un dispositivo .
Se tutti i driver nello stack di dispositivi restituiscono STATUS_SUCCESS, i driver hanno inserito il dispositivo nello stato di rimozione in sospeso. In questo stato, i driver non devono avviare alcuna operazione che impedisca la rimozione del dispositivo.
In questo caso di rimozione "pulita", il gestore PnP invia un IRP di rimozione di query prima di inviare un IRP di rimozione. Vedere il passaggio 5 per una descrizione della rimozione di "sorpresa".
Anche se non è illustrato nel diagramma precedente, un autista del bus potrebbe ricevere un IRP_MN_QUERY_REMOVE_DEVICE per un dispositivo non avviato. Ciò può verificarsi se un utente richiede di rimuovere dinamicamente un dispositivo presente fisicamente nel computer ma è disabilitato.
Rimuovere dopo l'esito positivo della query
Il gestore PnP rilascia un IRP_MN_REMOVE_DEVICE per rimuovere i driver per un dispositivo.
I driver devono avere esito positivo per questa richiesta. I driver per il dispositivo eseguono le operazioni di pulizia necessarie, scollegamento dallo stack di dispositivi ed eliminazione dell'fdO e degli eventuali DO di filtro. Il driver del bus padre mantiene il PDO finché l'utente non rimuove fisicamente il dispositivo dal computer.
Si noti che i driver potrebbero ricevere un IRP_MN_STOP_DEVICE prima di rimuovere IRP, ma non è obbligatorio. In Windows 2000 e versioni successive, IRP_MN_STOP_DEVICE viene usato solo per sospendere un dispositivo per il ribilanciamento delle risorse; non è un passo verso la rimozione. Se un utente rimuove l'hardware del dispositivo mentre il dispositivo viene arrestato, il gestore PnP invia una rimozione di IRP a un certo punto dopo l'arresto di IRP, ma un arresto non è un prerequisito per una rimozione.
Rinumerare il dispositivo
Se il dispositivo viene rinumerato dopo che i driver hanno eliminato gli oggetti dispositivo, il gestore PnP chiama le routine AddDevice dei driver e rilascia un IRP_MN_START_DEVICE per ripristinare il dispositivo. Vedere anche la figura Device States (Stati del dispositivo) nella figura PnP Perspective (Prospettiva PnP ).
Annullare la rimozione di una query
Il gestore PnP rilascia un IRP_MN_CANCEL_REMOVE_DEVICE per annullare una richiesta di rimozione query.
In risposta a un IRP_MN_CANCEL_REMOVE_DEVICE, i driver restituiscono il dispositivo allo stato avviato.
Rimozione a sorpresa (Windows 2000 e versioni successive di Windows)
Nei sistemi Windows 2000 e versioni successive, se un utente scollega un dispositivo dal computer senza usare il programma Unplug o Eject Hardware, il gestore PnP invia un IRP_MN_SURPRISE_REMOVAL IRP.
Questo caso viene chiamato rimozione "sorpresa" perché i driver non ricevono alcun avviso anticipato.
In risposta a un IRP_MN_SURPRISE_REMOVAL IRP, i driver per il dispositivo hanno esito negativo e rilasciano le risorse hardware usate dal dispositivo. I driver devono assicurarsi che nessun componente tenti di accedere al dispositivo perché non è più presente.
Tutti i driver devono gestire un IRP_MN_SURPRISE_REMOVAL IRP e devono impostare lo stato su STATUS_SUCCESS.
Impossibile annullare un IRP_MN_SURPRISE_REMOVAL .
Rimuovi dopo la rimozione a sorpresa (Windows 2000 e versioni successive di Windows)
Quando tutti gli handle aperti per il dispositivo vengono chiusi, il gestore PnP invia una richiesta di IRP_MN_REMOVE_DEVICE ai driver per il dispositivo. Ogni driver si scollega dallo stack di dispositivi ed elimina il relativo oggetto dispositivo.
Rimozione a sorpresa (Windows 98/Me)
In Windows 98/Me, un driver non riceve un IRP_MN_SURPRISE_REMOVAL quando un dispositivo viene rimosso senza avviso. Il gestore PnP invia solo un IRP_MN_REMOVE_DEVICE. I driver WDM devono avere codice per gestire sia un IRP_MN_SURPRISE_REMOVAL seguito da un IRP_MN_REMOVE_DEVICE (il comportamento di Windows 2000 e versioni successive per la rimozione a sorpresa) sia un IRP_MN_REMOVE_DEVICE senza un IRP di rimozione di sorpresa precedente (comportamento di Windows 98/Me).
Rimuovere dopo un avvio non riuscito (Windows 2000 e versioni successive)
Se uno dei driver per un dispositivo non riesce un IRP_MN_START_DEVICE, il gestore PnP invia una richiesta di IRP_MN_REMOVE_DEVICE allo stack di dispositivi. Questa rimozione di IRP garantisce che tutti i driver per il dispositivo vengano informati che il dispositivo non è stato avviato correttamente. In risposta alla IRP_MN_REMOVE_DEVICE IRP, i driver per il dispositivo annullano le operazioni di avvio (se hanno avuto esito positivo l'IRP di avvio) e annullano le operazioni AddDevice . Il gestore PnP contrassegna un dispositivo come "avvio non riuscito".
Questo comportamento si applica solo alle piattaforme Windows 2000 e successive. In Windows 98/Me, il gestore PnP invia un IRP_MN_STOP_DEVICE in risposta a un avvio non riuscito.
Un driver per un dispositivo PnP può ricevere un IRP_MN_SURPRISE_REMOVAL in più situazioni rispetto a quelle illustrate nella figura che illustrano le transizioni IRP di rimozione tipiche. Ad esempio, un utente può inserire una scheda PC nel computer e quindi rimuoverla prima dell'avvio del dispositivo. In tal caso, il gestore PnP rilascia un IRP di rimozione a sorpresa dopo la chiamata alle routine AddDevice dei driver, ma prima di inviare la richiesta di IRP_MN_START_DEVICE . Un driver per un dispositivo PnP deve essere preparato per gestire la rimozione di IRP in qualsiasi momento dopo la chiamata della routine AddDevice del driver.