Partager via


Suppression d’un périphérique dans un pilote de bus

Lors de la suppression d’un appareil enfant (PDO enfant), le pilote de bus parent doit annuler toutes les opérations qu’il a effectuées pour ajouter et démarrer l’appareil.

Un pilote de bus supprime un appareil enfant avec une procédure telle que la suivante dans sa routine DispatchPnP :

  1. Le pilote a-t-il géré une demande de IRP_MN_SURPRISE_REMOVAL précédente pour cette AOP ?

    Si c’est le cas, effectuez les propre restants et passez à l’étape 4.

    Un pilote gère généralement un indicateur dans l’extension de périphérique qui indique si le pilote a géré une demande de IRP_MN_SURPRISE_REMOVAL pour l’appareil.

  2. Terminez toutes les demandes mises en file d’attente dans le pilote.

  3. Retirez l’alimentation de l’appareil, si le pilote de bus est capable de le faire, et informez le gestionnaire d’alimentation en appelant PoSetPowerState.

    Si possible, le pilote de bus met hors tension l’appareil enfant et avertit le gestionnaire d’alimentation du changement d’état d’alimentation de l’appareil. Le pilote de bus effectue cette opération en réponse à la demande de IRP_MN_REMOVE_DEVICE ; le propriétaire de la stratégie d’alimentation de l’appareil n’envoie pas de demande de IRP_MN_SET_POWER lorsque l’appareil est supprimé. Pour plus d’informations, consultez Gestion de l’alimentation.

  4. Si le pilote de bus a signalé cet appareil dans sa réponse la plus récente à une demande de IRP_MN_QUERY_DEVICE_RELATIONS pour BusRelations, l’appareil est toujours physiquement présent sur l’ordinateur. Dans ce cas, le pilote de bus :

    • Conserve l’AOP pour l’appareil jusqu’à ce que l’appareil ait été physiquement supprimé.

    • Définit Irp-IoStatus.Status> sur STATUS_SUCCESS.

    • Termine l’IRP avec IoCompleteRequest.

    • Retourne à partir de la routine DispatchPnP .

    Le pilote de bus doit continuer à signaler cet appareil dans les énumérations suivantes (IRP_MN_QUERY_DEVICE_RELATIONS pour BusRelations) jusqu’à ce que l’appareil soit physiquement supprimé. Le gestionnaire PnP effectue le suivi de l’ajout et du démarrage d’un appareil énuméré.

  5. Si l’appareil n’a pas été inclus dans la réponse la plus récente du pilote de bus à une demande de IRP_MN_QUERY_DEVICE_RELATIONS pour BusRelations, le pilote de bus considère que l’appareil est physiquement supprimé de l’ordinateur. Dans ce cas, le pilote de bus effectue les opérations suivantes :

    • Nettoie les allocations, la mémoire, les événements, etc. spécifiques à l’appareil.

    • Définit Irp-IoStatus.Status> sur STATUS_SUCCESS.

    • Termine l’IRP avec IoCompleteRequest.

    • Libère l’AOP avec IoDeleteDevice.

      Le pilote de bus doit supprimer l’AOP si le pilote a omis l’appareil de sa liste BusRelations la plus récente. Si un utilisateur reconnecte l’appareil à l’ordinateur, le pilote de bus doit créer une nouvelle PDO en réponse à la requête BusRelations suivante . Si un pilote de bus réutilise le même PDO pour une nouvelle instance d’un appareil, la machine ne fonctionnera pas correctement.

    • Retourne à partir de la routine DispatchPnP .

Si l’appareil est toujours présent lorsque le gestionnaire PnP envoie la demande de IRP_MN_REMOVE_DEVICE , le pilote de bus conserve l’AOP. Si, ultérieurement, l’appareil est physiquement supprimé du bus, le gestionnaire PnP envoie une autre IRP_MN_REMOVE_DEVICE. À la réception de l’IRP de suppression suivante, le pilote de bus supprime l’AOP de l’appareil.

Un pilote de bus doit être en mesure de gérer un IRP_MN_REMOVE_DEVICE pour un appareil qu’il a déjà supprimé et dont le PDO est marqué pour suppression. En réponse à un tel IRP, le conducteur de bus peut réussir le IRP ou retourner STATUS_NO_SUCH_DEVICE. L’AOP de l’appareil n’a pas encore été supprimé dans ce cas, malgré l’appel précédent du pilote de bus à IoDeleteDevice, car certains composants ont toujours une référence à l’objet. Par conséquent, le pilote de bus peut accéder à l’ADO tout en gérant le deuxième IRP de suppression. Le pilote de bus ne doit pas appeler IoDeleteDevice une deuxième fois pour l’AOP ; le système d’E/S supprime l’AOP lorsque son nombre de références atteint zéro.

Un pilote de bus ne supprime pas ses structures de données pour un appareil enfant tant qu’il n’a pas reçu une demande de IRP_MN_REMOVE_DEVICE pour l’appareil. Un pilote de bus peut détecter qu’un appareil a été supprimé et appeler IoInvalidateDeviceRelations, mais il ne doit pas supprimer l’AOP de l’appareil tant que le gestionnaire PnP n’a pas envoyé une demande de IRP_MN_REMOVE_DEVICE .