Minidrivers y el controlador de clase HID

En este artículo se describen los minidrivers y el controlador de clase HID.

Para obtener más información, consulte Creación de minidrivers WDF HID.

Características operativas del controlador de clase HID

El controlador de clase HID realiza las siguientes operaciones:

  • Proporciona y administra la interfaz de nivel superior que usan los controladores de modo kernel y las aplicaciones en modo usuario para acceder a las colecciones HID que admite un dispositivo de entrada.

    El controlador de clase HID administra y enruta de forma transparente toda la comunicación entre los controladores de nivel superior y las aplicaciones y los dispositivos de entrada subyacentes que admiten colecciones HID. Administra los diferentes protocolos de datos que usan diferentes dispositivos de entrada y colas de entrada que admiten más de un archivo abierto en la misma colección HID.

    La interfaz de nivel superior a las colecciones HID consta de las ICTL del controlador de clase HID, las rutinas de soporte de HIDClass y las estructuras HIDClass.

  • Se comunica con un minidriver HID llamando a las rutinas de controlador estándar del minidriver.

  • Crea un objeto de dispositivo funcional (FDO) para dispositivos de entrada HIDClass enumerados por un controlador de puerto o bus de nivel inferior.

    Por ejemplo, el controlador de clase HID crea y administra las operaciones de un FDO que representa un dispositivo HID USB enumerado por la pila de controladores USB proporcionada por el sistema.

  • Proporciona la funcionalidad de un controlador de bus para los dispositivos secundarios (colecciones HID) compatibles con un dispositivo de entrada subyacente.

    El controlador de clase HID crea un objeto de dispositivo físico (PDO) para cada colección HID compatible con un dispositivo de entrada y administra la operación de la colección.

Enlace de un minidriver a HIDClass

Un minidriver HID enlaza su operación al controlador de clase HID llamando a HidRegisterMinidriver para registrarse con el controlador de clase HID. La operación de registro:

  • Guarda una copia de los puntos de entrada (punteros) en las rutinas de controlador estándar del minidriver HID en la extensión del dispositivo del controlador de clase HID.

    Un minidriver HID establece sus puntos de entrada en el objeto de controlador que el minidriver recibe como entrada en su rutina de DRIVER_INITIALIZE . El minidriver HID establece estos puntos de entrada antes de que se registre con el controlador de clase HID.

  • Restablece los puntos de entrada del objeto de controlador del minidriver a los puntos de entrada de las rutinas de controlador estándar proporcionadas por el controlador de clase HID.

El controlador de clase HID proporciona las siguientes rutinas de controlador estándar:

El proceso de registro también asigna memoria para la extensión de dispositivo de río mente HID. Aunque el controlador de clase HID asigna la memoria, solo el minidriver HID usa esta extensión de dispositivo.

Comunicación con un minidriver HID

El controlador de clase HID se comunica con un minidriver HID llamando al DRIVER_ADD_DEVICE, DRIVER_UNLOAD y rutinas de envío del minidriver HID de la siguiente manera:

Llamar a la rutina AddDevice

Cuando se llama a la rutina AddDevice del controlador de clase HID para crear un objeto de dispositivo funcional (FDO), el controlador de clase HID crea el FDO, lo inicializa y llama a la rutina AddDevice del minidriver HID. La rutina AddDevice del minidriver HID realiza la inicialización interna específica del dispositivo y, si se ejecuta correctamente, devuelve STATUS_SUCCESS. Si la rutina AddDevice del minidriver HID no se realiza correctamente, el controlador de clase HID elimina el FDO y devuelve el estado devuelto por la rutina AddDevice del minidriver HID.

Llamar a la rutina Unload

Cuando se llama a la rutina Unload del controlador de clase HID, el controlador de clase HID completa la liberación de todos los recursos asociados a FDO y llama a la rutina Unload del minidriver HID.

Llamar a las rutinas de distribución

Para operar un dispositivo, el controlador de clase HID llama principalmente a la rutina de distribución del minidriver HID para las solicitudes de control de dispositivos internos.

Cuando el administrador de E/S envía solicitudes al controlador de clase HID, el controlador de clase HID procesa la solicitud y llama a la rutina de envío correspondiente del minidriver HID.

El controlador de clase HID no envía las siguientes solicitudes al minidriver HID: crear, cerrar o controlar el dispositivo.

Funcionamiento de un minidriver HID

Un minidriver de transporte HID abstrae el funcionamiento de un bus de hardware o puerto al que se conecta el dispositivo de entrada.

Los minidrivers HID se pueden crear mediante uno de los marcos siguientes:

  • UMDF: marco de controlador en modo de usuario
  • KDMF: marco de controlador del modo kernel
  • WDF: Windows Driver Framework
  • WDM: modelo de controlador de Windows (heredado)

