Partager via


Inscription à la notification de l’arrivée de l’interface d’appareil et de la suppression d’appareil

Cette rubrique décrit comment une application ou un pilote en mode utilisateur s’inscrit pour la notification de l’arrivée de l’interface d’appareil et de la suppression de l’appareil.

En règle générale, un composant en mode utilisateur appelle CM_Register_Notification pour rechercher une interface d’appareil, puis envoie des demandes d’E/S à l’interface. Pour ce faire, le composant s’inscrit à la fois pour CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE et CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE, respectivement pour la notification des arrivées de l’interface de l’appareil et des suppressions d’appareils. La séquence d’appels peut ressembler à ce qui suit.

Inscription à la notification de l’arrivée de l’interface d’appareil et de la suppression d’appareil

  1. Appelez CM_Register_Notification avec CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE pour vous inscrire aux notifications d’arrivée de l’interface de l’appareil. Lorsque les interfaces futures de la classe spécifiée arrivent, le système en avertit votre composant.

  2. Étant donné que l’interface à laquelle vous souhaitez envoyer des E/S est peut-être déjà présente sur le système, appelez CM_Get_Device_Interface_List ou SetupDiGetClassDevs pour récupérer une liste d’interfaces existantes. Note Si une interface arrive entre l’étape 1 et l’étape 2, l’interface est répertoriée deux fois, à partir de l’inscription à l’étape 1 et de la liste des interfaces à l’étape 2.

  3. Une fois que vous avez trouvé l’interface souhaitée, appelez CreateFile pour ouvrir un handle pour l’appareil.

  4. Après avoir créé un handle d’appareil à l’étape 3, appelez CM_Register_Notification une deuxième fois. Cette fois, inscrivez-vous aux notifications de type CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE et fournissez le nouveau handle d’appareil comme handle pour lequel recevoir des notifications. Lorsque l’appareil représenté par l’interface reçoit une demande de suppression de requête, le système avertit votre composant.

  5. Utilisez ce tableau lorsque vous implémentez le rappel de notification de votre handle d’appareil.

    Valeur d’action que le rappel reçoit Ce que doit faire votre composant
    CM_NOTIFY_ACTION_DEVICEQUERYREMOVE

    Appelez CloseHandle pour fermer le handle d’appareil. Si vous ne le faites pas, votre handle ouvert empêche la suppression de la requête de cet appareil de réussir.

    CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED

    La suppression de la requête a échoué, de sorte que l’appareil et son interface sont toujours valides. Pour continuer à envoyer des E/S à l’interface, ouvrez un nouveau handle.

    Tout d’abord, annulez l’inscription des notifications pour votre ancien handle en appelant CM_Unregister_Notification. Vous devez effectuer cette opération à partir d’une routine différée, car vous ne pouvez pas appeler CM_Unregister_Notification à partir d’un rappel de notification pour le handle de notification que vous désinscrivez. Pour plus d’informations, consultez la section Remarques de CM_Unregister_Notification.

    Ensuite, en continuant dans la routine différée ou dans votre rappel de notification, appelez CreateFile pour créer un nouveau handle. Appelez ensuite CM_Register_Notification avec le nouveau handle et CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE.

    Notez que si vous vous inscrivez aux notifications sur un appareil en cours de suppression de la requête après l’envoi des notifications de CM_NOTIFY_ACTION_DEVICEQUERYREMOVE , vous pouvez recevoir une notification CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED sans recevoir au préalable une notification CM_NOTIFY_ACTION_DEVICEQUERYREMOVE .

    CM_NOTIFY_ACTION_DEVICEREMOVEPENDING

    Appelez CM_Unregister_Notification pour annuler l’inscription des notifications pour votre handle. Vous devez effectuer cette opération à partir d’une routine différée. Pour plus d’informations, consultez la section Remarques de CM_Unregister_Notification. Si vous avez toujours une poignée ouverte sur l’appareil, appelez CloseHandle pour fermer le handle d’appareil.

    CM_NOTIFY_ACTION_DEVICEREMOVECOMPLETE

    Appelez CM_Unregister_Notification pour annuler l’inscription des notifications pour votre handle. Vous devez effectuer cette opération à partir d’une routine différée. Pour plus d’informations, consultez la section Remarques de CM_Unregister_Notification. Si vous avez toujours une poignée ouverte sur l’appareil, appelez CloseHandle pour fermer le handle d’appareil.

  6. Une fois que vous avez terminé avec l’appareil, appelez CM_Unregister_Notification pour annuler l’inscription du rappel de notification d’interface que vous avez inscrit à l’étape 1.

Si vous suivez cette procédure dans un pilote UMDF 2, consultez Utilisation d’interfaces de périphérique pour obtenir un exemple de code. Un pilote UMDF 2 peut effectuer les étapes 1 à 4 dans la routine de rappel EvtDevicePrepareHardware du pilote et l’étape 6 dans l’une des routines de rappel de suppression d’appareil du pilote.

CM_Register_Notification

CM_Unregister_Notification

Utilisation d’interfaces d’appareil