Partager via


Un utilisateur débranche un appareil

Pendant qu’un système est en cours d’exécution, un utilisateur peut supprimer un appareil de l’une des deux manières suivantes : par suppression ordonnée, ce qui signifie que l’utilisateur informe le système que l’appareil est sur le point d’être supprimé (par exemple, à l’aide du programme Débrancher ou éjecter le matériel) ; ou par suppression surprise, ce qui signifie que l’utilisateur débranche l’appareil sans en informer le système. Si le bus prend en charge la suppression surprise (par exemple, USB), les pilotes de l’appareil doivent être en mesure de gérer la disparition soudaine de l’appareil.

Suppression ordonnée

L’utilisateur demande la suppression à l’aide du programme Débrancher ou éjecter le matériel du système, en désactivant l’appareil à l’aide de Gestionnaire de périphériques ou en appuyant sur le bouton éjectable d’un appareil éjectable. L’infrastructure permet de supprimer ou de désactiver l’appareil, sauf si le pilote a :

Pour chaque pilote de fonction et de filtre qui prend en charge l’appareil, l’infrastructure effectue les opérations suivantes, dans l’ordre, un pilote à la fois, en commençant par le pilote le plus élevé dans la pile de pilotes :

  1. Si le pilote utilise des E/S autogérées, l’infrastructure appelle la fonction de rappel EvtDeviceSelfManagedIoSuspend du pilote.

  2. Le framework arrête toutes les files d’attente d’E/S gérées par l’alimentation du pilote.

  3. Si le matériel et le pilote prennent en charge DMA, l’infrastructure appelle les fonctions de rappel EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlush et EvtDmaEnablerDisable (le cas échéant) pour chaque canal DMA créé.

  4. L’infrastructure appelle la fonction de rappel EvtDeviceD0ExitPreInterruptsDisabled du pilote (si elle existe), puis appelle la fonction de rappel EvtInterruptDisable du pilote (si elle existe) pour chaque interruption afin que le pilote puisse désactiver les interruptions d’appareil.

  5. L’infrastructure appelle la fonction de rappel EvtDeviceD0Exit du pilote (si elle existe).

  6. L’infrastructure appelle la fonction de rappel EvtDeviceReleaseHardware du pilote (si elle existe), en lui transmettant la liste des ressources matérielles que le gestionnaire PnP a attribuées à l’appareil.

  7. Si le pilote utilise des E/S autogérées, l’infrastructure appelle la fonction de rappel EvtDeviceSelfManagedIoFlush du pilote.

  8. Si le pilote utilise des E/S autogérées, l’infrastructure appelle la fonction de rappel EvtDeviceSelfManagedIoCleanup du pilote.

Le pilote de bus est le pilote de la pile appelée en dernier. Lorsque l’infrastructure appelle la fonction de rappel EvtDeviceD0Exit du pilote de bus, la fonction de rappel définit l’état d’alimentation de l’appareil (un appareil enfant du bus) sur D3. Le pilote de bus peut contrôler quand l’infrastructure appelle sa fonction de rappel EvtDeviceReleaseHardware en appelant WdfDeviceInitSetReleaseHardwareOrderOnFailure.

Suppression surprise

Un utilisateur débranche un appareil de manière inattendue. Le pilote de bus du bus de l’appareil découvre que l’appareil est manquant et appelle WdfChildListUpdateChildDescriptionAsMissing.

Pour chaque pilote de fonction et de filtre qui prend en charge l’appareil, l’infrastructure effectue les opérations suivantes, dans l’ordre, un pilote à la fois, en commençant par le pilote le plus élevé dans la pile de pilotes :

  1. L’infrastructure appelle la fonction de rappel EvtDeviceSurpriseRemoval du pilote (si elle existe).
  2. Si l’appareil était dans son état de fonctionnement (D0) lorsqu’il a été débranché :
    1. Le framework arrête toutes les files d’attente d’E/S gérées par l’alimentation du pilote.
    2. Si le pilote utilise des E/S autogérées, l’infrastructure appelle la fonction de rappel EvtDeviceSelfManagedIoSuspend du pilote.
    3. Si le matériel et le pilote prennent en charge DMA, l’infrastructure appelle les fonctions de rappel EvtDmaEnablerSelfManagedIoStop, EvtDmaEnablerFlush et EvtDmaEnablerDisable (le cas échéant) pour chaque canal DMA créé.
    4. L’infrastructure appelle les fonctions de rappel EvtDeviceD0ExitPreInterruptsDisabled et EvtInterruptDisable du pilote (si elles existent) afin que le pilote puisse désactiver les interruptions de périphérique.
    5. L’infrastructure appelle la fonction de rappel EvtDeviceD0Exit du pilote (si elle existe).
  3. L’infrastructure appelle la fonction de rappel EvtDeviceReleaseHardware du pilote (si elle existe), en passant la liste des ressources matérielles que le gestionnaire PnP a attribuées à l’appareil.
  4. Si le pilote utilise des E/S autogérées, l’infrastructure appelle la fonction de rappel EvtDeviceSelfManagedIoFlush du pilote.
  5. Si le pilote utilise des E/S autogérées, l’infrastructure appelle la fonction de rappel EvtDeviceSelfManagedIoCleanup du pilote.

Notez qu’un appareil peut être supprimé de manière inattendue à tout moment. Par conséquent, l’infrastructure peut appeler la fonction de rappel EvtDeviceSurpriseRemoval du pilote à un moment autre que celui indiqué dans les étapes précédentes. Par exemple, si un utilisateur débranche de manière inattendue l’appareil alors qu’il entre dans un état de faible consommation, l’infrastructure peut appeler la fonction de rappel EvtDeviceSurpriseRemoval après avoir appelé la fonction de rappel EvtDeviceReleaseHardware . Vous ne devez pas coder une fonction de rappel EvtDeviceSurpriseRemoval d’une manière qui suppose qu’elle et d’autres fonctions de rappel sont appelées dans une séquence particulière.

En outre, l’infrastructure ne synchronise pas la fonction de rappel EvtDeviceSurpriseRemoval d’un appareil avec l’une des fonctions de rappel répertoriées dans les étapes précédentes pour cet appareil. Par conséquent, la fonction de rappel EvtDeviceSurpriseRemoval peut s’exécuter alors qu’une autre des fonctions de rappel répertoriées précédemment est également en cours d’exécution.