Configuración de controladores de clase de teclado y mouse

Nota

Este tema es para desarrolladores que configuran controladores de clase de mouse y teclado. Si desea corregir un mouse o un teclado, consulte:

Los teclados y ratones que no son HID pueden conectarse a través de varios autobuses heredados, pero siguen usando el mismo controlador de clase. Esta sección contiene detalles sobre los propios controladores de clase. En las secciones siguientes se detallan los controladores.

En este tema se describe la configuración física típica de los dispositivos de teclado y mouse en Microsoft Windows 2000 y versiones posteriores.

En las ilustraciones siguientes se muestran dos configuraciones comunes que emplean un solo teclado y un solo mouse.

Diagrama que ilustra dos configuraciones que emplean un solo teclado y un solo mouse.

La figura de la izquierda muestra un teclado y un mouse conectado a un bus del sistema a través de controladores independientes. Una configuración típica consta de un teclado de estilo PS/2 operado a través de un controlador i8042, y un mouse de estilo serie operado a través de un controlador de puerto serie.

La siguiente información adicional es importante para los fabricantes de teclado y mouse:

  • La pila del sistema operativo abre los teclados en modo exclusivo por motivos de seguridad.
  • Windows admite la conexión simultánea de más de un dispositivo de teclado y mouse.
  • Windows no admite el acceso independiente de un cliente a cada dispositivo.

Características del controlador de clase

En este tema se describen las características de los siguientes controladores de clase del sistema de Microsoft Windows 2000 y versiones posteriores:

  • Kbdclass, el controlador de clase para dispositivos de GUID_CLASS_KEYBOARD clase de dispositivo

  • Mouclass, el controlador de clase para dispositivos de GUID_CLASS_MOUSE clase de dispositivo

Kbdclass implementa el servicio Kbdclass y su imagen ejecutable es kbdclass.sys.

Mouclass implementa el servicio Mouclass y su imagen ejecutable se mouclass.sys.

Kbdclass y Mouclass cada característica:

  • Operación genérica e independiente del hardware de la clase de dispositivo.

  • Plug and Play, administración de energía e Instrumental de administración de Windows (WMI).

  • Operación de dispositivos heredados.

  • Operación simultánea de más de un dispositivo.

  • Conexión de una rutina de devolución de llamada de servicio de clase que un controlador de función usa para transferir datos desde el búfer de datos de entrada del dispositivo al búfer de datos del controlador de clase.

Configuración de objetos de dispositivo

En la ilustración siguiente se muestra la configuración de objetos de dispositivo para un dispositivo de Plug and Play teclado y mouse de estilo PS/2. Cada controlador de clase crea un objeto de dispositivo de filtro de clase de nivel superior (DO de filtro) que está asociado a un objeto de dispositivo de función (FDO) a través de un filtro de dispositivo de nivel superior opcional. Un controlador de filtro de dispositivo de nivel superior crea el filtro de dispositivo de nivel superior DO. I8042prt crea la función DO y la asocia a un objeto de dispositivo físico (PDO) creado por el controlador de bus raíz.

Diagrama que ilustra la configuración de objetos de dispositivo para un dispositivo de teclado y mouse de estilo ps/2 de plug and play.

Teclado PS/2

La pila del controlador de teclado consta de lo siguiente.

  • Kbdclass, el controlador de filtro de clase de teclado de nivel superior
  • Uno o varios controladores de filtro de teclado opcionales de nivel superior
  • I8042prt, el controlador de función

Ratón PS/2

La pila del controlador del mouse consta de lo siguiente.

  • Mouclass, el controlador de filtro de clase de mouse de nivel superior
  • Uno o varios controladores de filtro de mouse de nivel superior opcionales
  • I8042prt, el controlador de función

Kbdclass y Mouclass pueden admitir más de un dispositivo en dos modos diferentes. En el modo uno a uno, cada dispositivo tiene una pila de dispositivos independiente. El controlador de clase crea y asocia una clase DO independiente a cada pila de dispositivos. Cada pila de dispositivos tiene su propio estado de control y búfer de entrada. El subsistema De Microsoft Win32 accede a la entrada desde cada dispositivo a través de un objeto de archivo único.

