Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se describen los minidrivers y el controlador de clase HID.
Para obtener más información, consulte Creación de minidriveres HID de WDF.
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 de 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 de las colecciones HID consta de los IOCTLs 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 estándar del controlador 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 proporcionado 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.
Vinculación de un minidriver a HIDClass
Un minidriver HID enlaza su operación al controlador de clase HID llamando a HidRegisterMinidriver para registrarse en 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 de 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 DRIVER_INITIALIZE. Antes de registrarse con el controlador de clase HID, el minidriver HID establece estos puntos de entrada.
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:
Envíe rutinas para las siguientes solicitudes de E/S:
El proceso de registro también asigna memoria para la extensión del dispositivo HID Mind River. Aunque el controlador de clase HID asigna la memoria, solo el minidriver HID utiliza esta extensión de dispositivo.
Comunicación con un minidriver HID
El controlador de clase HID se comunica con un minidriver HID mediante una llamada al DRIVER_ADD_DEVICE, DRIVER_UNLOAD y rutinas de envío del minidriver HID de la siguiente manera:
Invocar 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 una inicialización específica interna del dispositivo y, si tiene éxito, devuelve STATUS_SUCCESS. Si la rutina del AddDevice minidriver HID no se realiza correctamente, el controlador de clase HID elimina el FDO y devuelve el estado devuelto por la rutina del AddDevice minidriver HID.
Llamar a la rutina Unload
Cuando se llama a la rutina De descarga 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 De descarga del minidriver HID.
Llamar a las rutinas de distribución
Para el funcionamiento de un dispositivo, el controlador de la clase HID se encarga principalmente de llamar a la rutina de distribución del minidriver HID para las solicitudes internas de control del dispositivo.
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 distribución 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 controlador miniatura de transporte HID abstrae la operación de un bus de hardware o puerto al cual se conecta tu dispositivo de entrada.
Los mini controladores HID se pueden crear usando uno de los siguientes frameworks:
- UMDF: marco de controlador del 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 controladores, visite las secciones siguientes:
- Minicontrolador HID basado en KMDF, consulte Creación de minicontroladores HID basados en marcos.
- Minidriver HID basado en UMDF, consulte Creating WDF HID Minidrivers (Creación de minidriveres HID WDF)
En la sección siguiente se habla sobre registrar un minidriver HID basado en WDM, pero mucho de esto también se aplica a un controlador basado en Frameworks KMDF. Todos los mini controladores HID deben registrarse con el controlador de clase HID, y el controlador de clase HID se comunica con el mini controlador llamando a las rutinas estándar del mini controlador.
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:
- Registro de un minidriver HID
- Extensión de minidriver HID
- Uso de la estructura HID_DEVICE_EXTENSION
- Rutinas estándar de minidriver
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 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 HID_MINIDRIVER_REGISTRATION . La estructura especifica:
- Revisión HID
- El objeto controlador del minidriver HID
- 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 para cada dispositivo y solo la utiliza 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 se especifica mediante el miembro DeviceExtensionSize en una estructura HID_MINIDRIVER_REGISTRATION.
Uso de la estructura HID_DEVICE_EXTENSION
Un minidriver HID debe usar una estructura HID_DEVICE_EXTENSION como diseño para la extensión de 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 de dispositivos 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 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 específica del dispositivo, declarada por un mini controlador HID.
Del mismo modo, un minidriver HID puede obtener un puntero al PDO del dispositivo de entrada y la parte superior de la pila de dispositivos debajo del FDO del dispositivo de entrada.
Cuando un minidriver HID envía un IRP hacia abajo en la pila de dispositivos, debe usar NextDeviceObject como el objeto de dispositivo de destino.
Rutinas estándar de minidriver
Un minidriver HID debe proporcionar las siguientes rutinas de soporte estándar de controladores:
- Rutina DriverEntry del minicontrolador HID
- Rutina AddDevice del minidriver HID
- Rutina de descarga de minidriver HID
Un minidriver HID también debe admitir las rutinas de distribución 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 necesarios del controlador en el objeto controlador del minidriver HID.
Llama a HidRegisterMinidriver para registrar el minidriver HID con el controlador de clase HID.
Tiene configuraciones específicas del dispositivo que son usadas solo por 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 sus dispositivos secundarios (colecciones HID).
El controlador de clase HID llama a la rutina DRIVER_ADD_DEVICE para que la rutina AddDevice del minidriver HID pueda realizar la inicialización interna específica del dispositivo.
Los parámetros que se pasan a la rutina DRIVER_ADD_DEVICE del controlador HID son el objeto controlador del 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.
La rutina del minidriver HID DRIVER_ADD_DEVICE obtiene un puntero a la extensión del dispositivo del 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 es utilizada solo por 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 Plug and Play.
Rutina de descarga
La rutina Unload del controlador de clase HID llama a la rutina de minidriver HID DRIVER_UNLOAD . Un minidriver HID libera los recursos internos asignados por el minidriver.
Rutinas de distribución
Un minidriver HID debe proporcionar las siguientes rutinas de despacho: crear, cerrar, control interno del dispositivo, control del sistema, Plug and Play y administración de energía. Excepto para 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 de 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, no se puede abrir el FDO. 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
Conforme a 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 cierre de envío.
IRP_MJ_DEVICE_CONTROL
Un minidriver HID no necesita una rutina de distribución 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 despacho para las solicitudes de control de dispositivos internos que admite las solicitudes descritas en IOCTLs 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 maneja estas solicitudes de una manera específica del dispositivo.
IRP_MJ_SYSTEM_CONTROL (Control del sistema IRP_MJ)
Un minidriver HID debe proporcionar una rutina de distribución para las solicitudes de control del sistema. Sin embargo, solo se requiere que un minidriver HID pase las solicitudes de control del sistema a través de la pila del dispositivo de la siguiente manera:
Omitir la posición actual en la pila de 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 las solicitudes Plug and Play.
El controlador de clase HID realiza todo el procesamiento plug and play asociado al FDO. Cuando el controlador de clase HID procesa una solicitud Plug and Play, llama a la rutina de distribución Plug and Play del minidriver HID.
Una rutina de despacho de minidriver HID Plug and Play:
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 de dispositivos, según corresponda para cada tipo de solicitud.
Realiza el procesamiento específico del dispositivo asociado a ciertas solicitudes para actualizar la información sobre el estado del FDO.
Por ejemplo, el minidriver podría actualizar el estado Plug and Play del FDO (en particular, si el FDO está iniciado, detenido o en proceso de ser eliminado).
IRP_MJ_POWER
El minidriver HID debe proporcionar una rutina de distribución 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 energía hacia abajo en la pila de dispositivos del FDO de esta manera:
Omite la ubicación actual en la pila de IRP.
Inicia el siguiente IRP de energía.
Envía el IRP de energía a la pila de dispositivos del FDO.
Normalmente, el minidriver HID pasa solicitudes de alimentación por la pila del dispositivo sin procesamiento adicional.