Condividi tramite


Rimozione di un dispositivo da un driver di funzione

Quando si rimuove un dispositivo, un driver di funzione deve annullare le operazioni eseguite per aggiungere e avviare il dispositivo. Questa discussione include i driver di funzione per i dispositivi periferici e i driver di funzione per i dispositivi bus.

Un driver di funzione rimuove un dispositivo usando una procedura come la seguente nella routine DispatchPnP :

  1. Si tratta di un driver di funzione per un dispositivo bus?

    In tal caso, eliminare eventuali PDO figlio ancora da elaborare per i dispositivi sul bus.

    Se l'autista del bus ha gestito una precedente richiesta di IRP_MN_SURPRISE_REMOVAL per il dispositivo figlio, ma il driver non ha ancora ricevuto la richiesta di IRP_MN_REMOVE_DEVICE successiva, il conducente del bus lascia intatto il PDO figlio. In un momento successivo, quando tutti gli handle per il dispositivo figlio vengono chiusi, il gestore di PnP invierà l'IRP di rimozione per il dispositivo figlio e, a quel punto, il driver del bus elimina il PDO figlio.

    Se l'autista del bus ha gestito una richiesta di IRP_MN_REMOVE_DEVICE precedente per il dispositivo e non è stata eseguita alcuna richiesta di IRP_MN_SURPRISE_REMOVAL successiva, il driver del bus elimina il PDO figlio. In questo caso, il gestore PnP garantisce che tutti i driver di funzione e filtro siano stati rimossi dal dispositivo figlio (FDO e DO filtro sono stati eliminati) prima di inviare un IRP di rimozione al dispositivo bus padre. Il PDO figlio potrebbe essere ancora presente, quindi il driver dell'autobus deve eliminare il PDO figlio prima di rimuovere il dispositivo del bus.

  2. Il driver ha già trattato una richiesta di IRP_MN_SURPRISE_REMOVAL precedente per questo FDO?

    In tal caso, eseguire eventuali operazioni di pulizia rimanenti e passare al passaggio 8, IoCallDriver.

    Un driver mantiene in genere un flag nell'estensione del dispositivo che indica se il driver ha gestito una richiesta di IRP_MN_SURPRISE_REMOVAL per il dispositivo.

  3. Se il driver ha abilitato in precedenza il dispositivo per la riattivazione, annullare la richiesta di IRP_MN_WAIT_WAKE .

  4. Assicurarsi che il dispositivo sia inattivo.

    Se il dispositivo non è già inattivo in risposta a un IRP_MN_QUERY_REMOVE_DEVICE precedente, il driver deve contrassegnare il dispositivo come non accettando nuove richieste e deve completare eventuali richieste accodate in questo driver. Il driver deve rifiutare tutte le richieste in sospeso che richiedono l'accesso al dispositivo.

    Un driver può usare le routine IoXxxRemoveLockXxx per contare le operazioni di I/O in sospeso e per impostare un evento che indica che l'elaborazione di rimozione può continuare.

  5. Eseguire qualsiasi operazione di risparmio di energia.

    Ogni driver per il dispositivo esegue le operazioni di risparmio di energia, se presenti, quando riceve la richiesta di IRP_MN_REMOVE_DEVICE . Il proprietario dei criteri di alimentazione per il dispositivo, in genere il driver di funzione, non invia una richiesta di IRP_MN_SET_POWER separata per impostare lo stato di alimentazione del dispositivo su D3. Il driver del bus principale in genere spegne lo slot e invia una notifica al gestore dell'alimentazione con PoSetPowerState quando riceve l'IRP di rimozione. Per altre informazioni, vedere Risparmio energia.

  6. Disabilitare qualsiasi interfaccia del dispositivo chiamando IoSetDeviceInterfaceState.

  7. Liberare tutte le risorse hardware occupate dal driver per il dispositivo in uso.

    Le operazioni esatte dipendono dal dispositivo e dal driver, ma possono includere la disconnessione di un interrupt con IoDisconnectInterrupt, liberando intervalli di indirizzi fisici con MmUnmapIoSpace e liberando le porte di I/O.

  8. Inoltrare la richiesta di IRP_MN_REMOVE_DEVICE al driver successivo.

    Configurare il percorso dello stack IRP per il driver inferiore successivo con IoSkipCurrentIrpStackLocation e passare l'IRP al driver successivo con IoCallDriver.

    Non è necessario che un driver attenda il completamento delle operazioni di rimozione dei driver sottostanti prima di continuare le proprie attività di rimozione.

  9. Rimuovere l'oggetto dispositivo dallo stack di dispositivi con IoDetachDevice.

    Specificare un puntatore all'oggetto dispositivo inferiore successivo come parametro TargetDevice . Il driver riceve un puntatore di questo tipo dalla chiamata a IoAttachDeviceToDeviceStack nella routine AddDevice del driver.

  10. Pulire eventuali allocazioni specifiche del dispositivo, memoria, eventi e così via.

  11. Libera l'FDO con IoDeleteDevice.

  12. Tornare dalla routine DispatchPnP, propagando lo stato di ritorno di IoCallDriver.

Un driver di funzione non specifica una routine IoCompletion per una rimozione di IRP, né completa l'IRP. Le rimozioni degli IRP vengono gestite dal driver del bus principale.