En el modo grandmaster, el controlador de clase opera todos los dispositivos de la siguiente manera:

  • El controlador de clase crea una do de clase grandmaster que representa todos los dispositivos y una clase subordinada DO para cada dispositivo.

    El controlador de clase asocia una clase subordinada DO a cada pila de dispositivos. Debajo de la clase subordinada DO, la pila de dispositivos es la misma que la creada en el modo uno a uno.

  • El DO de la clase grandmaster controla el funcionamiento de todos los DO subordinados.

  • El subsistema Win32 accede a toda la entrada del dispositivo a través del objeto de archivo que representa el dispositivo de clase grandmaster.

  • Toda la entrada del dispositivo se almacena en búfer en la cola de datos del gran maestro.

  • El gran maestro mantiene un único estado de dispositivo global.

Kbdclass y Mouclass funcionan en el modo uno a uno si su valor de entrada del Registro ConnectMultiplePorts está establecido en 0x00 (bajo la clave HKLM\Services\CurrentControlSet\<class service>\Parameters, donde el servicio de clase es Kbdclass o Mouclass). De lo contrario, Kbdclass y Mouclass funcionan en modo grandmaster.

Abrir y cerrar mediante el controlador de clase

El subsistema De Microsoft Win32 abre todos los dispositivos de teclado y mouse para su uso exclusivo. Para cada clase de dispositivo, el subsistema Win32 trata la entrada de todos los dispositivos como si la entrada provenía de un único dispositivo de entrada. Una aplicación no puede solicitar recibir la entrada de un solo dispositivo determinado.

El subsistema Win32 abre dinámicamente Plug and Play dispositivos de entrada después de recibir una notificación del administrador de Plug and Play de que está habilitada una interfaz de dispositivo GUID_CLASS_KEYBOARD o GUID_CLASS_MOUSE. El subsistema Win32 cierra Plug and Play dispositivos después de recibir una notificación de que se deshabilita una interfaz abierta. El subsistema Win32 también abre dispositivos heredados por nombre (por ejemplo, "\Device\KeyboardLegacyClass0"). Tenga en cuenta que una vez que el subsistema Win32 abre correctamente un dispositivo heredado, no puede determinar si el dispositivo se quita físicamente más adelante.

Una vez que Kbdclass y Mouclass reciben una solicitud de creación, realizan lo siguiente para Plug and Play y la operación heredada:

  • operación de Plug and Play

    Si el dispositivo está en el estado Plug and Play iniciado, el controlador de clase envía el IRP_MJ_CREATE solicitud a la pila de controladores. De lo contrario, el controlador de clase completa la solicitud sin enviar la solicitud a la pila del controlador. El controlador de clase establece el archivo de confianza que tiene acceso de lectura al dispositivo. Si hay un dispositivo grandmaster, el controlador de clase envía una solicitud de creación a todos los puertos asociados a los dispositivos de clase subordinados.

  • Operación heredada

    El controlador de clase envía una solicitud de control de dispositivo interno al controlador de puerto para habilitar el dispositivo.

Conexión de una devolución de llamada de servicio a un dispositivo

Los controladores de clase deben conectar su servicio de clase a un dispositivo antes de que se pueda abrir el dispositivo. Los controladores de clase conectan su servicio de clase después de adjuntar una clase DO a una pila de dispositivos. El controlador de función usa la devolución de llamada del servicio de clases para transferir datos de entrada de un dispositivo a la cola de datos de clase para el dispositivo. La rutina de finalización de distribución de ISR del controlador de función para un dispositivo llama a la devolución de llamada del servicio de clase. Kbdclass proporciona la devolución de llamada de servicio de clase KeyboardClassServiceCallback y Mouclass proporciona la devolución de llamada de servicio de clase MouseClassServiceCallback.

Un proveedor puede modificar el funcionamiento de una devolución de llamada de servicio de clase instalando un controlador de filtro de nivel superior para un dispositivo. El controlador de filtro de teclado de ejemplo Kbfiltr define el KbFilter_ServiceCallback devolución de llamada y el controlador de filtro de mouse de ejemplo Moufiltr define la devolución de llamada MouFilter_ServiceCallback . Las devoluciones de llamada del servicio de filtro de ejemplo se pueden configurar para modificar los datos de entrada que se transfieren desde el búfer de entrada del puerto de un dispositivo a la cola de datos de clase. Por ejemplo, la devolución de llamada del servicio de filtro puede eliminar, transformar o insertar datos.

