Настройка драйверов для классов клавиатуры и мыши

Примечание

Этот раздел предназначен для разработчиков, которые настраивают драйверы для классов клавиатуры и мыши. Если вы хотите исправить мышь или клавиатуру, см. следующие статьи:

Клавиатуры и мыши, отличные от HID, могут подключаться через несколько устаревших автобусов, но по-прежнему использовать одного и того же класса водителя. В этом разделе содержатся сведения о самих драйверах класса. В следующих разделах подробно описаны контроллеры.

В этом разделе описывается типичная физическая конфигурация клавиатуры и мыши в Microsoft Windows 2000 и более поздних версий.

На следующих рисунках показаны две распространенные конфигурации, в которых используется одна клавиатура и одна мышь.

Схема, иллюстрирующая две конфигурации, использующие одну клавиатуру и одну мышь.

На рисунке слева показаны клавиатура и мышь, подключенные к системной шине через независимые контроллеры. Типичная конфигурация состоит из клавиатуры в стиле PS/2, работающей через контроллер i8042, и последовательной мыши, работающей через контроллер последовательного порта.

Следующие дополнительные сведения важны для производителей клавиатуры и мыши:

  • Стек операционной системы открывает клавиатуры в монопольном режиме по соображениям безопасности
  • Windows поддерживает одновременное подключение нескольких устройств клавиатуры и мыши.
  • Windows не поддерживает независимый доступ клиента к каждому устройству.

Функции драйвера класса

В этом разделе описываются функции следующих драйверов системного класса Microsoft Windows 2000 и более поздних версий:

  • Kbdclass, драйвер класса для устройств GUID_CLASS_KEYBOARD класса устройств.

  • Mouclass, драйвер класса для устройств GUID_CLASS_MOUSE класса устройств

Kbdclass реализует службу Kbdclass, а ее исполняемый образ kbdclass.sys.

Mouclass реализует службу Mouclass, и ее исполняемый образ mouclass.sys.

Kbdclass и Mouclass каждый компонент:

  • Универсальная и аппаратно-независимая операция класса устройства.

  • Plug and Play, управление питанием и инструментарий управления Windows (WMI).

  • Работа устаревших устройств.

  • Одновременная работа нескольких устройств.

  • Подключение подпрограммы обратного вызова службы класса , используемой драйвером-функцией для передачи данных из буфера входных данных устройства в буфер данных драйвера класса.

Настройка объектов устройств

На следующем рисунке показана конфигурация объектов устройств для Plug and Play клавиатуры и мыши в стиле PS/2. Каждый драйвер класса создает объект устройства фильтра класса верхнего уровня (фильтр DO), который присоединяется к объекту устройства-функции (FDO) с помощью дополнительного фильтра устройств верхнего уровня DO. Драйвер фильтра устройств верхнего уровня создает фильтр устройств верхнего уровня DO. I8042prt создает функцию DO и присоединяет ее к объекту физического устройства (PDO), созданному драйвером корневой шины.

Схема, иллюстрирующая конфигурацию объектов устройств для клавиатуры и мыши в стиле ps/2.

Клавиатура PS/2

Стек драйверов клавиатуры состоит из следующего.

  • Kbdclass, драйвер фильтра класса клавиатуры верхнего уровня.
  • Один или несколько дополнительных драйверов фильтра клавиатуры верхнего уровня
  • I8042prt, драйвер функции

Мышь PS/2

Стек драйверов мыши состоит из следующих компонентов.

  • Mouclass, драйвер фильтра класса мыши верхнего уровня
  • Один или несколько дополнительных драйверов фильтра мыши верхнего уровня
  • I8042prt, драйвер функции

Kbdclass и Mouclass могут поддерживать несколько устройств в двух разных режимах. В режиме "один к одному" каждое устройство имеет независимый стек устройств. Драйвер класса создает и присоединяет независимый класс DO к каждому стеку устройств. Каждый стек устройств имеет собственное состояние управления и входной буфер. Подсистема Microsoft Win32 получает доступ к входным данным с каждого устройства через уникальный объект файла.

