Minidrivers e o driver de classe HID
Este artigo descreve minidrivers e o driver de classe HID.
Para obter mais informações, consulte Criando minidrivers HID do WDF.
Recursos operacionais do driver de classe HID
O driver de classe HID faz as seguintes operações:
Fornece e gerencia a interface de nível superior que os drivers do modo kernel e os aplicativos do modo de usuário usam para acessar as coleções HID compatíveis com 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 dão suporte a coleções HID. Ele gerencia os diferentes protocolos de dados que são usados por diferentes dispositivos de entrada e filas de entrada que dão suporte a mais de um arquivo aberto na mesma coleção HID.
A interface de nível superior para coleções HID consiste nas 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 FDO (objeto de dispositivo funcional) para dispositivos de entrada HIDClass enumerados por um driver de barramento ou porta de nível inferior.
Por exemplo, o driver de classe HID cria e gerencia as operações de um FDO que representa um dispositivo USB HID enumerado pela pilha de driver USB fornecida pelo sistema.
Fornece a funcionalidade de um driver de barramento para os dispositivos filho (coleções HID) compatíveis com um dispositivo de entrada subjacente.
O driver de classe HID cria um PDO (objeto de dispositivo físico) para cada coleção HID compatível com um dispositivo de entrada e gerencia a operação da coleção.
Associar um minidriver ao HIDClass
Um minidriver HID associa sua operação ao driver de classe HID chamando HidRegisterMinidriver para se registrar no driver de classe HID. A operação de registro:
Salva uma cópia dos pontos de entrada (ponteiros) nas rotinas de driver 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 de DRIVER_INITIALIZE . O minidriver HID define esses pontos de entrada antes de se registrar com o driver de 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 de expedição para as seguintes solicitações de E/S:
O processo de registro também aloca memória para a extensão de dispositivo mind river hid. Embora a memória seja alocada pelo driver de classe HID, apenas o minidriver HID usa essa extensão de dispositivo.
Comunicando-se com um minidriver HID
O driver de classe HID se comunica com um minidriver HID chamando as rotinas de DRIVER_ADD_DEVICE, DRIVER_UNLOAD e expedição do minidriver HID da seguinte maneira:
Chamando a rotina AddDevice
Quando a rotina AddDevice do driver de classe HID é chamada para criar um FDO (objeto de dispositivo funcional), 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 de classe HID excluirá o FDO e retornará o status retornado pela rotina addDevice do minidriver HID.
Chamando a rotina de descarregamento
Quando a rotina de descarregamento 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 descarregamento do minidriver HID.
Chamando as rotinas de expedição
Para operar um dispositivo, o driver de classe HID chama principalmente a rotina de expedição do minidriver HID para solicitações internas de controle de dispositivo.
Quando o gerente de E/S envia solicitações para o driver de classe HID, o driver de classe HID processa a solicitação e chama a rotina de expedição correspondente do minidriver HID.
O driver de classe HID não envia as seguintes solicitações para o minidriver HID: criar, fechar ou controlar o dispositivo.
Operação de um minidriver HID
Um minidriver de transporte HID abstrai a operação de um barramento de hardware ou porta ao qual o dispositivo de entrada se conecta.
Os minidrivers HID podem ser criados usando uma das seguintes estruturas:
- UMDF – User Mode Driver Framework
- KDMF – Estrutura do Driver do Modo Kernel
- WDF – Windows Driver Framework
- WDM – Modelo de Driver do Windows (herdado)
A Microsoft recomenda usar uma solução baseada em Estruturas (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 estrutura
- Minidriver HID baseado em UMDF, consulte Criando minidrivers HID do WDF
A seção a seguir fala sobre como registrar um minidriver HID baseado em WDM, mas grande parte dele é pertinente a um driver de Estruturas baseado em KMDF também. Todo o minidriver HID deve se registrar com o driver de classe HID e o driver de 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 dar suporte em suas rotinas de driver padrão, consulte as seguintes seções:
- Registrando um minidriver HID
- Extensão de minidriver HID
- Usando a estrutura HID_DEVICE_EXTENSION
- Rotinas de minidriver padrão
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 toda a outra inicialização de driver em sua rotina de DRIVER_INITIALIZE , o minidriver HID associa sua operação ao driver de classe HID chamando HidRegisterMinidriver.
Quando o minidriver HID se registra com o driver de classe HID, ele usa uma estrutura HID_MINIDRIVER_REGISTRATION . A estrutura especifica:
- A revisão hid
- O objeto de driver de minidriver HID
- O tamanho de uma extensão de dispositivo minidriver HID
- Se os dispositivos são sondados
Extensão de minidriver HID
Uma extensão de dispositivo minidriver HID é específica do dispositivo e é usada apenas por um minidriver HID. O driver de classe HID aloca a memória para a extensão de dispositivo minidriver quando o driver de classe cria sua extensão de dispositivo para um FDO (objeto de dispositivo funcional). 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 o layout para a extensão de dispositivo criada pelo driver de classe HID para um FDO (objeto de dispositivo funcional). O driver de classe HID define os membros dessa estrutura quando inicializa o FDO. Um minidriver HID não deve alterar as informações nessa estrutura.
Uma estrutura HID_DEVICE_EXTENSION contém os seguintes membros:
PhysicalDeviceObject é um ponteiro para o PDO (objeto de dispositivo físico) que representa o dispositivo de entrada subjacente.
NextDeviceObject é um ponteiro para a parte superior da pilha do dispositivo abaixo do FDO.
MiniDeviceExtension é um ponteiro para a extensão do dispositivo minidriver HID.
Dado um ponteiro para o FDO de um dispositivo de entrada, o seguinte GET_MINIDRIVER_DEVICE_EXTENSION macro 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 de dispositivo 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 a parte superior da pilha do dispositivo abaixo do FDO do dispositivo de entrada.
Quando um minidriver HID envia um IRP para baixo na pilha do dispositivo, ele deve usar NextDeviceObject como o objeto de dispositivo de destino.
Rotinas de minidriver padrão
Um minidriver HID deve fornecer as seguintes rotinas de suporte ao driver padrão:
- Rotina de DriverEntry do minidriver HID
- Rotina addDevice do minidriver HID
- Rotina de descarregamento do minidriver HID
Um minidriver HID também deve dar suporte às rotinas de expedição descritas em Rotinas de expedição fornecidas por um minidriver HID.
Rotina driverEntry
A rotina DRIVER_INITIALIZE em um minidriver HID faz o seguinte:
Cria um objeto driver para o par vinculado de drivers (driver de classe HID e um minidriver HID).
Define os pontos de entrada do driver necessários no objeto de driver de minidriver HID.
Chama HidRegisterMinidriver para registrar o minidriver HID com o driver de classe HID.
As configurações específicas do dispositivo que são usadas apenas pelo minidriver HID.
Rotina AddDevice
O driver de classe HID manipula a criação e inicialização do FDO (objeto de dispositivo funcional) para um dispositivo de entrada subjacente. O driver de classe HID também opera o FDO da perspectiva da interface de nível superior para o dispositivo subjacente e seus dispositivos filho (coleções HID).
O driver de classe HID DRIVER_ADD_DEVICE rotina chama a rotina addDevice do minidriver HID para que o minidriver possa fazer a inicialização interna específica do dispositivo.
Os parâmetros que são passados para o minidriver HID DRIVER_ADD_DEVICE rotina são o objeto de driver de 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.
O minidriver HID DRIVER_ADD_DEVICE rotina obtém um ponteiro para a extensão de dispositivo minidriver do FDO.
Normalmente, a rotina de DRIVER_ADD_DEVICE do minidriver HID faz o seguinte:
Inicializa a extensão do dispositivo minidriver. A extensão do dispositivo só é usada pelo minidriver.
Retorna STATUS_SUCCESS. Se o minidriver retornar um erro status, o driver de classe HID excluirá o FDO e retornará o erro status para o gerenciador de Plug and Play.
Rotina de descarregamento
A rotina Descarregue do driver de classe HID chama a rotina de DRIVER_UNLOAD do minidriver HID. Um minidriver HID libera todos os recursos internos alocados pelo minidriver.
Rotinas de expedição
Um minidriver HID deve fornecer as seguintes rotinas de expedição: criar, fechar, controle interno do dispositivo, controle do sistema, Plug and Play e gerenciamento de energia. Exceto para solicitações de controle de dispositivo internas, a maioria dessas rotinas de expedição fornece função mínima. Quando o driver de classe HID chama essas rotinas de expedição, ele passa o objeto de driver minidriver e o FDO (objeto de dispositivo funcional).
IRP_MJ_CREATE
Em conformidade com os requisitos do WDM, o driver de classe HID e um minidriver HID fornecem uma rotina de expedição para criar solicitações. No entanto, o FDO não pode ser aberto. O driver de classe HID retorna STATUS_UNSUCCESSFUL.
Um minidriver HID só precisa fornecer um stub. A rotina de expedição de criação nunca é chamada.
IRP_MJ_CLOSE
Em conformidade com os requisitos do WDM, o driver de classe HID e um minidriver HID devem fornecer uma rotina de expedição 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 stub. A rotina de expedição próxima nunca é chamada.
IRP_MJ_DEVICE_CONTROL
Um minidriver HID não precisa de uma rotina de expedição 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 expedição para solicitações de controle de dispositivo internas que dão suporte às solicitações descritas em IOCTLs do minidriver HID.
O driver de classe HID usa principalmente solicitações internas de controle de dispositivo para acessar o dispositivo de entrada subjacente.
O minidriver HID lida com essas solicitações de maneira específica do dispositivo.
IRP_MJ_SYSTEM_CONTROL
Um minidriver HID deve fornecer uma rotina de expedição para solicitações de controle do sistema. No entanto, um minidriver HID só é necessário para passar solicitações de controle do sistema para baixo na pilha do dispositivo da seguinte maneira:
Ignorar o local da pilha DO IRP atual
Enviar a solicitação para baixo na pilha de dispositivos do FDO
IRP_MJ_PNP
Um minidriver HID deve fornecer uma rotina de expedição para solicitações de Plug and Play.
O driver de classe HID faz todo o processamento de Plug and Play associado ao FDO. Quando o driver de classe HID processa uma solicitação de Plug and Play, ele chama a rotina de expedição Plug and Play do minidriver HID.
Um minidriver HID Plug and Play rotina de expedição:
Manipula o envio da solicitação para baixo da pilha de dispositivos do FDO e a conclusão da solicitação na forma de backup da pilha do dispositivo, conforme apropriado para cada tipo de solicitação.
O processamento específico do dispositivo associado a 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 foi iniciado, interrompido ou no processo de remoção).
IRP_MJ_POWER
O minidriver HID deve fornecer uma rotina de expedição para solicitações de energia. No entanto, o driver de classe HID manipula o processamento de energia para o FDO.
Em conformidade com os requisitos do WDM, um minidriver HID envia solicitações de energia para baixo da pilha de dispositivos do FDO dessa maneira:
Ignora o local da pilha IRP atual
Inicia o próximo IRP de energia
Envia o IRP de energia para baixo na pilha de dispositivos do FDO
Normalmente, o minidriver HID passa solicitações de energia para baixo na pilha do dispositivo sem processamento extra.