Las devoluciones de llamada de servicio de filtro y clase se conectan de la siguiente manera:

  • El controlador de clase envía una solicitud de conexión de dispositivo interna a la pila del dispositivo (IOCTL_INTERNAL_KEYBOARD_CONNECT o IOCTL_INTERNAL_MOUSE_CONNECT). Los datos de conexión de clase se especifican mediante una estructura de CONNECT_DATA que incluye un puntero al objeto de dispositivo de clase y un puntero a la devolución de llamada del servicio de clase.

  • Una vez que el controlador de filtro recibe la solicitud de conexión, guarda una copia de los datos de conexión de clase y reemplaza los datos de conexión de la solicitud por los datos de conexión de filtro. Los datos de conexión de filtro especifican un puntero al objeto de dispositivo de filtro y un puntero a la devolución de llamada del servicio de controlador de filtro. A continuación, el controlador de filtro envía la solicitud de conexión filtrada al controlador de función.

Las devoluciones de llamada de servicio de filtro y clase se llaman de la siguiente manera:

  • El controlador de función usa los datos de conexión de filtro para realizar la devolución de llamada inicial a la devolución de llamada del servicio de filtro.

  • Después de filtrar los datos de entrada, la devolución de llamada del servicio de filtro usa los datos de conexión de clase que guardó para realizar una devolución de llamada a la devolución de llamada del servicio de clase.

Consulta y establecimiento de un dispositivo de teclado

I8042prt admite las siguientes solicitudes de control de dispositivos internos para consultar información sobre un dispositivo de teclado y establecer parámetros en un dispositivo de teclado:

IOCTL_KEYBOARD_QUERY_ATTRIBUTES

IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION

IOCTL_KEYBOARD_QUERY_INDICATORS

IOCTL_KEYBOARD_QUERY_TYPEMATIC

IOCTL_KEYBOARD_SET_INDICATORS

IOCTL_KEYBOARD_SET_TYPEMATIC

Para obtener más información sobre todas las solicitudes de control de dispositivos de teclado, vea Referencia de dispositivos de interfaz humana.

Examinar el asignador de código para teclados

En los sistemas operativos Microsoft Windows, los códigos de examen compatibles con PS/2 proporcionados por un dispositivo de entrada se convierten en claves virtuales, que se propagan a través del sistema en forma de mensajes de Windows. Si un dispositivo genera un código de examen incorrecto para una clave determinada, se enviará el mensaje de clave virtual incorrecto. Esto se puede corregir escribiendo un controlador de filtro que analiza los códigos de examen generados por el firmware y modifica el código de examen incorrecto a uno comprendido por el sistema. Sin embargo, se trata de un proceso tedioso y a veces puede provocar problemas graves, si existen errores en el controlador de filtro de nivel de kernel.

Windows 2000 y Windows XP incluyen un nuevo asignador de código de examen, que proporciona un método que permite la asignación de códigos de examen. Las asignaciones de código de examen para Windows se almacenan en la siguiente clave del Registro:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout

Nota También hay una tecla Diseños de teclado (observe el formato plural) en la tecla Control, pero esa tecla no debe modificarse.

En la tecla Diseño del teclado , se debe agregar el valor del mapa scancode . Este valor es de tipo REG_BINARY (formato little Endian) y tiene el formato de datos especificado en la tabla siguiente.

Desplazamiento inicial (en bytes) Tamaño (en bytes) Datos
0 4 Encabezado: información de versión
4 4 Encabezado: marcas
8 4 Encabezado: número de asignaciones
12 4 Asignación individual
... ... ...
Últimos 4 bytes 4 Terminador nulo (0x00000000)

La primera y la segunda información de encabezado del almacén de DWORDS y deben establecerse en todos los ceros para la versión actual del asignador de código de examen. La tercera entrada DWORD contiene un recuento del número total de asignaciones siguientes, incluida la asignación de terminación null. Por lo tanto, el recuento mínimo sería 1 (sin asignaciones especificadas). Las asignaciones individuales siguen el encabezado . Cada asignación es un DWORD de longitud y se divide en dos campos de longitud de WORD. Cada campo WORD almacena el código de examen de una clave que se va a asignar.

