Registrando-se para notificação de chegada da interface do dispositivo e remoção de dispositivo

Este tópico descreve como um aplicativo de modo de usuário ou driver se registra para notificação de chegada da interface do dispositivo e remoção do dispositivo.

Normalmente, um componente de modo de usuário chama CM_Register_Notification para localizar uma interface do 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 da interface do dispositivo e remoções de dispositivo, respectivamente. A sequência de chamadas pode ser semelhante à seguinte.

Registrando-se para notificação de chegada da interface do dispositivo e remoção de dispositivo

  1. Chame CM_Register_Notification com CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE para se registrar para notificações de chegada da interface do dispositivo. Quando interfaces futuras na classe especificada chegam, o sistema notifica o 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. Nota Se uma interface chegar entre as etapas 1 e 2, a interface será listada duas vezes, do registro na etapa 1 e da lista de interfaces na etapa 2.

  3. Depois de 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 notificações do tipo CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE e forneça o novo identificador de dispositivo como o identificador para o qual receber notificações. Quando o dispositivo representado pela interface recebe uma solicitação de remoção de consulta, o sistema notifica o componente.

  5. Use esta tabela enquanto implementa o retorno de chamada de notificação do identificador de 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, o identificador aberto impedirá que a remoção de consulta deste dispositivo seja bem-sucedida.

    CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED

    Falha na remoção da consulta, portanto, 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 de uma rotina adiada porque não pode chamar CM_Unregister_Notification de um retorno de chamada de notificação para o identificador de notificação que você está cancelando o registro. Consulte a seção Comentários do CM_Unregister_Notification para obter mais informações.

    Em seguida, continuando na rotina adiada ou de volta no 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 consulta removida depois que as notificações de CM_NOTIFY_ACTION_DEVICEQUERYREMOVE tiverem sido enviadas, você poderá receber uma notificação de CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED sem primeiro receber uma notificação de CM_NOTIFY_ACTION_DEVICEQUERYREMOVE .

    CM_NOTIFY_ACTION_DEVICEREMOVEPENDING

    Chame CM_Unregister_Notification cancelar o registro das notificações do identificador. Você deve fazer isso 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 cancelar o registro das notificações do identificador. Você deve fazer isso 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.

  6. Quando 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.

Se você estiver seguindo este procedimento em um driver UMDF 2, consulte Usando interfaces de dispositivo para obter um exemplo de código. Um driver UMDF 2 pode executar as etapas 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

Usando interfaces de dispositivo