Compartilhar via


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

  1. 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.

  2. 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.

  3. Após encontrar a interface desejada, chame CreateFile para abrir um identificador para o dispositivo.

  4. 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.

  5. 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. Primeiro, cancele o registro das notificações do identificador antigo chamando CM_Unregister_Notification. Você deve fazer isso em uma rotina adiada, pois não pode chamar CM_Unregister_Notification de um retorno de chamada de notificação para o identificador de notificação cujo registro está sendo cancelado. Consulte a seção Comentários do CM_Unregister_Notification para obter mais informações. Em seguida, continuando na rotina adiada ou de volta ao retorno de chamada de notificação, chame CreateFile para criar um novo identificador. Em seguida, chame CM_Register_Notification com o novo identificador e CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE. 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.
  1. 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.

CM_Register_Notification

CM_Unregister_Notification

Usar interfaces de dispositivo