Registrar-se para notificação de chegada e remoção de interface de dispositivo
Este tópico descreve como um aplicativo ou driver no modo de usuário se registra para notificação de chegada e remoção da interface do dispositivo.
Se você estiver seguindo este procedimento em um driver UMDF 2, consulte Usar interfaces de dispositivo para obter um exemplo de código.
Geralmente, um componente de modo de usuário chama CM_Register_Notification para encontrar uma interface de dispositivo e, em seguida, envia solicitações de E/S para a interface. Para fazer isso, o componente se registra para CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE e CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE, para notificação de chegadas e remoções de interface do dispositivo, respectivamente. A sequência de chamada pode ser semelhante à que segue.
Registrar-se para notificação de chegada e remoção de interface de dispositivo
Chame CM_Register_Notification com CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE para se registrar e receber notificações de chegada da interface do dispositivo. Quando chegarem futuras interfaces na classe especificada, o sistema notificará seu componente.
Como a interface para a qual você deseja enviar E/S pode já estar presente no sistema, chame CM_Get_Device_Interface_List ou SetupDiGetClassDevs para recuperar uma lista de interfaces existentes. Observação: se uma interface chegar entre as etapas 1 e 2, a interface será listada duas vezes, no registro na etapa 1 e na lista de interfaces na etapa 2.
Após encontrar a interface desejada, chame CreateFile para abrir um identificador para o dispositivo.
Depois de criar com êxito um identificador de dispositivo na etapa 3, chame CM_Register_Notification uma segunda vez. Desta vez, registre-se para receber notificações do tipo CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE e forneça o novo identificador do dispositivo como o identificador para receber notificações. Quando o dispositivo representado pela interface receber uma solicitação de remoção de consulta, o sistema notificará seu componente.
Use esta tabela ao implementar o retorno de chamada de notificação de identificador do dispositivo.
Valor da ação que o retorno de chamada recebe | O que seu componente deve fazer |
---|---|
CM_NOTIFY_ACTION_DEVICEQUERYREMOVE | Chame CloseHandle para fechar o identificador do dispositivo. Se você não fizer isso, seu identificador aberto impedirá que a remoção de consulta deste dispositivo seja bem-sucedida. |
CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED | A remoção da consulta falhou, então o dispositivo e sua interface ainda são válidos. Para continuar enviando E/S para a interface, abra um novo identificador para ela. O registro de notificação no dispositivo por meio do identificador original permanece válido mesmo que esse identificador tenha sido fechado, portanto, não há necessidade de cancelar o registro desse registro de notificação e criar um novo registro no novo identificador para a interface do dispositivo. Observe que, se você se registrar para receber notificações em um dispositivo que está em processo de remoção de consulta após o envio das notificações CM_NOTIFY_ACTION_DEVICEQUERYREMOVE, poderá receber uma notificação CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED sem primeiro receber uma notificação CM_NOTIFY_ACTION_DEVICEQUERYREMOVE. |
CM_NOTIFY_ACTION_DEVICEREMOVEPENDING | Chame CM_Unregister_Notification para cancelar o registro das notificações do seu identificador. Você deve fazer isso a partir de uma rotina adiada. Consulte a seção Comentários do CM_Unregister_Notification para obter mais informações. Se você ainda tiver um identificador aberto para o dispositivo, chame CloseHandle para fechar o identificador do dispositivo. |
CM_NOTIFY_ACTION_DEVICEREMOVECOMPLETE | Chame CM_Unregister_Notification para cancelar o registro das notificações do seu identificador. Você deve fazer isso a partir de uma rotina adiada. Consulte a seção Comentários do CM_Unregister_Notification para obter mais informações. Se você ainda tiver um identificador aberto para o dispositivo, chame CloseHandle para fechar o identificador do dispositivo. |
- Ao terminar de usar o dispositivo, chame CM_Unregister_Notification para cancelar o registro do retorno de chamada de notificação de interface que você registrou na etapa 1.
Um driver UMDF 2 pode executar as etapas de 1 a 4 na rotina de retorno de chamada EvtDevicePrepareHardware do driver e a etapa 6 em uma das rotinas de retorno de chamada de remoção de dispositivo do driver.