Настройка драйверов классов клавиатуры и мыши - Windows drivers (2023)

  • Статья
  • Чтение занимает 11мин

Примечание

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

  • Проблемы с мышью, сенсорной панелью и клавиатурой в Windows
  • Устранение неполадок с беспроводной мышью, которая не работает правильно

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

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

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

Настройка драйверов классов клавиатуры и мыши - Windows drivers (1)

На рисунке слева показана клавиатура и мышь, подключенные к системной шине через независимые контроллеры. Типичная конфигурация состоит из клавиатуры в стиле 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).

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

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

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

    (Video) Как сделать Kernel Driver - Загрузка & Выгрузка

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

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

Настройка драйверов классов клавиатуры и мыши - Windows drivers (2)

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

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

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

PS/2 Мышь

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

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

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

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

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

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

  • Класс grandmaster 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 запрос вниз по стеку драйверов. В противном случае драйвер класса завершает запрос без отправки запроса в стек драйверов. Драйвер класса задает доверенный файл с доступом на чтение к устройству. При наличии устройства грандмастера драйвер класса отправляет запрос на создание на все порты, связанные с устройствами подчиненного класса.

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

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

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

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

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

(Video) Как установить драйвера на Windows и обновить их

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

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

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

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

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

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

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

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) и имеет формат данных, указанный в следующей таблице.

Смещение начала (в байтах)Размер (в байтах)Данные
04Заголовок: сведения о версии
44Заголовок: флаги
84Заголовок: количество сопоставлений
124Индивидуальное сопоставление
.........
Последние 4 байта4Признак конца NULL (0x00000000)

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

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

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

Пример 1

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

(Video) Как пользоваться MyASUS?

00000000 00000000 03000000 3A001D00 1D003A00 00000000

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

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

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

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

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

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

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

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

Пример 2

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

00000000 00000000 03000000 00001DE0 20E038E0 00000000

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

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

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

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

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

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

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

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

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

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

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

К преимуществам относятся:

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

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

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

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

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

(Video) Инструменты для управления драйверами в Windows 10. (Driver management tools in Windows 10)

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 в flags. Если флаг MOUSE_VIRTUAL_DESKTOP не задан, Window Manager сопоставляет входные данные только с основным монитором.

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

  • Устройства 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.

  • Устройства с COM-портами, отличные от Plug and Play:

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

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

    (Video) Система Windows не смогла найти драйверы. Что делать?

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

Videos

1. Настройка Windows 11 22H2 от профессионала для самых маленьких.
(diohas)
2. USB устройство не опознано.Неизвесное USB устройство.Сбой запроса дескриптора устройства
(Включи Смартфон)
3. Как установить макрос на X7 мышку?
(МАКРОСЫ - RAZER, LOGITECH, X7, BLOODY)
4. 15 горячих клавиш, о которых вы не догадываетесь
(AdMe)
5. 03 Установка драйверов windows
(Web MASTERS)
6. Как уменьшить ИНПУТ ЛАГ на клавиатуре и мыши в ФОРТНАЙТ и ВАЛОРНАТ!
(be2bra)
Top Articles
Latest Posts
Article information

Author: Jonah Leffler

Last Updated: 28/04/2023

Views: 5794

Rating: 4.4 / 5 (65 voted)

Reviews: 80% of readers found this page helpful

Author information

Name: Jonah Leffler

Birthday: 1997-10-27

Address: 8987 Kieth Ports, Luettgenland, CT 54657-9808

Phone: +2611128251586

Job: Mining Supervisor

Hobby: Worldbuilding, Electronics, Amateur radio, Skiing, Cycling, Jogging, Taxidermy

Introduction: My name is Jonah Leffler, I am a determined, faithful, outstanding, inexpensive, cheerful, determined, smiling person who loves writing and wants to share my knowledge and understanding with you.