В режиме гроссмейстера драйвер класса управляет всеми устройствами следующим образом:

  • Драйвер класса создает класс гроссмейстера DO , который представляет все устройства, и подчиненный класс DO для каждого устройства.

    Драйвер класса присоединяет подчиненный класс DO к каждому стеку устройств. Под подчиненным классом DO стек устройств совпадает с стеком устройств, созданным в режиме "один к одному".

  • Класс гроссмейстера DO управляет работой всех подчиненных DOS.

  • Подсистема Win32 получает доступ ко всем входным данным устройства через объект файла, представляющий устройство класса Grandmaster.

  • Все входные данные устройства помещается в буфер в очереди данных гроссмейстера.

  • Гроссмейстер поддерживает единое глобальное состояние устройства.

Kbdclass и Mouclass работают в режиме "один к одному", если для их значения в реестре ConnectMultiplePorts задано значение 0x00 (в разделе HKLM\Services\CurrentControlSet\<class service>\Parameters, где служба класса — Kbdclass или Mouclass). В противном случае Kbdclass и Mouclass работают в режиме гроссмейстера.

Открытие и закрытие с помощью драйвера класса

Подсистема Microsoft Win32 открывает все устройства клавиатуры и мыши для монопольного использования. Для каждого класса устройств подсистема Win32 обрабатывает входные данные со всех устройств так, как если бы входные данные поступили с одного устройства ввода. Приложение не может запросить получение входных данных только с одного конкретного устройства.

Подсистема Win32 динамически открывает Plug and Play устройства ввода после получения от диспетчера Plug and Play уведомлений о том, что интерфейс устройства GUID_CLASS_KEYBOARD или GUID_CLASS_MOUSE включен. Подсистема Win32 закрывается Plug and Play устройствах после получения уведомления о том, что открытый интерфейс отключен. Подсистема Win32 также открывает устаревшие устройства по имени (например, "\Device\KeyboardLegacyClass0"). Обратите внимание, что после успешного открытия устаревшего устройства подсистема Win32 не сможет определить, будет ли устройство в дальнейшем физически удалено.

После того как Kbdclass и Mouclass получат запрос на создание, они выполняют следующие действия для Plug and Play и устаревших операций:

  • Операция Plug and Play

    Если устройство находится в состоянии Plug and Play запущено, драйвер класса отправляет IRP_MJ_CREATE запрос вниз по стеку драйверов. В противном случае драйвер класса завершает запрос, не отправляя запрос вниз по стеку драйверов. Драйвер класса задает доверенный файл, имеющий доступ на чтение к устройству. При наличии устройства grandmaster драйвер класса отправляет запрос на создание на все порты, связанные с подчиненными устройствами класса.

  • Устаревшая операция

    Драйвер класса отправляет внутренний запрос на управление устройством драйверу порта, чтобы включить устройство.

Подключение обратного вызова службы к устройству

Драйверы классов должны подключить свою службу классов к устройству, прежде чем устройство можно будет открыть. Драйверы классов подключают свою службу классов после присоединения класса DO к стеку устройств. Драйвер функции использует обратный вызов службы класса для передачи входных данных с устройства в очередь данных класса для устройства. Подпрограмма завершения диспетчеризации ISR драйвера функции для устройства вызывает обратный вызов службы класса. Kbdclass предоставляет обратный вызов службы класса KeyboardClassServiceCallback, а Mouclass — обратный вызов службы класса MouseClassServiceCallback.

Поставщик может изменить операцию обратного вызова службы класса, установив драйвер фильтра верхнего уровня для устройства. Пример драйвера фильтра клавиатуры Kbfiltr определяет обратный вызов KbFilter_ServiceCallback , а пример драйвера фильтра мыши Moufiltr определяет обратный вызов MouFilter_ServiceCallback . Пример обратных вызовов службы фильтра можно настроить для изменения входных данных, передаваемых из буфера входных портов для устройства в очередь данных класса. Например, обратный вызов службы фильтров может удалять, преобразовывать или вставлять данные.

