Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este artigo descreve minidrivers e o driver de classe HID.
Para obter mais informações, consulte Criando minidrivers WDF HID.
Características operacionais do driver da classe HID
O driver de classe HID faz as seguintes operações:
Fornece e gerencia a interface de nível superior que os drivers de modo kernel e os aplicativos de modo de usuário usam para acessar as coleções HID suportadas por um dispositivo de entrada.
O driver de classe HID gerencia e roteia de forma transparente toda a comunicação entre drivers e aplicativos de nível superior e os dispositivos de entrada subjacentes que suportam coleções HID. Ele gerencia os diferentes protocolos de dados que são usados por diferentes dispositivos de entrada e filas de entrada que suportam mais de um arquivo aberto na mesma coleção HID.
A interface de nível superior para coleções HID consiste nos IOCTLs do driver de classe HID, nas rotinas de suporte HIDClass e nas estruturas HIDClass.
Comunica-se com um minidriver HID chamando as rotinas de driver padrão do minidriver.
Cria um objeto de dispositivo funcional (FDO) para dispositivos de entrada HIDClass enumerados por um driver de barramento ou porta de nível mais baixo.
Por exemplo, o driver de classe HID cria e gere as operações de um FDO que representa um dispositivo USB HID enumerado pela pilha de drivers USB fornecida pelo sistema.
Fornece a funcionalidade de um driver de barramento para os dispositivos filho (coleções HID) suportados por um dispositivo de entrada subjacente.
O driver de classe HID cria um objeto de dispositivo físico (PDO) para cada coleção HID suportada por um dispositivo de entrada e gerencia a operação da coleção.
Vinculando um minidriver ao HIDClass
Um minidriver HID vincula sua operação ao driver de classe HID chamando HidRegisterMinidriver para se registrar com o driver de classe HID. A operação de registo:
Armazena uma cópia dos pontos de entrada (ponteiros) das rotinas padrão do minidriver HID na extensão de dispositivo do driver de classe HID.
Um minidriver HID define seus pontos de entrada no objeto de driver que o minidriver recebe como entrada para sua rotina DRIVER_INITIALIZE . O minidriver HID define esses pontos de entrada antes de se registrar com o driver da classe HID.
Redefine os pontos de entrada no objeto de driver do minidriver para os pontos de entrada para as rotinas de driver padrão fornecidas pelo driver de classe HID.
O driver de classe HID fornece as seguintes rotinas de driver padrão:
Rotinas DRIVER_ADD_DEVICE e DRIVER_UNLOAD
Rotinas de expedição para as seguintes solicitações de E/S:
O processo de registo também aloca memória para a extensão do dispositivo HID mind river. Embora a memória é alocada pelo driver de classe HID, somente o minidriver HID usa essa extensão de dispositivo.
Comunicação com um minidriver HID
O driver da classe HID comunica-se com um minidriver HID chamando as rotinas de DRIVER_ADD_DEVICE, DRIVER_UNLOAD e as rotinas de despacho do minidriver HID da seguinte maneira:
Chamando a rotina AddDevice
Quando a rotina AddDevice do driver de classe HID é chamada para criar um objeto de dispositivo funcional (FDO), o driver de classe HID cria o FDO, inicializa-o e chama a rotina AddDevice do minidriver HID. A rotina AddDevice do minidriver HID faz a inicialização interna específica do dispositivo e, se bem-sucedida, retorna STATUS_SUCCESS. Se a rotina AddDevice do minidriver HID não for bem-sucedida, o driver da classe HID excluirá o FDO e retornará o status retornado pela rotina AddDevice do minidriver HID.
Chamando a rotina de descarga
Quando a rotina de Descarga do driver de classe HID é chamada, o driver de classe HID conclui a liberação de todos os recursos associados ao FDO e chama a rotina de Descarga do minidriver HID.
Chamando as rotinas de Despacho
Para operar um dispositivo, o driver da classe HID, principalmente, chama a rotina de despacho do minidriver HID para pedidos de controlo interno do dispositivo.
Quando o gestor de E/S envia solicitações para o controlador de classe HID, o controlador de classe HID processa a solicitação e chama a rotina de envio correspondente do minidriver HID.
O driver de classe HID não envia as seguintes solicitações para o minidriver HID: criar, fechar ou controle de dispositivo.
Operação de um minidriver HID
Um minidriver de transporte HID abstrai a operação de um barramento de hardware ou porta à qual seu dispositivo de entrada se conecta.
Os minidrivers HID podem ser construídos usando uma das seguintes estruturas:
- UMDF – Framework de Driver em Modo de Utilizador
- KDMF – Estrutura de Driver em Modo Kernel
- WDF - Estrutura de Driver do Windows
- WDM – Windows Driver Model (legado)
A Microsoft recomenda o uso de uma solução baseada em Frameworks (KMDF ou UMDF). Para obter mais informações sobre cada um dos modelos de driver, visite as seguintes seções:
- Minidriver HID baseado em KMDF, consulte Criando minidrivers HID baseados em Framework
- Minidriver HID criado tendo por base UMDF, consulte Criação de minidriver HID WDF
A seção a seguir fala sobre o registro de um minidriver HID baseado em WDM, mas muito disso também se aplica a um driver de Frameworks baseado em KMDF. Todos os minidrivers HID devem se registrar com o driver da classe HID, e o driver da classe HID se comunica com o minidriver chamando as rotinas de driver padrão do minidriver.
Para obter mais informações sobre a funcionalidade que um minidriver HID deve suportar em suas rotinas de driver padrão, consulte as seguintes seções:
- Registrando um minidriver HID
- Extensão do minidriver HID
- Usando a estrutura HID_DEVICE_EXTENSION
- Rotinas padrão de minidrivers
Para obter mais informações sobre o driver de classe HID, consulte Operação do minidriver HID.
Registrando um minidriver HID
Depois que um minidriver HID conclui todas as outras inicializações de driver em sua rotina DRIVER_INITIALIZE , o minidriver HID vincula sua operação ao driver de classe HID chamando HidRegisterMinidriver.
Quando o minidriver HID se regista com o driver de classe HID, ele usa uma estrutura HID_MINIDRIVER_REGISTRATION. A estrutura especifica:
- A revisão do HID
- O objeto de driver do minidriver HID
- O tamanho de uma extensão de dispositivo minidriver HID
- Se os dispositivos são pesquisados
Extensão do minidriver HID
Uma extensão de dispositivo de minidriver HID é específica para o dispositivo e somente é usada por um minidriver HID. O driver de classe HID aloca a memória para a extensão de dispositivo do minidriver quando o driver de classe cria a sua extensão de dispositivo para um objeto de dispositivo funcional (FDO). O minidriver HID especifica o tamanho de sua extensão de dispositivo quando registra o minidriver com o driver de classe HID. O tamanho é especificado pelo membro DeviceExtensionSize de uma estrutura HID_MINIDRIVER_REGISTRATION .
Usando a estrutura HID_DEVICE_EXTENSION
Um minidriver HID deve usar uma estrutura HID_DEVICE_EXTENSION como layout para a extensão de dispositivo criada pelo driver de classe HID para um objeto de dispositivo funcional (FDO). O driver de classe HID define os membros dessa estrutura quando inicializa o FDO. Um minidriver HID não deve alterar as informações nesta estrutura.
Uma estrutura HID_DEVICE_EXTENSION contém os seguintes membros:
PhysicalDeviceObject é um ponteiro para o objeto de dispositivo físico (DOP) que representa o dispositivo de entrada subjacente.
NextDeviceObject é um ponteiro para a parte superior da pilha de dispositivos abaixo do FDO.
MiniDeviceExtension é um ponteiro para a extensão de dispositivo minidriver HID.
Dado um ponteiro para o FDO de um dispositivo de entrada, a macro GET_MINIDRIVER_DEVICE_EXTENSION a seguir retorna um ponteiro para uma extensão de minidriver HID:
#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))
PDEVICE_EXTENSION é um ponteiro para uma extensão específica do dispositivo declarada por um minidriver HID.
Da mesma forma, um minidriver HID pode obter um ponteiro para o PDO do dispositivo de entrada e para o topo da pilha de dispositivos abaixo do FDO do dispositivo de entrada.
Quando um minidriver HID envia um IRP para baixo na pilha de dispositivos, ele deve usar NextDeviceObject como o objeto de dispositivo de destino.
Rotinas padrão de minidrivers
Um minidriver HID deve fornecer as seguintes rotinas de suporte de driver padrão:
- Rotina de Entrada do controlador HID minidriver
- Rotina AddDevice do minidriver HID
- Rotina de Descarregamento do Minidriver HID
Um minidriver HID também deve suportar as rotinas de despacho descritas em Rotinas de despacho fornecidas por um minidriver HID.
Rotina DriverEntry
A rotina DRIVER_INITIALIZE em um minidriver HID faz o seguinte:
Cria um objeto de driver para o par de drivers vinculados (driver de classe HID e um minidriver HID).
Define os pontos de entrada necessários do driver no objeto de driver do minidriver HID.
Chama HidRegisterMinidriver para registrar o minidriver HID com o driver de classe HID.
Faz configurações específicas do dispositivo que são usadas apenas pelo minidriver HID.
Rotina AddDevice
O driver de classe HID lida com a criação e inicialização do objeto de dispositivo funcional (FDO) para um dispositivo de entrada subjacente. O driver de classe HID também opera o FDO da perspetiva da interface de nível superior para o dispositivo subjacente e seus dispositivos filhos (coleções HID).
A rotina DRIVER_ADD_DEVICE do driver de classe HID chama a rotina AddDevice do HID minidriver para que o minidriver possa fazer a inicialização interna específica do dispositivo.
Os parâmetros que são passados para a rotina DRIVER_ADD_DEVICE do minidriver HID são o objeto de driver do minidriver e o FDO. O driver de classe HID passa o FDO para a rotina AddDevice do minidriver, não para o objeto de dispositivo físico para o dispositivo de entrada subjacente.
A rotina DRIVER_ADD_DEVICE do minidriver HID obtém um apontador para a extensão do dispositivo do minidriver a partir do FDO.
Normalmente, a rotina do minidriver HID DRIVER_ADD_DEVICE faz o seguinte:
Inicializa a extensão do dispositivo minidriver. A extensão do dispositivo é utilizada apenas pelo minidriver.
Retorna com STATUS_SUCCESS. Se o minidriver retornar um status de erro, o driver de classe HID excluirá o FDO e retornará o status de erro para o gerenciador Plug and Play.
Rotina de descarga
A rotina de Descarga do driver da classe HID chama a rotina DRIVER_UNLOAD do minidriver HID. Um minidriver HID libera quaisquer recursos internos alocados pelo minidriver.
Rotinas de despacho
Um minidriver HID deve fornecer as seguintes rotinas de despacho: criar, fechar, controlo interno do dispositivo, controlo do sistema, Plug and Play e gestão de energia. Com exceção das solicitações de controle interno do dispositivo, a maioria dessas rotinas de despacho fornece uma função mínima. Quando o driver de classe HID chama essas rotinas de despacho, ele passa o objeto de driver do minidriver e o objeto de dispositivo funcional (FDO).
IRP_MJ_CREATE
Em conformidade com os requisitos WDM, o driver de classe HID e um minidriver HID fornecem uma rotina de despacho para as solicitações de criação. No entanto, o FDO não pode ser aberto. O driver de classe HID retorna STATUS_UNSUCCESSFUL.
Um minidriver HID só precisa fornecer um esboço. A rotina de envio de criação nunca é chamada.
IRP_MJ_CLOSE
Em conformidade com os requisitos WDM, o driver de classe HID e um minidriver HID devem fornecer uma rotina de despacho para solicitações próximas. No entanto, o FDO não pode ser aberto. O driver de classe HID retorna STATUS_INVALID_PARAMETER_1.
Um minidriver HID só precisa fornecer um esboço. A rotina de envio próximo nunca é chamada.
IRP_MJ_DEVICE_CONTROL
Um minidriver HID não precisa de uma rotina de despacho para solicitações de controle de dispositivo. O driver de classe HID não passa solicitações de controle de dispositivo para um minidriver.
IRP_MJ_INTERNAL_DEVICE_CONTROL
Um minidriver HID deve fornecer uma rotina de despacho para solicitações de controle de dispositivo interno que suporte as solicitações descritas em IOCTLs de minidriver HID.
O driver de classe HID usa principalmente solicitações de controle de dispositivo interno para acessar o dispositivo de entrada subjacente.
O minidriver HID lida com estes pedidos de forma específica para o dispositivo.
IRP_MJ_SYSTEM_CONTROL
Um minidriver HID deve fornecer uma rotina de despacho para solicitações de controle do sistema. No entanto, apenas é necessário que um minidriver HID passe as solicitações de controle do sistema para a parte inferior da pilha de dispositivos da seguinte maneira:
Ignorar a localização corrente da pilha de IRP
Envie a solicitação através da camada de dispositivos do FDO
IRP_MJ_PNP
Um minidriver HID deve fornecer uma rotina de despacho para solicitações Plug and Play.
O driver de classe HID realiza todo o processamento de Plug and Play associado ao FDO. Quando a classe de driver HID processa uma solicitação de Plug and Play, chama a rotina de despacho de Plug and Play do minidriver HID.
Uma rotina de despacho Plug and Play do minidriver HID:
Lida com o envio da solicitação para baixo da pilha de dispositivos do FDO e a conclusão da solicitação no caminho de backup da pilha de dispositivos, conforme apropriado para cada tipo de solicitação.
O processamento específico para cada dispositivo é realizado em associação com determinadas solicitações para atualizar informações sobre o estado do FDO.
Por exemplo, o minidriver pode atualizar o estado Plug and Play do FDO (em particular, se o FDO está iniciado, interrompido ou em processo de remoção).
IRP_MJ_POWER
O minidriver HID deve fornecer uma rotina de despacho para solicitações de energia. No entanto, o driver de classe HID gere o processamento de energia para o FDO.
Em conformidade com os requisitos WDM, um minidriver HID envia solicitações de energia para baixo da pilha de dispositivos do FDO desta forma:
Ignora a localização atual da pilha de IRP
Inicia o próximo IRP de energia
Envia o IRP de energia para baixo da pilha de dispositivos do FDO
Normalmente, o minidriver HID encaminha solicitações de energia através da pilha de dispositivos sem necessidade de processamento adicional.