Compartir a través de


Registro para la notificación de la llegada de la interfaz de dispositivo y la eliminación de dispositivos

En este tema se describe cómo se registra una aplicación o controlador en modo de usuario para la notificación de la llegada de la interfaz de dispositivo y la eliminación de dispositivos.

Normalmente, un componente en modo de usuario llama a CM_Register_Notification para buscar una interfaz de dispositivo y, a continuación, envía solicitudes de E/S a la interfaz. Para ello, el componente se registra tanto para CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE como para CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE, para la notificación de llegadas de interfaz de dispositivo y eliminaciones de dispositivos respectivamente. La secuencia de llamada podría ser similar a la siguiente.

Registro para la notificación de la llegada de la interfaz de dispositivo y la eliminación de dispositivos

  1. Llame a CM_Register_Notification con CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE para registrarse en las notificaciones de llegada de la interfaz de dispositivo. Cuando llegan las interfaces futuras de la clase especificada, el sistema notifica al componente.

  2. Dado que es posible que la interfaz a la que desea enviar E/S ya esté presente en el sistema, llame a CM_Get_Device_Interface_List o SetupDiGetClassDevs para recuperar una lista de interfaces existentes. Nota Si llega una interfaz entre el paso 1 y el paso 2, la interfaz aparece dos veces, desde el registro en el paso 1 y la lista de interfaces del paso 2.

  3. Una vez que encuentre la interfaz deseada, llame a CreateFile para abrir un identificador para el dispositivo.

  4. Después de crear correctamente un identificador de dispositivo en el paso 3, llame a CM_Register_Notification una segunda vez. Esta vez, regístrese para recibir notificaciones de tipo CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE y proporcione el nuevo identificador de dispositivo como identificador para el que recibir notificaciones. Cuando el dispositivo representado por la interfaz recibe una solicitud de eliminación de consulta, el sistema notifica al componente.

  5. Use esta tabla a medida que implemente la devolución de llamada de notificación de identificador del dispositivo.

    Valor de acción que recibe la devolución de llamada Qué debe hacer el componente
    CM_NOTIFY_ACTION_DEVICEQUERYREMOVE

    Llame a CloseHandle para cerrar el identificador del dispositivo. Si no lo hace, el identificador abierto impide que la consulta quite este dispositivo correctamente.

    CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED

    Error en la eliminación de la consulta, por lo que el dispositivo y su interfaz siguen siendo válidos. Para continuar enviando E/S a la interfaz, abra un nuevo identificador.

    En primer lugar, anule el registro de las notificaciones del identificador antiguo llamando a CM_Unregister_Notification. Debe hacerlo desde una rutina diferida porque no puede llamar a CM_Unregister_Notification desde una devolución de llamada de notificación para el identificador de notificación que está anulando el registro. Consulte la sección Comentarios de CM_Unregister_Notification para obtener más información.

    A continuación, continúe con la rutina diferida o vuelva a la devolución de llamada de notificación, llame a CreateFile para crear un nuevo identificador. A continuación, llame a CM_Register_Notification con el nuevo identificador y CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE.

    Tenga en cuenta que si se registra para recibir notificaciones en un dispositivo que está en proceso de eliminación de consultas después de que se hayan enviado las notificaciones de CM_NOTIFY_ACTION_DEVICEQUERYREMOVE , puede recibir una notificación de CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED sin recibir primero una notificación de CM_NOTIFY_ACTION_DEVICEQUERYREMOVE .

    CM_NOTIFY_ACTION_DEVICEREMOVEPENDING

    Llame a CM_Unregister_Notification para anular el registro de las notificaciones del identificador. Debe hacerlo a partir de una rutina diferida. Consulte la sección Comentarios de CM_Unregister_Notification para obtener más información. Si todavía tiene un identificador abierto para el dispositivo, llame a CloseHandle para cerrar el identificador del dispositivo.

    CM_NOTIFY_ACTION_DEVICEREMOVECOMPLETE

    Llame a CM_Unregister_Notification para anular el registro de las notificaciones del identificador. Debe hacerlo a partir de una rutina diferida. Consulte la sección Comentarios de CM_Unregister_Notification para obtener más información. Si todavía tiene un identificador abierto para el dispositivo, llame a CloseHandle para cerrar el identificador del dispositivo.

  6. Una vez que haya terminado con el dispositivo, llame a CM_Unregister_Notification para anular el registro de la devolución de llamada de notificación de interfaz que registró en el paso 1.

Si sigue este procedimiento en un controlador UMDF 2, consulte Uso de interfaces de dispositivo para obtener un ejemplo de código. Un controlador UMDF 2 puede realizar los pasos 1-4 en la rutina de devolución de llamada EvtDevicePrepareHardware del controlador y el paso 6 en una de las rutinas de devolución de llamada de eliminación de dispositivos del controlador.

CM_Register_Notification

CM_Unregister_Notification

Uso de interfaces de dispositivo