Обратные вызовы службы классов и фильтров подключаются следующим образом:

  • Драйвер класса отправляет запрос на подключение внутреннего устройства в стеке устройств (IOCTL_INTERNAL_KEYBOARD_CONNECT или IOCTL_INTERNAL_MOUSE_CONNECT). Данные подключения класса задаются структурой CONNECT_DATA, которая включает указатель на объект устройства класса и указатель на обратный вызов службы класса.

  • После того как драйвер фильтра получит запрос на подключение, он сохраняет копию данных класса connect и заменяет данные подключения запроса данными подключения фильтра. Данные подключения фильтра указывают указатель на объект устройства фильтра и указатель на обратный вызов службы драйвера фильтра. Затем драйвер фильтра отправляет отфильтрованный запрос на подключение к драйверу функции.

Обратные вызовы службы классов и фильтров вызываются следующим образом:

  • Драйвер функции использует данные подключения фильтра для выполнения первоначального обратного вызова службы фильтров.

  • После фильтрации входных данных обратный вызов службы фильтрации использует сохраненные данные подключения класса для обратного вызова службы класса.

Запрос и настройка устройства клавиатуры

I8042prt поддерживает следующие внутренние запросы управления устройствами для запроса сведений об устройстве клавиатуры и установки параметров на устройстве клавиатуры:

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

Дополнительные сведения обо всех запросах на управление устройствами с клавиатуры см. в справочнике по устройствам с интерфейсом пользователя.

Сканировать сопоставителя кода для клавиатур

В операционных системах Microsoft Windows коды сканирования, совместимые с PS/2, предоставляемые устройством ввода, преобразуются в виртуальные ключи, которые распространяются по системе в виде сообщений Windows. Если устройство выдает неправильный код сканирования для определенного ключа, будет отправлено неправильное сообщение виртуального ключа. Это можно исправить, написав драйвер фильтра, который анализирует коды сканирования, созданные встроенным ПО, и изменяет неправильный код сканирования на код, понятный системе. Однако это трудоемкий процесс, который иногда может привести к серьезным проблемам, если в драйвере фильтра на уровне ядра возникают ошибки.

Windows 2000 и Windows XP включают новый средство сопоставления кода сканирования, которое предоставляет метод, позволяющий сопоставлять коды сканирования. Сопоставления кода сканирования для Windows хранятся в следующем разделе реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout

Примечание Под клавишей Control также есть клавиша Раскладка клавиатуры (обратите внимание на форму множественного числа), но ее не следует изменять.

В сочетании с раскладкой клавиатуры необходимо добавить значение карты Scancode . Это значение имеет тип REG_BINARY (маленький формат Endian) и имеет формат данных, указанный в следующей таблице.

Смещение начала (в байтах) Размер (в байтах) Данные
0 4 Заголовок: сведения о версии
4 4 Заголовок: Флаги
8 4 Заголовок: число сопоставлений
12 4 Индивидуальное сопоставление
... ... ...
Последние 4 байта 4 Признак конца null (0x00000000)

В первом и втором DWORDS хранятся сведения о заголовке и должны быть заданы все нули для текущей версии модуля сопоставления кода сканирования. Третья запись DWORD содержит общее количество следующих сопоставлений, включая завершающееся сопоставление со значением NULL. Таким образом, минимальное число будет равно 1 (сопоставления не указаны). Отдельные сопоставления следуют за заголовком. Каждое сопоставление имеет одну длину DWORD и делится на два поля длины WORD. В каждом поле WORD хранится код сканирования для сопоставляемого ключа.

