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
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.
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.
Cuando encuentre la interfaz deseada, llame a CreateFile para abrir un identificador del dispositivo.
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.
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. El registro de notificaciones en el dispositivo a través del identificador original sigue siendo válido aunque ese identificador se haya cerrado, por lo que no es necesario anular el registro de notificaciones y crear un nuevo registro bajo el nuevo identificador de la interfaz del dispositivo. 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. |
- 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.