Un utente scollega un dispositivo
Mentre un sistema è in esecuzione, un utente può rimuovere un dispositivo in uno dei due modi seguenti: rimuovendo in modo ordinato, il che significa che l'utente informa il sistema che il dispositivo sta per essere rimosso (ad esempio, usando il programma Unplug o Eject Hardware); o tramite rimozione a sorpresa, il che significa che l'utente scollega il dispositivo senza informare il sistema. Se il bus supporta la rimozione a sorpresa (ad esempio, USB), i driver del dispositivo devono essere in grado di gestire la scomparsa improvvisa del dispositivo.
Rimozione ordinata
L'utente richiede la rimozione tramite il programma Unplug o Eject Hardware del sistema, disabilitando il dispositivo tramite Gestione dispositivi o premendo il pulsante di espulsione di un dispositivo espulso. Il framework consente di rimuovere o disabilitare il dispositivo, a meno che il driver non abbia:
Chiamato WdfDeviceSetSpecialFileSupport e un file speciale è aperto nel dispositivo.
Chiamato WdfDeviceSetStaticstopRemove.
È stata fornita una funzione di callback EvtDeviceQueryRemove e la funzione di callback ha veto la rimozione.
Per ogni driver di funzione e filtro che supporta il dispositivo, il framework esegue le operazioni seguenti, in sequenza, un driver alla volta, a partire dal driver più alto nello stack di driver:
Se il driver usa I/O autogestito, il framework chiama la funzione di callback EvtDeviceSelfManagedIoSuspend del driver.
Il framework arresta tutte le code di I/O gestite dal driver.
Se l'hardware e il driver supportano DMA, il framework chiama le funzioni di callback EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlush e EvtDmaEnablerDisabler ( se esistenti) per ogni canale DMA creato.
Il framework chiama la funzione di callback EvtDeviceD0ExitPreInterruptsDisabletsDisabled del driver (se esistente) e quindi chiama la funzione di callback EvtInterruptDisable del driver (se esistente) per ogni interrupt in modo che il driver possa disabilitare gli interrupt del dispositivo.
Il framework chiama la funzione di callback EvtDeviceD0Exit del driver (se esistente).
Il framework chiama la funzione di callback EvtDeviceReleaseHardware del driver (se presente), passando l'elenco di risorse hardware assegnate dal manager PnP al dispositivo.
Se il driver usa L/O autogestito, il framework chiama la funzione di callback EvtDeviceSelfManagedIoFlush del driver.
Se il driver usa I/O autogestito, il framework chiama la funzione di callback EvtDeviceSelfManagedIoCleanup del driver.
Il conducente dell'autobus è il conducente nello stack che viene chiamato l'ultimo. Quando il framework chiama la funzione di callback EvtDeviceD0Exit del driver del bus, la funzione di callback imposta lo stato di alimentazione del dispositivo (un dispositivo figlio del bus) su D3. Il driver del bus può controllare quando il framework chiama la funzione di callback EvtDeviceReleaseHardware chiamando WdfDeviceInitSetReleaseHardwareOrderOnFailure.
Rimozione a sorpresa
Un utente scollega un dispositivo in modo imprevisto. Il driver dell'autobus per il bus del dispositivo rileva che il dispositivo è mancante e chiama WdfChildListUpdateChildDescriptionAsMissing.
Per ogni driver di funzione e filtro che supporta il dispositivo, il framework esegue le operazioni seguenti, in sequenza, un driver alla volta, a partire dal driver più alto nello stack di driver:
- Il framework chiama la funzione di callback EvtDeviceSurpriseRemoval del driver (se esistente).
- Se il dispositivo era in stato funzionante (D0) quando è stato scollegato:
- Il framework arresta tutte le code di I/O gestite dal driver.
- Se il driver usa I/O autogestito, il framework chiama la funzione di callback EvtDeviceSelfManagedIoSuspend del driver.
- Se l'hardware e il driver supportano DMA, il framework chiama le funzioni di callback EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlush e EvtDmaEnablerDisabler ( se esistenti) per ogni canale DMA creato.
- Il framework chiama le funzioni di callback EvtDeviceD0ExitPreInterruptsDisabled e EvtInterruptDisable (se esistenti) del driver in modo che il driver possa disabilitare gli interrupt del dispositivo.
- Il framework chiama la funzione di callback EvtDeviceD0Exit del driver (se esistente).
- Il framework chiama la funzione di callback EvtDeviceReleaseHardware del driver (se presente), passando l'elenco di risorse hardware assegnate dal gestore PnP al dispositivo.
- Se il driver usa L/O autogestito, il framework chiama la funzione di callback EvtDeviceSelfManagedIoFlush del driver.
- Se il driver usa I/O autogestito, il framework chiama la funzione di callback EvtDeviceSelfManagedIoCleanup del driver.
Si noti che un dispositivo può essere rimosso in modo imprevisto in qualsiasi momento. Di conseguenza, il framework potrebbe chiamare la funzione di callback EvtDeviceSurpriseRemoval del driver alla volta diversa da quella illustrata nei passaggi precedenti. Ad esempio, se un utente scollega in modo imprevisto il dispositivo mentre entra in uno stato a basso consumo, il framework potrebbe chiamare la funzione di callback EvtDeviceSurpriseRemoval dopo aver chiamato la funzione di callback EvtDeviceReleaseHardware . Non è necessario codificare una funzione di callback EvtDeviceSurpriseRemoval in modo da presupporre che vengano chiamate in una sequenza specifica e altre funzioni di callback.
Inoltre, il framework non sincronizza la funzione di callback EvtDeviceSurpriseRemoval di un dispositivo con una delle funzioni di callback elencate nei passaggi precedenti per tale dispositivo. Pertanto, la funzione di callback EvtDeviceSurpriseRemoval potrebbe essere eseguita mentre è in esecuzione anche un'altra delle funzioni di callback elencate in precedenza.