После сохранения сопоставления в реестре необходимо перезагрузить систему, чтобы сопоставления вступили в силу. Обратите внимание, что если сопоставление кода сканирования необходимо при нажатии клавиш, шаг выполняется в пользовательском режиме непосредственно перед преобразованием кода сканирования в виртуальный ключ. При выполнении этого преобразования в пользовательском режиме могут возникнуть определенные ограничения, например неправильное сопоставление при выполнении в службах терминалов.

Чтобы удалить эти сопоставления, удалите значение реестра Scancode Map и перезагрузите его.

Пример 1

Ниже приведен пример. Чтобы переключить левую клавишу CTRL на клавишу CAPS LOCK, используйте редактор реестра (желательно Regedt32.exe), чтобы изменить ключ Scancode Map следующим значением:

00000000 00000000 03000000 3A001D00 1D003A00 00000000

В следующей таблице содержатся эти записи, разбитые на поля DWORD и переключение байтов.

Значение: интерпретация

0x00000000: Заголовок: Версия. Задайте для всех нулей.

0x00000000: Заголовок: Флаги. Задайте для всех нулей.

0x00000003: три записи на карте (включая пустую запись).

0x001D003A: левая клавиша CTRL -> CAPS LOCK (0x1D -> 0x3A).

0x003A001D: CAPS LOCK — левая> клавиша CTRL (0x3A —> 0x1D).

0x00000000: признак конца null.

Пример 2

Кроме того, можно добавить общедоступную клавишу на клавиатуре или удалить ключ, который никогда не используется. В следующем примере показано значение, хранящееся в scancode Map для удаления правой клавиши CTRL и изменения функциональности правой клавиши ALT, чтобы она работала как клавиша отключения звука:

00000000 00000000 03000000 00001DE0 20E038E0 00000000

В следующей таблице содержатся эти записи, разбитые на поля DWORD и переключение байтов.

Значение: интерпретация

0x00000000: Заголовок: Версия. Задайте для всех нулей.

0x00000000: Заголовок: Флаги. Задайте для всех нулей.

0x00000003: три записи на карте (включая пустую запись).

0xE01D0000: снимите правую клавишу CTRL (0xE01D 0x00> ).

0xE038E020: правая клавиша ALT —> отключить клавишу (0xE038 —> 0xE020).

0x00000000: признак конца null.

После создания необходимых данных их можно вставить в реестр несколькими способами.

  • Можно создать REG-файл, который можно легко включить в системный реестр с помощью редактора реестра.
  • Inf-файл также можно создать с разделом [AddReg], который содержит добавляемые сведения реестра.
  • Regedt32.exe можно использовать для добавления сведений в реестр вручную.

Средство сопоставления кода сканирования имеет ряд преимуществ и недостатков.

Ниже перечислены преимущества.

  • Средство сопоставления можно использовать в качестве простого исправления для исправления ошибок встроенного ПО.
  • Часто используемые клавиши можно добавить на клавиатуру, изменив сопоставление в реестре. Ключи, которые не часто используются (например, правая клавиша CTRL), можно сопоставить со значением NULL (удалить) или обменять на другие ключи.
  • Ключевые расположения можно легко изменить. Пользователи могут легко настраивать расположение часто используемых ключей в своих интересах.

Распознаются следующие недостатки:

  • После сохранения сопоставления в реестре для ее активации требуется перезагрузка системы.
  • Сопоставления, хранящиеся в реестре, работают на уровне системы и применяются ко всем пользователям. Эти сопоставления не могут работать по-разному в зависимости от текущего пользователя.
  • Текущая реализация ограничивает функциональность карты таким образом, что сопоставления всегда применяются ко всем клавиатурам, подключенным к системе. В настоящее время невозможно создать карту для каждой клавиатуры.

Запрос устройства мыши

I8042prt поддерживает следующий внутренний запрос на управление устройством для запроса сведений об устройстве мыши:

IOCTL_MOUSE_QUERY_ATTRIBUTES

Дополнительные сведения обо всех запросах на управление устройствами мыши см. в разделе Справочник по устройствам с интерфейсом пользователя.

Параметры реестра, связанные с драйвером класса мыши

