Rimozione di un dispositivo in un driver del bus

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

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

  1. Il driver ha gestito una richiesta di IRP_MN_SURPRISE_REMOVAL precedente per questo PDO?

    In tal caso, eseguire la pulizia rimanente e andare 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 dell'autobus è in grado di farlo e inviare una notifica al risparmio energia chiamando PoSetPowerState.

    Il conducente del bus accende il dispositivo figlio, se possibile, e notifica il risparmio energia del cambio di stato di alimentazione del dispositivo. Il conducente dell'autobus lo fa in risposta alla richiesta di IRP_MN_REMOVE_DEVICE ; Il proprietario dei criteri di risparmio energia 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, il conducente dell'autobus:

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

    • Imposta Irp-IoStatus.Status> su STATUS_SUCCESS.

    • Completa l'IRP con IoCompleteRequest.

    • Restituisce dalla routine DispatchPnP .

    Il driver del bus deve continuare a segnalare il 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 del driver del bus a una richiesta di IRP_MN_QUERY_DEVICE_RELATIONS per BusRelations, il driver dell'autobus considera il dispositivo essere fisicamente rimosso dal computer. In questo caso, il conducente dell'autobus 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.

      Il driver del bus deve eliminare il PDO se il driver omette 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 driver del bus riutilizza lo stesso PDO per una nuova istanza di un dispositivo, il computer non funzionerà correttamente.

    • Restituisce 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. Al ricevimento della successiva rimozione di IRP, il driver del bus elimina il PDO per il 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, il conducente dell'autobus 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 driver del bus a IoDeleteDevice, perché alcuni componenti hanno ancora un riferimento all'oggetto. Pertanto, il driver del bus può accedere al PDO durante la gestione del secondo IRP di rimozione. Il conducente dell'autobus non deve chiamare IoDeleteDevice una seconda volta per il PDO; il sistema di I/O elimina l'oggetto PDO quando il conteggio dei riferimenti raggiunge lo 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 finché il manager PnP non invia una richiesta di IRP_MN_REMOVE_DEVICE .