Compartir a través de


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

Este tema describe cómo se registra una aplicación o controlador en modo usuario para recibir notificaciones sobre la llegada de interfaces de dispositivo y la eliminación de dispositivos.

Si sigue este procedimiento en un controlador UMDF 2, consulte Uso de interfaces de dispositivo para obtener un ejemplo de código.

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 para CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE y CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE para la notificación de las llegadas de la interfaz de dispositivo y las eliminaciones de dispositivos, respectivamente. La secuencia de llamada podría ser 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 futuras interfaces de la clase especificada, el sistema se lo notifica a su componente.

  2. Dado que la interfaz a la que desea enviar E/S podría estar presente en el sistema, llame a CM_Get_Device_Interface_List o a SetupDiGetClassDevs para recuperar una lista de interfaces existentes. Nota Si una interfaz llega entre el paso 1 y el paso 2, la interfaz se enumera dos veces, desde el registro en el paso 1 y la lista de interfaces en el paso 2.

  3. Cuando encuentre la interfaz deseada, llame a CreateFile para abrir un identificador del 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á las notificaciones. Cuando el dispositivo representado por la interfaz recibe una solicitud de eliminación de consulta, el sistema se lo notifica a su componente.

  5. Utilice esta tabla cuando implemente la devolución de llamada de notificación del 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 de eliminación de este dispositivo tenga éxito.
CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED Se ha producidor un error al eliminar la consulta, por lo que el dispositivo y su interfaz siguen siendo válidos. Para seguir enviando E/S a la interfaz, abra un nuevo identificador. En primer lugar, anule el registro de las notificaciones del identificador anterior. Para ello, llame 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 cuyo registro está anulando. Consulte la sección Observaciones de CM_Unregister_Notification para obtener más información. A continuación, ya sea continuando en la rutina diferida o de vuelta en 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 sobre un dispositivo que está en proceso de eliminación de consultas después de que se hayan enviado las notificaciones CM_NOTIFY_ACTION_DEVICEQUERYREMOVE, es posible que reciba una notificación CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED sin haber recibido antes una notificación 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 Observaciones 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 Observaciones 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.
  1. Cuando 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 ha registrado en el paso 1.

Un controlador UMDF 2 puede realizar los pasos 1 a 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

Usar interfaces de dispositivo