Condividi tramite


Rimozione di un dispositivo in un driver del bus

Quando si rimuove un dispositivo figlio (PDO del figlio), il driver del bus principale deve annullare le operazioni eseguite per aggiungere e avviare il dispositivo.

Un driver del bus rimuove un dispositivo figlio con una procedura come la seguente nella routine DispatchPnP :

  1. Il driver ha gestito in precedenza questa richiesta IRP_MN_SURPRISE_REMOVAL per questo PDO?

    In tal caso, eseguire la pulizia rimanente e passare al passaggio 4.

    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.

  2. Completare tutte le richieste accodate nel driver.

  3. Rimuovere l'alimentazione dal dispositivo, se il driver del bus è in grado di farlo, e di notificare al gestore dell'alimentazione chiamando PoSetPowerState.

    Il conducente del bus spegne il dispositivo figlio, se possibile, e invia una notifica al gestore dell'alimentazione del cambiamento dello stato di alimentazione del dispositivo. Il conducente del bus esegue questa operazione in risposta alla richiesta di IRP_MN_REMOVE_DEVICE ; Il proprietario dei criteri di alimentazione del dispositivo non invia una richiesta di IRP_MN_SET_POWER quando il dispositivo viene rimosso. Per altre informazioni, vedere Risparmio energia.

  4. Se il driver del bus ha segnalato questo dispositivo nella risposta più recente a una richiesta di IRP_MN_QUERY_DEVICE_RELATIONS per BusRelations, il dispositivo è ancora fisicamente presente nel computer. In questo caso, l'autista del bus:

    • Mantiene il PDO per il dispositivo fino a quando il dispositivo non viene rimosso fisicamente.

    • Imposta Irp-IoStatus.Status> su STATUS_SUCCESS.

    • Completa l'IRP con IoCompleteRequest.

    • Ritorna dalla routine DispatchPnP.

    Il driver del bus deve continuare a segnalare questo dispositivo nelle enumerazioni successive (IRP_MN_QUERY_DEVICE_RELATIONS per BusRelations) fino a quando il dispositivo non viene fisicamente rimosso. Il gestore PnP tiene traccia dell'aggiunta e dell'avvio di un dispositivo enumerato.

  5. Se il dispositivo non è stato incluso nella risposta più recente dell'autista del bus a una richiesta di IRP_MN_QUERY_DEVICE_RELATIONS per BusRelations, il driver del bus considera che il dispositivo venga fisicamente rimosso dal computer. In questo caso, l'autista del bus esegue le operazioni seguenti:

    • Pulisce allocazioni specifiche del dispositivo, memoria, eventi e così via.

    • Imposta Irp->IoStatus.Status su STATUS_SUCCESS.

    • Completa l'IRP con IoCompleteRequest.

    • Libera il PDO con IoDeleteDevice.

      L'autista dell'autobus deve eliminare il PDO se l'autista ha omesso il dispositivo dall'elenco BusRelations più recente. Se un utente collega nuovamente il dispositivo al computer, il driver del bus deve creare un nuovo PDO in risposta alla query BusRelations successiva. Se un conducente del bus riutilizza lo stesso PDO per una nuova istanza di un dispositivo, il computer non funzionerà correttamente.

    • Ritorna dalla routine DispatchPnP.

Se il dispositivo è ancora presente quando il gestore PnP invia la richiesta di IRP_MN_REMOVE_DEVICE , il driver del bus mantiene il PDO. Se, in un secondo momento, il dispositivo viene fisicamente rimosso dal bus, il gestore PnP invia un altro IRP_MN_REMOVE_DEVICE. Dopo la ricezione dell'IRP di richiesta di rimozione successiva, il driver del bus elimina il PDO associato al dispositivo.

Un driver del bus deve essere in grado di gestire un IRP_MN_REMOVE_DEVICE per un dispositivo già rimosso e il cui PDO è contrassegnato per l'eliminazione. In risposta a tale IRP, l'autista del bus può avere esito positivo o restituire STATUS_NO_SUCH_DEVICE. Il PDO per il dispositivo non è ancora stato eliminato in questo caso, nonostante la precedente chiamata del conducente del bus a IoDeleteDevice, perché alcuni componenti hanno ancora un riferimento all'oggetto. Pertanto, il conducente del bus può accedere al PDO durante la gestione del secondo IRP di rimozione. Il conducente del bus non deve chiamare IoDeleteDevice una seconda volta per il PDO; il sistema di I/O elimina il PDO quando il conteggio dei riferimenti raggiunge zero.

Un driver del bus non rimuove le relative strutture di dati per un dispositivo figlio finché non riceve una richiesta di IRP_MN_REMOVE_DEVICE per il dispositivo. Un driver del bus potrebbe rilevare che un dispositivo è stato rimosso e chiamare IoInvalidateDeviceRelations, ma non deve eliminare il PDO del dispositivo fino a quando il gestore PnP non invia una richiesta di IRP_MN_REMOVE_DEVICE .