Una vez almacenado el mapa en el Registro, el sistema debe reiniciarse para que las asignaciones surtan efecto. Tenga en cuenta que si la asignación de un código de examen es necesaria en una teclapress, el paso se realiza en modo de usuario justo antes de convertir el código de examen en una clave virtual. Realizar esta conversión en modo de usuario puede presentar ciertas limitaciones, como la asignación no funciona correctamente al ejecutarse en Terminal Services.

Para quitar estas asignaciones, quite el valor del Registro de mapa de Scancode y reinicie.

Ejemplo 1

A continuación se presenta un ejemplo. Para intercambiar la tecla CTRL izquierda con la tecla CAPS LOCK, use un editor del Registro (preferiblemente Regedt32.exe) para modificar la clave de mapa de Scancode con el siguiente valor:

00000000 00000000 03000000 3A001D00 1D003A00 00000000

La tabla siguiente contiene estas entradas divididas en campos DWORD y los bytes intercambiados.

Valor: Interpretación

0x00000000: Encabezado: Versión. Establezca en todos los ceros.

0x00000000: Encabezado: Marcas. Establezca en todos los ceros.

0x00000003: tres entradas del mapa (incluida la entrada null).

0x001D003A: tecla CTRL izquierda -> BLOQUEO DE MAYÚSCULAS (0x1D -> 0x3A).

0x003A001D: BLOQUEO DE MAYÚSCULAS:> tecla CTRL izquierda (0x3A-> 0x1D).

0x00000000: terminador nulo.

Ejemplo 2

También es posible agregar una tecla que no esté disponible con carácter general en un teclado o quitar una tecla que nunca se use. En el ejemplo siguiente se muestra el valor almacenado en Scancode Map para quitar la tecla CTRL derecha y cambiar la funcionalidad de la tecla ALT derecha para que funcione como una tecla silenciada:

00000000 00000000 03000000 00001DE0 20E038E0 00000000

La tabla siguiente contiene estas entradas divididas en campos DWORD y los bytes intercambiados.

Valor: Interpretación

0x00000000: Encabezado: Versión. Establezca en todos los ceros.

0x00000000: Encabezado: Marcas. Establezca en todos los ceros.

0x00000003: tres entradas del mapa (incluida la entrada null).

0xE01D0000: quite la tecla CTRL derecha (0xE01D 0x00> ).

0xE038E020: tecla ALT derecha -> Tecla silenciar (0xE038 -> 0xE020).

0x00000000: terminador nulo.

Una vez generados los datos necesarios, se puede insertar en el registro de varias maneras.

  • Se puede generar un archivo .reg que se pueda incorporar fácilmente en el registro del sistema mediante un editor del Registro.
  • También se puede crear un archivo .inf con una sección [AddReg] que contiene la información del Registro que se va a agregar.
  • Regedt32.exe se puede usar para agregar manualmente la información al Registro.

El asignador de código de examen tiene varias ventajas y desventajas.

Entre las ventajas se incluyen:

  • El asignador se puede usar como una corrección sencilla para corregir los errores de firmware.
  • Las teclas usadas con frecuencia se pueden agregar al teclado modificando el mapa en el Registro. Las claves que no se usan a menudo (por ejemplo, la tecla CTRL derecha) se pueden asignar a null (quitadas) o intercambiarse por otras claves.
  • Las ubicaciones clave se pueden modificar fácilmente. Los usuarios pueden personalizar fácilmente la ubicación de las claves usadas con frecuencia para su beneficio.

Se reconocen las siguientes desventajas:

  • Una vez que el mapa se almacena en el registro, se requiere un reinicio del sistema para activarlo.
  • Las asignaciones almacenadas en el registro funcionan en el nivel del sistema y se aplican a todos los usuarios. Estas asignaciones no se pueden establecer para que funcionen de forma diferente según el usuario actual.
  • La implementación actual restringe la funcionalidad del mapa de modo que las asignaciones siempre se aplican a todos los teclados conectados al sistema. Actualmente no es posible crear un mapa por teclado.

Consulta de un dispositivo del mouse

I8042prt admite la siguiente solicitud de control de dispositivo interno para consultar información sobre un dispositivo del mouse:

IOCTL_MOUSE_QUERY_ATTRIBUTES

Para obtener más información sobre todas las solicitudes de control de dispositivos del mouse, vea Referencia de dispositivos de interfaz humana.

Configuración del Registro asociada con el controlador de clase mouse

A continuación se muestra una lista de claves del Registro asociadas al controlador de clase del mouse.

