Partilhar via


Usando interfaces de dispositivo em drivers UMDF

Advertência

UMDF 2 é a versão mais recente do UMDF e substitui UMDF 1. Todos os novos drivers UMDF devem ser escritos usando UMDF 2. Nenhum novo recurso está sendo adicionado ao UMDF 1 e há suporte limitado para UMDF 1 em versões mais recentes do Windows 10. Os drivers universais do Windows devem usar UMDF 2.

Os exemplos de UMDF 1 arquivados podem ser encontrados na Windows 11, versão 22H2 - Atualização de Amostras de Driver de maio de 2022.

Para obter mais informações, consulte Introdução ao UMDF.

Uma interface de dispositivo é uma ligação simbólica para um dispositivo Plug and Play (PnP) que uma aplicação pode usar para aceder ao dispositivo. Um aplicativo de modo de usuário pode passar o nome de link simbólico da interface para um elemento de API, como a função Microsoft Win32 CreateFile . Para obter o nome de link simbólico de uma interface de dispositivo, a aplicação em modo utilizador pode chamar funções SetupDi. Para obter mais informações sobre as funções SetupDi, consulte SetupDi Device Interface Functions.

Cada interface de dispositivo pertence a uma classe de interface de dispositivo . Por exemplo, uma pilha de drivers para um dispositivo CD-ROM pode fornecer uma interface que pertence à classe GUID_DEVINTERFACE_CDROM. Um dos drivers do dispositivo CD-ROM registraria uma instância da classe GUID_DEVINTERFACE_CDROM para informar o sistema e os aplicativos de que um dispositivo CD-ROM está disponível. Para obter mais informações sobre classes de interface de dispositivo, consulte Introdução às interfaces de dispositivo.

Registrando uma interface de dispositivo

Para registrar uma instância de uma classe de interface de dispositivo, um driver baseado em UMDF pode chamar IWDFDevice::CreateDeviceInterface de dentro da sua função de retorno de chamada IDriverEntry::OnDeviceAdd. Se o driver oferecer suporte a várias instâncias da interface, ele poderá atribuir uma cadeia de caracteres de referência exclusiva a cada instância.

Ativando e desativando uma interface de dispositivo

Se a criação for bem-sucedida, a estrutura habilita e desabilita automaticamente a interface com base no estado PnP do dispositivo.

Além disso, um driver pode desativar e reativar uma interface de dispositivo conforme necessário. Por exemplo, se um driver determinar que o dispositivo deixou de responder, o driver poderá chamar IWDFDevice::AssignDeviceInterfaceState para desativar as interfaces do dispositivo e proibir que as aplicações obtenham novos identificadores para a interface. (As alças existentes na interface não são afetadas.) Se o dispositivo mais tarde ficar disponível, o driver pode chamar IWDFDevice::AssignDeviceInterfaceState novamente para reativar as interfaces.

Recebendo solicitações para acessar uma interface de dispositivo

Quando uma aplicação solicita acesso à interface do dispositivo de um driver, a framework chama a função de retorno de chamada do driver IQueueCallbackCreate::OnCreateFile. O driver pode chamar IWDFFile::RetrieveFileName para obter o nome do dispositivo ou arquivo que o aplicativo está acessando. Se o driver especificou uma cadeia de caracteres de referência quando registrou a interface do dispositivo, o sistema operacional incluirá a cadeia de referência no arquivo ou nome do dispositivo que IWDFFile::RetrieveFileName retorna.

Criando eventos de dispositivo

Seu driver baseado em UMDF pode criar eventos personalizados específicos do dispositivo (chamados eventos de dispositivo) chamando IWDFDevice::P ostEvent. Um driver que se registrou para usar qualquer uma das interfaces do dispositivo pode receber notificações de eventos personalizados de um dispositivo. Os drivers no UMDF recebem essas notificações ao fornecer uma função de callback IRemoteInterfaceCallbackEvent::OnRemoteInterfaceEvent.

Os eventos personalizados são exclusivos do dispositivo. Tanto o desenvolvedor do driver que cria o evento quanto o desenvolvedor do driver que recebe o evento devem entender o significado do evento.

Aceder à interface do dispositivo de outro controlador

Se desejar que o driver baseado em UMDF envie solicitações de E/S para uma interface de dispositivo fornecida por outro driver, você poderá criar um destino de E/S remoto que represente a interface do dispositivo.

Primeiro, o motorista deve se registrar para receber uma notificação quando uma interface de dispositivo estiver disponível. Utilize os passos seguintes:

  1. Quando o driver chama IWDFDriver::CreateDevice, o driver pode fornecer uma interface IPnpCallbackRemoteInterfaceNotification . A função de retorno de chamada IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival desta interface informa o seu controlador quando as interfaces do dispositivo estão disponíveis.

  2. Depois que o driver chama IWDFDriver::CreateDevice, ele pode chamar IWDFDevice2::RegisterRemoteInterfaceNotification para cada interface de dispositivo que o driver usará.

Posteriormente, a estrutura chama a função de callback IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival do driver cada vez que uma interface de dispositivo especificada fica disponível. A função de retorno de chamada pode chamar IWDFRemoteInterfaceInitialize::GetInterfaceGuid e IWDFRemoteInterfaceInitialize::RetrieveSymbolicLink para determinar qual interface de dispositivo chegou.

A função de retorno de chamada do driver IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival deve tipicamente fazer o seguinte:

  1. Chame IWDFDevice2::CreateRemoteInterface para criar um objeto de interface remota, fornecendo opcionalmente as interfaces IRemoteInterfaceCallbackEvent e IRemoteInterfaceCallbackRemoval .

  2. Chame IWDFDevice2::CreateRemoteTarget para criar um objeto de destino remoto, fornecendo opcionalmente uma interface IRemoteTargetCallbackRemoval .

  3. Chame IWDFRemoteTarget::OpenRemoteInterface para conectar a interface do dispositivo ao destino remoto.

    Se a interface do dispositivo for criada pelo enumerador de dispositivos do software SWENUM, o driver deverá chamar OpenRemoteInterface a partir de um item de trabalho. (Por exemplo, consulte a função QueueUserWorkItem no SDK do Windows.)

Agora o driver pode formatar e enviar solicitações de E/S para o destino de E/S remoto.

Além do callback IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival, um driver baseado em UMDF pode fornecer duas callbacks adicionais para receber notificações sobre eventos da interface de dispositivos.