Microsoft recomienda usar una solución basada en marcos (KMDF o UMDF). Para obtener más información sobre cada uno de los modelos de controlador, visite las secciones siguientes:

En la sección siguiente se habla sobre cómo registrar un minidriver HID basado en WDM, pero gran parte de ello es pertinente para un controlador de marcos basados en KMDF. Todos los minidriver HID deben registrarse con el controlador de clase HID y el controlador de clase HID se comunica con el minidriver llamando a las rutinas de controlador estándar del minidriver.

Para obtener más información sobre la funcionalidad que un minidriver HID debe admitir en sus rutinas de controlador estándar, consulte las secciones siguientes:

Para obtener más información sobre el controlador de clase HID, vea Operación del minidriver HID.

Registro de un minidriver HID

Una vez que un minidriver HID completa toda la inicialización del controlador en su rutina de DRIVER_INITIALIZE , el minidriver HID enlaza su operación al controlador de clase HID llamando a HidRegisterMinidriver.

Cuando el minidriver HID se registra con el controlador de clase HID, usa una estructura de HID_MINIDRIVER_REGISTRATION . La estructura especifica:

  • Revisión hidrón
  • El objeto de controlador HID minidriver
  • Tamaño de una extensión de dispositivo minidriver HID
  • Si se sondean los dispositivos

Extensión de minidriver HID

Una extensión de dispositivo minidriver HID es específica del dispositivo y solo la usa un minidriver HID. El controlador de clase HID asigna la memoria para la extensión del dispositivo minidriver cuando el controlador de clase crea su extensión de dispositivo para un objeto de dispositivo funcional (FDO). El minidriver HID especifica el tamaño de su extensión de dispositivo cuando registra el minidriver con el controlador de clase HID. El tamaño lo especifica el miembro DeviceExtensionSize de una estructura de HID_MINIDRIVER_REGISTRATION .

Uso de la estructura HID_DEVICE_EXTENSION

Un minidriver HID debe usar una estructura de HID_DEVICE_EXTENSION como diseño para la extensión del dispositivo creada por el controlador de clase HID para un objeto de dispositivo funcional (FDO). El controlador de clase HID establece los miembros de esta estructura cuando inicializa el FDO. Un minidriver HID no debe cambiar la información de esta estructura.

Una estructura de HID_DEVICE_EXTENSION contiene los siguientes miembros:

  • PhysicalDeviceObject es un puntero al objeto de dispositivo físico (PDO) que representa el dispositivo de entrada subyacente.

  • NextDeviceObject es un puntero a la parte superior de la pila del dispositivo debajo del FDO.

  • MiniDeviceExtension es un puntero a la extensión del dispositivo minidriver HID.

Dado un puntero al FDO de un dispositivo de entrada, la siguiente macro de GET_MINIDRIVER_DEVICE_EXTENSION devuelve un puntero a una extensión de minidriver HID:

#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))

PDEVICE_EXTENSION es un puntero a una extensión de dispositivo específica del dispositivo declarada por un minidriver HID.

Del mismo modo, un minidriver HID puede obtener un puntero al PDO del dispositivo de entrada y la parte superior de la pila del dispositivo debajo del FDO del dispositivo de entrada.

Cuando un minidriver HID envía un IRP a la pila del dispositivo, debe usar NextDeviceObject como objeto de dispositivo de destino.

Rutinas de minidriver estándar

Un minidriver HID debe proporcionar las siguientes rutinas de compatibilidad con controladores estándar:

  • Rutina HID minidriver DriverEntry
  • Rutina AddDevice del minidriver HID
  • Rutina de descarga de minidriver HID

Un minidriver HID también debe admitir las rutinas de envío descritas en Rutinas de distribución Proporcionadas por un minidriver HID.

Rutina DriverEntry

La rutina DRIVER_INITIALIZE en un minidriver HID hace lo siguiente:

  • Crea un objeto de controlador para el par de controladores vinculados (controlador de clase HID y un minidriver HID).

  • Establece los puntos de entrada de controlador necesarios en el objeto de controlador HID minidriver.

  • Llama a HidRegisterMinidriver para registrar el minidriver HID con el controlador de clase HID.

  • Realiza configuraciones específicas del dispositivo que solo usan el minidriver HID.

Rutina AddDevice

El controlador de clase HID controla la creación e inicialización del objeto de dispositivo funcional (FDO) para un dispositivo de entrada subyacente. El controlador de clase HID también opera el FDO desde la perspectiva de la interfaz de nivel superior al dispositivo subyacente y a sus dispositivos secundarios (colecciones HID).

El controlador de clase HID DRIVER_ADD_DEVICE rutina llama a la rutina AddDevice del minidriver HID para que el minidriver pueda realizar la inicialización interna específica del dispositivo.