Ниже приведен список разделов реестра, связанных с драйвером класса мыши.

[Ключ: HKLM\SYSTEM\CurrentControlSet\Services\Mouclass\Parameters]

  • MaximumPortsServiced — не используется в Windows XP и более поздних версиях. Только для Windows NT4.
  • PointerDeviceBaseName — задает базовое имя для объектов устройства, созданных драйвером устройства класса мыши.
  • ConnectMultiplePorts — определяет, имеется ли один или несколько объектов устройства порта для каждого объекта устройства класса. Эта запись используется в основном драйверами устройств.
  • MouseDataQueueSize — указывает количество событий мыши, буферизуемых драйвером мыши. Он также используется при вычислении размера внутреннего буфера драйвера мыши в непагрегированного пуле памяти.

Абсолютные указывающие устройства

Для устройств типа GUID_CLASS_MOUSE драйвер функции устройства:

  • Обрабатывает входные данные для конкретного устройства.

  • Создает структуры MOUSE_INPUT_DATA , необходимые для MouseClassServiceCallback.

  • Передает MOUSE_INPUT_DATA структуры в очередь данных Mouclass, вызывая MouseClassServiceCallback в своей подпрограмме завершения диспетчеризации ISR.

Для абсолютно указывающего устройства драйвер функции устройства должен задать элементы LastX, LastY и Flags структур MOUSE_INPUT_DATA следующим образом:

  • Помимо деления входного значения устройства на максимальную возможность устройства, драйвер масштабирует входное значение устройства 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)
    
  • Драйвер устанавливает флаг MOUSE_MOVE_ABSOLUTE в разделе Флаги.

  • Если входные данные должны быть сопоставлены Диспетчером Окон со всем виртуальным рабочим столом, драйвер устанавливает флаг MOUSE_VIRTUAL_DESKTOP в разделе Флаги. Если флаг MOUSE_VIRTUAL_DESKTOP не установлен, Диспетчер окон сопоставляет входные данные только с основным монитором.

Ниже по типу устройства определяется, как реализуются эти специальные требования для абсолютного указывающего устройства.

  • Устройства HID:

    Mouhid, драйвер функции Windows для устройств с мышью HID, реализует эти специальные требования автоматически.

  • Устройства в стиле PS/2:

    Требуется драйвер фильтра верхнего уровня. Драйвер фильтра предоставляет обратный вызов IsrHook и обратный вызов службы класса. I8042prt вызывает IsrHook для обработки необработанных входных данных устройства, а также обратный вызов службы класса фильтра для фильтрации входных данных. Обратный вызов службы класса фильтра, в свою очередь, вызывает MouseClassServiceCallback. Сочетание обратного вызова IsrHook и обратного вызова службы класса обрабатывает входные данные для конкретного устройства, создает необходимые структуры MOUSE_INPUT_DATA, масштабирует входные данные устройства и устанавливает флаг MOUSE_MOVE_ABSOLUTE.

  • Plug and Play устройства com-портов, перечисленные Serenum:

    Требуется драйвер функции Plug and Play. Драйвер функции создает необходимые структуры MOUSE_INPUT_DATA, масштабирует входные данные устройства и устанавливает флаг MOUSE_MOVE_ABSOLUTE перед вызовом MouseClassServiceCallback.

  • Устройства, не относящиеся к Plug and Play COM-портам:

    Требуется драйвер функций для конкретного устройства. Драйвер функции создает необходимые структуры MOUSE_INPUT_DATA, масштабирует входные данные устройства и устанавливает флаг MOUSE_MOVE_ABSOLUTE перед вызовом MouseClassServiceCallback.

  • Устройство на неподдерживаемой шине:

    Требуется драйвер функций для конкретного устройства. Драйвер функции создает необходимые структуры MOUSE_INPUT_DATA, масштабирует входные данные устройства и устанавливает флаг MOUSE_MOVE_ABSOLUTE перед вызовом MouseClassServiceCallback.