Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo descreve os minidrivers e o driver de classe HID.
Para obter mais informações, consulte Criação de minidrivers HID do WDF.
Recursos 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 do modo kernel e os aplicativos de 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 objeto de dispositivo funcional (FDO) para dispositivos de entrada HIDClass enumerados por um driver de barramento ou de porta de nível inferior.
Por exemplo, o driver de classe de HID cria e gerencia as operações de um FDO que representa um dispositivo HID USB enumerado pela pilha de drivers USB fornecida pelo sistema.
Fornece a funcionalidade de um driver de ônibus para os dispositivos filho (coleções HID) com suporte por um dispositivo de entrada subjacente.
O driver de classe HID cria um PDO (objeto de dispositivo físico) para cada coleção HID com suporte por um dispositivo de entrada e gerencia a operação da coleção.
Vincular 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 do driver que o minidriver recebe como entrada para sua rotina DRIVER_INITIALIZE. O minidriver HID configura 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 do dispositivo HID Mind River. Embora a memória seja alocada pelo driver de classe HID, somente 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 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 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 Unload 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 Unload do minidriver HID.
Chamando as rotinas de despacho
Para operar um dispositivo, o driver de classe HID chama principalmente a rotina de despacho do minidriver HID para solicitações internas de controle de dispositivo.
Quando o gerenciador 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 despacho 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 à qual seu dispositivo de entrada é anexado.
Os minidrivers HID podem ser criados usando uma das seguintes estruturas:
- UMDF – Estrutura de Driver do Modo de Usuário
- KDMF – Framework de Driver em Modo Kernel
- WDF – Estrutura do Windows Driver
- WDM – Modelo do Windows Driver (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 no Framework
- 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. Todos os minidrivers HID devem registrar-se 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 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 de 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 concluir 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 registra junto ao driver de classe HID, ele usa uma estrutura HID_MINIDRIVER_REGISTRATION. A estrutura especifica:
- A revisão HID
- O objeto de driver do HID minidriver
- O tamanho de uma extensão de dispositivo minidriver HID
- Se os dispositivos são sondados
Extensão do minidriver HID
Uma extensão de dispositivo de minidriver HID é específica a um dispositivo e é somente utilizada por um minidriver HID. O driver de classe HID aloca a memória para a extensão do minidriver do dispositivo quando cria 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 de HID_DEVICE_EXTENSION
Um minidriver HID deve utilizar uma estrutura HID_DEVICE_EXTENSION como a configuração 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 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 de dispositivos 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, a seguinte macro GET_MINIDRIVER_DEVICE_EXTENSION 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 desse dispositivo.
Quando um minidriver HID envia um IRP pela pilha de dispositivos, ele deve usar NextDeviceObject como o objeto de dispositivo de destino.
Rotinas padrão de minidriver
Um minidriver HID deve fornecer as seguintes rotinas padrão de suporte a drivers:
- Rotina de DriverEntry do minidriver HID
- Rotina de AddDevice do minidriver HID
- Rotina de descarregamento do minidriver HID
Um minidriver HID também deve dar suporte às rotinas de despacho descritas em "Rotinas de Despacho Fornecidas por um Minidriver HID".
Rotina de DriverEntry
A rotina de 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 de driver necessários no objeto de driver do minidriver HID.
Chama HidRegisterMinidriver para registrar o minidriver HID junto ao driver de classe HID.
Realiza configurações específicas do dispositivo que são usadas exclusivamente pelo minidriver HID.
Rotina de 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 chama a rotina AddDevice do minidriver HID para que o minidriver possa realizar a inicialização interna específica do dispositivo.
Os parâmetros 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 do minidriver AddDevice , não para o objeto de dispositivo físico do dispositivo de entrada subjacente.
A rotina DRIVER_ADD_DEVICE do minidriver HID obtém um ponteiro 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 é usada apenas pelo mini driver.
Retorna 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 de Plug and Play.
Rotina de descarregamento
A rotina de descarregamento do driver de classe HID chama a rotina 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 despacho: criar, fechar, controle interno do dispositivo, controle do sistema, Plug and Play e gerenciamento de energia. Com exceção das solicitações internas de controle de dispositivo, a maioria dessas rotinas de expedição fornece uma função mínima. Quando o driver de classe HID chama essas rotinas de expedição, ele passa o objeto de driver do minidriver e o objeto de dispositivo funcional (FDO).
IRP_MJ_CREATE
Em conformidade com os requisitos do WDM, o driver de classe HID e um minidriver HID fornecem uma rotina de processamento 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 criação de expediçã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 envio de fechamento nunca é executada.
IRP_MJ_DEVICE_CONTROL
Um minidriver HID não precisa de uma rotina de despacho para solicitações de controle do 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 de controle de dispositivo internas para acessar o dispositivo de entrada subjacente.
O minidriver HID manipula essas solicitações de maneira específica do dispositivo.
IRP_MJ_SYSTEM_CONTROL
Um minidriver HID deve fornecer uma rotina de despacho para solicitações de controle do sistema. No entanto, um minidriver HID tem apenas a função de repassar solicitações de controle do sistema descendo na pilha de dispositivos da seguinte maneira:
Ignorar a localização da pilha IRP atual
Enviar a solicitação para baixo na pilha de dispositivos do FDO
IRP_MJ_PNP
Um minidriver HID deve fornecer um procedimento de despacho para solicitações Plug and Play.
O driver de classe HID faz todo o processamento Plug and Play associado ao FDO. Quando o driver de classe HID processa uma solicitação Plug and Play, ele chama a rotina de expedição Plug and Play do minidriver HID.
Rotina de despacho Plug and Play do minidriver HID:
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.
Realiza o processamento específico do dispositivo associado a certas 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, parado ou sendo removido.
IRP_MJ_POWER
O minidriver HID deve fornecer uma rotina de despacho para solicitações de energia. No entanto, o driver de classe HID gerencia 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.