[Clave: HKLM\SYSTEM\CurrentControlSet\Services\Mouclass\Parameters]

  • MaximumPortsServiced : no se usa en Windows XP y versiones posteriores. Solo para Windows NT4.
  • PointerDeviceBaseName : especifica el nombre base de los objetos de dispositivo creados por el controlador de dispositivo de clase mouse.
  • ConnectMultiplePorts : determina si hay uno o varios objetos de dispositivo de puerto para cada objeto de dispositivo de clase. Esta entrada se usa principalmente por los controladores de dispositivos.
  • MouseDataQueueSize : especifica el número de eventos del mouse almacenados en búfer por el controlador del mouse. También se usa para calcular el tamaño del búfer interno del controlador del mouse en el grupo de memoria no paginado.

Dispositivos apuntando absolutos

En el caso de los dispositivos de tipo GUID_CLASS_MOUSE, el controlador de función de un dispositivo:

  • Controla la entrada específica del dispositivo.

  • Crea las estructuras MOUSE_INPUT_DATA requeridas por MouseClassServiceCallback.

  • Transfiere MOUSE_INPUT_DATA estructuras a la cola de datos Mouclass mediante una llamada a MouseClassServiceCallback en su rutina de finalización de distribución de ISR.

Para un dispositivo señalador absoluto, el controlador de función del dispositivo debe establecer los miembros LastX, LastY y Flags de las estructuras de MOUSE_INPUT_DATA de la siguiente manera:

  • Además de dividir el valor de entrada del dispositivo por la capacidad máxima del dispositivo, el controlador escala el valor de entrada del dispositivo por 0xFFFF:

    LastX = ((device input x value) * 0xFFFF ) / (Maximum x capability of the device)
    LastY = ((device input y value) * 0xFFFF ) / (Maximum y capability of the device)
    
  • El controlador establece la marca MOUSE_MOVE_ABSOLUTE en Marcas.

  • Si el Administrador de ventanas debe asignar la entrada a un escritorio virtual completo, el controlador establece la marca MOUSE_VIRTUAL_DESKTOP en Marcas. Si no se establece la marca MOUSE_VIRTUAL_DESKTOP, El Administrador de ventanas asigna la entrada solo al monitor principal.

Lo siguiente especifica, por tipo de dispositivo, cómo se implementan estos requisitos especiales para un dispositivo señalador absoluto:

  • Dispositivos HID:

    Mouhid, el controlador de funciones de Windows para dispositivos de mouse HID, implementa estos requisitos especiales automáticamente.

  • Dispositivos de estilo PS/2:

    Se requiere un controlador de filtro de nivel superior. El controlador de filtro proporciona una devolución de llamada de IsrHook y una devolución de llamada de servicio de clase. I8042prt llama al IsrHook para controlar la entrada de dispositivo sin procesar y llama a la devolución de llamada del servicio de clase de filtro para filtrar la entrada. La devolución de llamada del servicio de clase filter, a su vez, llama a MouseClassServiceCallback. La combinación de la devolución de llamada de IsrHook y la devolución de llamada del servicio de clase controla la entrada específica del dispositivo, crea las estructuras MOUSE_INPUT_DATA necesarias, escala los datos de entrada del dispositivo y establece la marca MOUSE_MOVE_ABSOLUTE.

  • Plug and Play dispositivos de puerto COM enumerados por Serenum:

    Se requiere un controlador de función Plug and Play. El controlador de función crea las estructuras MOUSE_INPUT_DATA necesarias, escala los datos de entrada del dispositivo y establece la marca MOUSE_MOVE_ABSOLUTE antes de llamar a MouseClassServiceCallback.

  • Dispositivos de puerto COM que no son Plug and Play:

    Se requiere un controlador de función específico del dispositivo. El controlador de función crea las estructuras MOUSE_INPUT_DATA necesarias, escala los datos de entrada del dispositivo y establece la marca MOUSE_MOVE_ABSOLUTE antes de llamar a MouseClassServiceCallback.

  • Dispositivo en un bus no admitido:

    Se requiere un controlador de función específico del dispositivo. El controlador de función crea las estructuras MOUSE_INPUT_DATA necesarias, escala los datos de entrada del dispositivo y establece la marca MOUSE_MOVE_ABSOLUTE antes de llamar a MouseClassServiceCallback.