Partilhar via


Usando objetos de dispositivo de controle

Um objeto de dispositivo de controle é um objeto de dispositivo de estrutura que não suporta operações Plug and Play (PnP) ou de gerenciamento de energia. Os drivers podem usar objetos de dispositivo de controle para representar dispositivos virtuais somente de software ou dispositivos de hardware herdados (ou seja, dispositivos que não fornecem recursos PnP ou de gerenciamento de energia).

Um driver que cria um objeto de dispositivo de controle também normalmente cria um link simbólico para o objeto de dispositivo. As aplicações podem enviar pedidos de E/S para o objeto de dispositivo de controlo passando o nome do link simbólico para um elemento de API, como a função Microsoft Win32 CreateFile.

A estrutura não anexa objetos de dispositivo de controle a uma pilha de dispositivos . Portanto, quando um aplicativo envia uma solicitação de E/S para um objeto de dispositivo de controle, o gerenciador de E/S entrega a solicitação diretamente ao driver que criou o objeto de dispositivo de controle, em vez de ao driver na parte superior da pilha. (No entanto, um driver adicional pode chamar IoAttachDevice para anexar um objeto de dispositivo acima do objeto de dispositivo de controle. Nesse caso, o driver adicional recebe a solicitação de E/S primeiro.)

Usos de objetos de dispositivo de controle

Dois usos típicos para dispositivos de controle são:

  1. Um driver de filtro para um dispositivo PnP, se o driver suportar um conjunto de códigos de controle de E/S personalizados para serem utilizados por aplicações.

    Se um aplicativo tentou enviar os códigos de controle de E/S personalizados para a parte superior da pilha de drivers (usando, por exemplo, o nome de link simbólico de uma interface de dispositivo ), um driver acima do driver de filtro pode falhar na solicitação de E/S se o driver não reconhecer os códigos de controle de E/S personalizados. Para evitar esse problema, o driver de filtro pode criar um objeto de dispositivo de controle. Os aplicativos podem usar o nome de link simbólico do objeto de dispositivo de controle para enviar códigos de controle de E/S diretamente para o driver de filtro.

    (Observe que uma maneira melhor para o driver de filtro evitar o problema é agir como um driver de barramento e enumerar dispositivos filho que operam no modo raw. Em outras palavras, para cada dispositivo que o driver de filtro suporta, o driver pode criar um objeto de dispositivo físico (DOP) que não requer um driver de função. O driver chama WdfPdoInitAssignRawDevice e WdfDeviceInitAssignName para cada um desses dispositivos, e o aplicativo pode identificar um dispositivo pelo nome quando envia um código de controlo de E/S customizado.)

  2. Um driver para um dispositivo que não suporta PnP.

    Esse driver deve usar objetos de dispositivo de controle, porque os objetos de dispositivo para esses dispositivos não residem em uma pilha de dispositivos e não fornecem recursos PnP. Para obter mais informações sobre como oferecer suporte a dispositivos não-PnP, consulte utilizando o Kernel-Mode Driver Framework com drivers não-PnP.

Criando um objeto de dispositivo de controle

Para criar um objeto de dispositivo de controle, um driver deve:

  1. Chame WdfControlDeviceInitAllocate para obter uma estrutura WDFDEVICE_INIT.

  2. Chame métodos de inicialização de objeto, conforme necessário, para inicializar a estrutura WDFDEVICE_INIT. O driver pode chamar apenas os seguintes métodos de inicialização:

  3. Chame WdfDeviceCreate, que utiliza o conteúdo da estrutura WDFDEVICE_INIT para criar um objeto de dispositivo do framework.

  4. Conclua as seguintes operações de inicialização:

  5. Chamar WdfControlFinishInitializing.

Regras para usar objetos de dispositivo de controle

Os drivers que criam objetos de dispositivo de controle devem obedecer às seguintes regras:

  • Os drivers não podem passar o identificador do objeto de dispositivo de controle para métodos de estrutura que enumerar dispositivos filho.

  • Os drivers não podem passar o identificador do objeto de dispositivo de controle para métodos da framework que suportam interfaces de dispositivo .

  • Os drivers podem criar filas de E/S e registrar manipuladores de solicitação para as filas, mas a estrutura não permite que as filas sejam gerenciadas por energia.

  • Os drivers podem criar objetos de arquivo para objetos de dispositivo de controle.

Nomeando um objeto de dispositivo de controle

Todos os objetos do dispositivo de controle devem ser nomeados. Normalmente, o driver chamará WdfDeviceInitAssignName para atribuir um nome de dispositivo e, em seguida, chamará WdfDeviceCreateSymbolicLink para criar um nome de link simbólico que os aplicativos podem usar para acessar o objeto.

Se o driver não chamar WdfDeviceInitAssignName para atribuir um nome de dispositivo, a estrutura gerará automaticamente um nome para dispositivos de controle, mas o driver não poderá chamar WdfDeviceCreateSymbolicLink.

Seu driver pode chamar WdfDeviceInitSetDeviceClass para especificar uma classe de configuração de dispositivo para um dispositivo de controle. A classe de configuração do dispositivo identifica uma seção do Registro que contém informações fornecidas pelo administrador sobre dispositivos que pertencem à classe de instalação. Para obter mais informações sobre como chamar WdfDeviceInitSetDeviceClass, consulte Controlando o acesso a dispositivos em drivers de Framework-Based.

Recebimento de notificação de desligamento do sistema

Como os objetos do dispositivo de controle não suportam PnP, o driver não pode registrar funções de retorno de chamada que informam o driver quando o estado de energia de um dispositivo muda. No entanto, o driver pode chamar WdfControlDeviceInitSetShutdownNotification para registrar uma função de retorno de chamada EvtDeviceShutdownNotification. Esta função de retorno de chamada informa o condutor quando o sistema está prestes a perder energia.

Excluindo um objeto de dispositivo de controle

Alguns drivers têm que excluir seus objetos de dispositivo de controle antes que o driver seja descarregado, da seguinte maneira:

  • Se o driver cria objetos de dispositivo de controle (que não suportam PnP ou gerenciamento de energia), e se o driver também cria objetos de dispositivo de estrutura que suportam PnP e gerenciamento de energia, o driver deve eventualmente chamar WdfObjectDelete em IRQL = PASSIVE_LEVEL para excluir os objetos do dispositivo de controle.

    Se o driver cria ambos os tipos de objetos de dispositivo, o sistema operacional não pode descarregar o driver até que o driver tenha excluído os objetos de dispositivo de controle.

    No entanto, o driver não deve excluir os objetos de dispositivo de controle até que a estrutura tenha excluído os outros objetos de dispositivo. Para determinar quando o framework excluiu os outros objetos de dispositivo, o seu driver deve fornecer funções EvtCleanupCallback para esses objetos.

  • Se o driver cria objetos de dispositivo de controle, mas não cria objetos de dispositivo do framework que suportam PnP e gerenciamento de energia, o driver não precisa excluir os objetos de dispositivo de controle.

    Nesse caso, a estrutura exclui os objetos do dispositivo de controle depois que a função de retorno de chamada EvtDriverUnload do driver retorna.