Los parámetros que se pasan a la rutina de minidriver HID DRIVER_ADD_DEVICE son el objeto de controlador de minidriver y el FDO. El controlador de clase HID pasa el FDO a la rutina AddDevice del minidriver, no al objeto de dispositivo físico para el dispositivo de entrada subyacente.

El minidriver HID DRIVER_ADD_DEVICE rutina obtiene un puntero a la extensión del dispositivo minidriver desde el FDO.

  • Normalmente, el minidriver HID DRIVER_ADD_DEVICE rutina hace lo siguiente:

  • Inicializa la extensión del dispositivo minidriver. La extensión del dispositivo solo la usa el minidriver.

  • Devuelve STATUS_SUCCESS. Si el minidriver devuelve un estado de error, el controlador de clase HID elimina el FDO y devuelve el estado de error al administrador de Plug and Play.

Rutina de descarga

La rutina Unload del controlador de clase HID llama a la rutina hid minidriver DRIVER_UNLOAD . Un minidriver HID libera los recursos internos asignados por el minidriver.

Rutinas de envío

Un minidriver HID debe proporcionar las siguientes rutinas de envío: crear, cerrar, controlar el dispositivo interno, el control del sistema, Plug and Play y la administración de energía. Excepto en el caso de las solicitudes de control de dispositivos internos, la mayoría de estas rutinas de envío proporcionan una función mínima. Cuando el controlador de clase HID llama a estas rutinas de distribución, pasa el objeto de controlador minidriver y el objeto de dispositivo funcional (FDO).

IRP_MJ_CREATE

Conforme a los requisitos de WDM, el controlador de clase HID y un minidriver HID proporcionan una rutina de envío para crear solicitudes. Sin embargo, el FDO no se puede abrir. El controlador de clase HID devuelve STATUS_UNSUCCESSFUL.

Un minidriver HID solo necesita proporcionar un código auxiliar. Nunca se llama a la rutina de envío de creación.

IRP_MJ_CLOSE

En cumplimiento con los requisitos de WDM, el controlador de clase HID y un minidriver HID deben proporcionar una rutina de envío para las solicitudes de cierre. Sin embargo, el FDO no se puede abrir. El controlador de clase HID devuelve STATUS_INVALID_PARAMETER_1.

Un minidriver HID solo necesita proporcionar un código auxiliar. Nunca se llama a la rutina de envío de cierre.

IRP_MJ_DEVICE_CONTROL

Un minidriver HID no necesita una rutina de envío para las solicitudes de control de dispositivos. El controlador de clase HID no pasa solicitudes de control de dispositivos a un minidriver.

IRP_MJ_INTERNAL_DEVICE_CONTROL

Un minidriver HID debe proporcionar una rutina de envío para las solicitudes de control de dispositivos internos que admiten las solicitudes descritas en IOPS de minidriver HID.

El controlador de clase HID usa principalmente solicitudes de control de dispositivos internos para acceder al dispositivo de entrada subyacente.

El minidriver HID controla estas solicitudes de forma específica del dispositivo.

IRP_MJ_SYSTEM_CONTROL

Un minidriver HID debe proporcionar una rutina de envío para las solicitudes de control del sistema. Sin embargo, solo se requiere un minidriver HID para pasar las solicitudes de control del sistema a la pila del dispositivo de la siguiente manera:

  • Omitir la ubicación actual de la pila irP

  • Envío de la solicitud a la pila de dispositivos del FDO

IRP_MJ_PNP

Un minidriver HID debe proporcionar una rutina de envío para Plug and Play solicitudes.

El controlador de clase HID realiza todo el procesamiento Plug and Play asociado al FDO. Cuando el controlador de clase HID procesa una solicitud de Plug and Play, llama a la rutina de envío del minidriver HID Plug and Play.

Un minidriver HID Plug and Play rutina de envío:

  • Controla el envío de la solicitud a la pila de dispositivos del FDO y la finalización de la solicitud en la forma de realizar la copia de seguridad de la pila del dispositivo, según corresponda para cada tipo de solicitud.

  • Realiza el procesamiento específico del dispositivo asociado a determinadas solicitudes para actualizar información sobre el estado del FDO.

    Por ejemplo, el minidriver podría actualizar el estado Plug and Play del FDO (en particular, si se inicia, detiene o se quita el FDO).

IRP_MJ_POWER

El minidriver HID debe proporcionar una rutina de envío para las solicitudes de alimentación. Sin embargo, el controlador de clase HID controla el procesamiento de energía para el FDO.

Conforme a los requisitos de WDM, un minidriver HID envía solicitudes de alimentación a la pila de dispositivos de FDO de esta manera:

  • Omite la ubicación actual de la pila irP.

  • Inicia el siguiente IRP de energía

  • Envía el IRP de alimentación a la pila de dispositivos del FDO.

Normalmente, el minidriver HID pasa solicitudes de alimentación a la pila del dispositivo sin procesamiento adicional.