Настройка драйверов для классов клавиатуры и мыши
Этот раздел предназначен для разработчиков, которые настраивают драйверы для классов клавиатуры и мыши. Если вы хотите исправить мышь или клавиатуру, см. следующие статьи:
- Проблемы с мышью, сенсорной панелью и клавиатурой в Windows
- Устранение неполадок с беспроводной мышью, которая работает неправильно
Клавиатуры и мыши, отличные от 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
Стек драйверов клавиатуры состоит из следующего.
- 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\ \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 поддерживает следующие внутренние запросы управления устройствами для запроса сведений об устройстве клавиатуры и установки параметров на устройстве клавиатуры:
Дополнительные сведения обо всех запросах на управление устройствами с клавиатуры см. в справочнике по устройствам с интерфейсом пользователя.
Сканировать сопоставителя кода для клавиатур
В операционных системах 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 поддерживает следующий внутренний запрос на управление устройством для запроса сведений об устройстве мыши:
Дополнительные сведения обо всех запросах на управление устройствами мыши см. в разделе Справочник по устройствам с интерфейсом пользователя.
Параметры реестра, связанные с драйвером класса мыши
Ниже приведен список разделов реестра, связанных с драйвером класса мыши.
- 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)
Ниже по типу устройства определяется, как реализуются эти специальные требования для абсолютного указывающего устройства.
- Устройства 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.
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Windows driver documentation
Как называется драйвер для клавиатуры ( на ноутбук ASUS F3Sseries) Заранее спасибо!
попробуй применить программу driver pack solution. Она, если чего не хватает, доустановит, чего обновить надо, обновит. Смотрите источник.
Источник: http://drp.su/ru/download.htm
Похожие вопросы
Ваш браузер устарел
Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.
Драйвер клавиатуры
Для того чтобы на экране отображался символ, набранный на клавиатуре, и прежде всего, если вы вводите с помощью англоязычной клавиатуры русские буквы и специальные символы, необходим драйвер клавиатуры, который обычно является составной частью любой операционной системы. Драйвер клавиатуры операционной системы MS-DOS называется KEYB.COM. После установки операционной системы DOS он находится, как правило, в директории DOS.
Вы можете инициализировать этот драйвер в любое время, набрав в ответ на приглашение DOS командную строку:
где дополнительный параметр RU означает русский язык и обозначает соответствующий набор символов, которые должна использовать операционная система. Целесообразнее поместить эту командную строку в файла АUTOEXEC.BAT. В этом случае драйвер каждый раз будет загружаться автоматически. Если загружать драйвер клавиатуры через стартовый файл CONFIG.SYS, нужно записать в этот файл следующую командную строку:
Для операционной системы неважно, какими буквами (прописными или строчными) набрана команда. драйвер клавиатуры загружается в память компьютера резидентно, т. е. в процессе работы компьютера он постоянно находится в памяти. О других возможностях драйвера, согласовании алфавитов стран и об изменении скорости повторения отдельных клавиш с помощью команд DOS можно узнать в документации по DOS или в соответствующем справочнике.
Наряду с клавиатурой мышь является важнейшим средством ввода. С начала триумфального шествия графических оболочек мышь стала необходимой для эффективной работы на РС с соответствующим программным обеспечением. С помощью мыши нельзя вводить в РС серии команд. Однако именно это и явилось отправной точкой для развития удобного графического интерфейса пользователя.
Назначение графических оболочек — это возможность инициализации многих команд без длинного ввода их с клавиатуры. Выбор, щелчок (или двойной щелчок) на объекте в виде пиктограммы, символа или пункта меню делает клавиатуру (почти) ненужной. Естественно, что ее нельзя полностью заменить в приложениях, требующих ввода данных с клавиатуры, например, программы обработки текста. Применение только мыши также зачастую не является самым быстрым путем к достижению желаемого результата, так как с помощью стандартных комбинаций клавиш («горячие клавиши») многие функции можно выполнить быстрее.
Для нормальной работы с мышью необходима не только сама мышь как инструмент. Для оптимального функционирования мышь должна передвигаться по плоской поверхности. Обычно применяются специальные коврики, так называемые MousePad. Указатель мыши на экране движется синхронно с движением мыши по коврику .Если двигать мышь налево, указатель на мониторе перемещается налево, если двигать мышь по кругу, то указатель также движется по кругу.
Устройством ввода мыши являются находящиеся на ней кнопки. Большинство мышей имеют по две кнопки, а специальные модели имеют уже больше трех кнопок. Мыши с одной только кнопкой применяются для компьютеров типа Apple. К разговору о 3-кнопочных мышах мы вернемся позже.
Функциональное назначение кнопок мыши различно и зависит от выполняемого приложения. Общим правилом является то, что при указании на объект, например, пиктограмму, объект становится управляемым. В этом случае при щелчке левой кнопкой мыши объект помечается (выделяется). Если теперь, не отпуская левой кнопки, перемещать мышь, то объект будет перемещаться на экране. При двойном щелчке левой кнопкой мыши на этом объекте он активизируется.
Для большинства программных продуктов имеется возможность переопределять функции левой и правой клавиши мыши, что облегчает работу левшей. В Windows 95, например, эту установку можно изменить, выбрав команду ControlPanel, Mouse, Buttons, Lefthanded.
При покупке мыши обращайте внимание не только на ее внешний вид, тип конструкции, разрешение и способ передачи сигнала, а прежде всего на то, комфортно ли она располагается в вашей руке и удобно ли ее перемещать.
Драйверы клиента HID клавиатуры и мыши
Этот раздел предназначен для разработчиков, которые создают драйверы для клавиатуры и мыши HID-клиентов. Если вы хотите исправить мышь или клавиатуру, см. следующие статьи:
- Проблемы с мышью, сенсорной панелью и клавиатурой в Windows
- Устранение неполадок с беспроводной мышью, которая работает неправильно
В этой статье рассматриваются клиентские драйверы HID клавиатуры и мыши. Клавиатуры и мыши представляют собой первый набор клиентов HID, которые были стандартизированы в таблицах использования HID и реализованы в операционных системах Windows.
Клиентские драйверы HID клавиатуры и мыши реализованы в виде hiD Mapper Drivers. Драйвер сопоставителя HID — это драйвер фильтра WDM в режиме ядра, предоставляющий двунаправленный интерфейс для запросов ввода-вывода между драйвером класса, не относящееся к HID, и драйвером класса HID. Драйвер сопоставителя сопоставляет запросы ввода-вывода и протоколы данных одного из них с другим.
Windows предоставляет системные драйверы карт HID для клавиатуры HID и устройств с мышью HID.
Архитектура и обзор
На следующем рисунке показаны системные стеки драйверов для USB-клавиатуры, мыши и сенсорной панели.

На рисунке показаны следующие компоненты:
- KBDHID.sys: драйвер клиентского сопоставителя HID для клавиатур. Преобразует использование HID в коды сканирования для взаимодействия с существующим драйвером класса клавиатуры.
- MOUHID.sys: драйвер сопоставителя клиента HID для мышей и сенсорных панели. Преобразует использование HID в команды мыши (X/Y, кнопки, колесо) для взаимодействия с существующим драйвером класса клавиатуры.
- KBDCLASS.sys: драйвер класса клавиатуры обеспечивает функциональность для всех клавиатур и клавиатур в системе безопасным образом.
- MOUCLASS.sys. Драйвер класса мыши предоставляет функциональные возможности для всех мышей и сенсорных панели в системе. Драйвер поддерживает как абсолютные, так и относительные указывающие устройства. MOUCLASS.sys не является драйвером Windows для сенсорных экранов.
- HIDCLASS.sys: драйвер класса HID. Драйвер класса HID — это клей между KBDHID.sys и MOUHID.sys hid-клиентами и различными транспортами, такими как USB, Bluetooth и т. д.
Система создает стек драйверов следующим образом:
- Транспортный стек создает объект физического устройства (PDO) для каждого подключенного устройства HID и загружает соответствующий драйвер транспорта HID, который, в свою очередь, загружает драйвер класса HID.
- Драйвер класса HID создает PDO для каждой клавиатуры или мыши TLC. Сложные устройства HID (более одного TLC) предоставляются в виде нескольких PDO, созданных драйвером класса HID. Например, клавиатура со встроенной мышью может иметь одну коллекцию для стандартных элементов управления клавиатурой и другую коллекцию для мыши.
- Драйверы сопоставителя клиента HID клавиатуры или мыши загружаются на соответствующий FDO.
- Драйверы сопоставителя HID создают FDO для клавиатуры и мыши и загружают драйверы классов.
Важные примечания
- Драйверы поставщиков не требуются для клавиатур и мышей, которые соответствуют поддерживаемым коллекциям ИСПОЛЬЗОВАНИЯ HID и верхнего уровня.
- Поставщики при необходимости предоставляют драйверы фильтров в стеке HID, чтобы изменить или улучшить функциональность этих конкретных TLC.
- Поставщики должны создавать отдельные, зависящие от поставщика, TLCS для обмена проприетарными данными между клиентом HID и устройством. Избегайте использования драйверов фильтров, если они не имеют критического значения.
- Система открывает все коллекции клавиатуры и мыши для исключительного использования.
- Система не позволяет отключить или включить клавиатуру.
- Система обеспечивает поддержку горизонтальных и вертикальных колес с возможностями плавной прокрутки.
Руководство по драйверу
Корпорация Майкрософт предоставляет следующие рекомендации для драйверов для написания IHV:
- Разработчикам драйверов разрешено добавлять дополнительные драйверы в виде драйвера фильтра или нового драйвера клиента HID.
- Драйверы фильтров. Разработчики драйверов должны убедиться, что их дополнительный драйвер является драйвером фильтра и не заменяет (или не будет использоваться вместо) существующих драйверов Windows HID во входном стеке.
- Драйверы фильтров разрешены в следующих сценариях:
- В качестве верхнего фильтра для kbdhid/mouhid
- В качестве верхнего фильтра для kbdclass/mouclass
- Драйверы фильтров не рекомендуется использовать в качестве фильтра между мини-драйверами транспорта HIDCLASS и HID
- Драйверы фильтров разрешены в следующих сценариях:
- Драйверы функций. Кроме того, поставщики могут создать драйвер функции (вместо драйвера фильтра), но только для конкретных поставщиков PDO HID (со службой пользовательского режима при необходимости). Драйверы функций разрешены в следующих сценариях:
- Загрузка только на оборудование конкретного поставщика
- Транспортные драйверы. Команда разработчиков Windows не рекомендует создавать дополнительные мини-накопители hid. Это сложные драйверы для написания и обслуживания. Если партнер создает новый транспортный мини-накопитель HID, особенно для систем SoC, мы рекомендуем провести подробный обзор архитектуры, чтобы понять причину и убедиться, что драйвер разработан правильно.
- Устройство может перейти в самое низкое состояние питания, когда устройство бездействует.
- Устройство находится в состоянии наименьшего энергопотребления, когда система находится в состоянии низкого энергопотребления (например, в режиме ожидания (S3) или в режиме ожидания с подключением).
Раскладка клавиатуры
Раскладка клавиатуры полностью описывает характеристики ввода клавиатуры для Microsoft Windows 2000 и более поздних версий. Например, раскладка клавиатуры определяет язык, тип и версию клавиатуры, модификаторы, коды сканирования и т. д.
Сведения о раскладках клавиатуры см. в следующих ресурсах:
- Файл заголовка клавиатуры kdb.h в пакете средств разработки драйверов Windows (DDK), в котором документируются общие сведения о раскладках клавиатуры.
- Примеры раскладок клавиатуры.
Чтобы визуализировать макет определенной клавиатуры, см. раздел Раскладки клавиатуры Windows.
Дополнительные сведения о раскладке клавиатуры см. в разделе панель управления\Clock, Language и Region\Language.
Поддерживаемые кнопки и колеса на мышах
В следующей таблице указаны функции, поддерживаемые в разных клиентских версиях операционной системы Windows.
Компонент Windows XP Windows Vista Windows 7 Windows 8 и более поздние версии Кнопки 1–5 Поддерживается (P/2 & HID) Поддерживается (PS/2 & HID) Поддерживается (PS/2 & HID) Поддерживается (PS/2 & HID) Вертикальное колесико прокрутки Поддерживается (PS/2 & HID) Поддерживается (PS/2 & HID) Поддерживается (PS/2 & HID) Поддерживается (PS/2 & HID) Горизонтальное колесико прокрутки Не поддерживается Поддерживается(только HID) Поддерживается(только HID) Поддерживается(только HID) Поддержка плавного колесика прокрутки (по горизонтали и вертикали) Не поддерживается Частично поддерживается Поддерживается (только HID) Поддерживается (только HID) Активация кнопок 4–5 и колесика на мышах PS/2
Метод, используемый Windows для активации нового режима с четырьмя и пятью кнопками и колесико, является расширением метода, используемого для активации третьей кнопки и колесика в мышах, совместимых с IntelliMouse:
- Мышь устанавливается в режим колесика с тремя кнопками, устанавливая скорость отчета 200 отчетов в секунду, затем 100 отчетов в секунду, а затем 80 отчетов в секунду. Затем считывает идентификатор с мыши. После завершения этой последовательности мышь должна сообщить идентификатор 3.
- Затем мышь настраивается в режим колесика с пятью кнопками, устанавливая скорость отчета 200 отчетов в секунду, затем снова 200 отчетов в секунду, а затем 80 отчетов в секунду. Затем считывает идентификатор с мыши. После завершения последовательности мышь с пятью кнопками должна сообщить идентификатор 4 (в то время как мышь, совместимая с IntelliMouse с тремя кнопками, по-прежнему будет сообщать идентификатор 3).
Этот метод применим только к мышам PS/2, а не к мышам HID. Мыши HID должны сообщать о точном использовании в дескрипторе отчета.
Стандартный формат пакетов данных мыши, совместимый с PS/2 (две кнопки)
Byte D7 D6 D5 D4 D3 D2 D1 D0 Комментировать 1 Yover Xover Ysign Xsign Тег M R L X/Y переполнения и знаки, кнопки 2 X7 X6 X5 X4 X3 X2 X1 X0 X байт данных 3 Y7 Y6 Да5 Y4 Да3 Да2 Да1 Y0 Байты данных Y Драйверы мыши Windows не проверка биты переполнения. В случае переполнения мышь должна просто отправить максимальное значение смещения со знаком.
Стандартный формат пакета данных мыши, совместимый с PS/2 (три кнопки + вертикальное колесо)
Byte D7 D6 D5 D4 D3 D2 D1 D0 Комментировать 1 0 0 Ysign Xsign 1 M R L Знаки X/Y и кнопки R/L/M 2 X7 X6 X5 X4 X3 X2 X1 X0 X байт данных 3 Y7 Y6 Да5 Y4 Да3 Да2 Да1 Y0 Байты данных Y 4 Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0 Байт данных Z/wheel Стандартный формат пакета данных мыши, совместимый с PS/2 (пять кнопок + вертикальное колесико)
Byte D7 D6 D5 D4 D3 D2 D1 D0 Комментировать 1 0 0 Ysign Xsign 1 M R L Знаки X/Y и кнопки R/L/M 2 X7 X6 X5 X4 X3 X2 X1 X0 X байт данных 3 Y7 Y6 Да5 Y4 Да3 Да2 Да1 Y0 Байты данных Y 4 0 0 B5 B4 Z3 Z2 Z1 Z0 Данные z/wheel и кнопки 4 и 5 Обратите внимание, что данные Z/колесика для мыши с пятью кнопками были сокращены до четырех битов вместо 8 бит, используемых в режиме колесика, совместимого с IntelliMouse. Это сокращение становится возможным благодаря тому, что колесико обычно не может генерировать значения за пределами диапазона +7/-8 в течение любого заданного периода прерывания. Драйверы мыши Windows подписывают четыре бита данных Z/wheel, когда мышь находится в режиме колесика с пятью кнопками, и полный байт данных Z/wheel, когда мышь работает в режиме колесика с тремя кнопками.
Кнопки 4 & 5 в сопоставляются с WM_APPCOMMAND сообщениями и соответствуют App_Back и App_Forward.
Устройствам, не требующим драйверов поставщиков
Драйверы поставщиков не требуются для следующих устройств:
- Устройства, соответствующие стандарту HID.
- Устройства с клавиатурой, мышью или игровыми портами, управляемыми системными драйверами, не-HIDClass.
Пример Kbfiltr
Kbfiltr используется с Kbdclass, драйвером системного класса для клавиатурных устройств и I8042prt, драйвером-функцией для клавиатуры в стиле PS/2. Kbfiltr демонстрирует фильтрацию запросов ввода-вывода и добавление процедур обратного вызова, которые изменяют операции Kbdclass и I8042prt.
Дополнительные сведения об операции Kbfiltr см. в разделе:
- Файл заголовка ntddkbd.h WDK.
- Пример исходного кода Kbfiltr .
Коды элементов управления вводом-выводом Kbfiltr
В Kbfiltr используются следующие ioCTL.
IOCTL_INTERNAL_I8042_HOOK_KEYBOARD
- Добавляет подпрограмму обратного вызова инициализации клавиатуры I8042prt.
- Добавляет подпрограмму обратного вызова ISR к клавиатуре I8042prt ISR.
Обратные вызовы инициализации и ISR являются необязательными и предоставляются драйвером фильтра верхнего уровня для клавиатурного устройства в стиле PS/2.
Когда I8042prt получает запрос IOCTL_INTERNAL_KEYBOARD_CONNECT , он отправляет синхронный запрос IOCTL_INTERNAL_I8042_HOOK_KEYBOARD в верхнюю часть стека клавиатурных устройств.
После того как Kbfiltr получит запрос на перехватчик клавиатуры, Kbfiltr фильтрует запрос следующим образом:
- Сохраняет сведения верхнего уровня, передаваемые в Kbfiltr, включая контекст объекта устройства верхнего уровня, указатель на обратный вызов инициализации и указатель на обратный вызов ISR.
- Заменяет сведения верхнего уровня собственными.
- Сохраняет контекст I8042prt и указатели на обратные вызовы, которые может использовать обратный вызов Kbfiltr ISR.
IOCTL_INTERNAL_KEYBOARD_CONNECT
Запрос IOCTL_INTERNAL_KEYBOARD_CONNECT подключает службу Kbdclass к устройству клавиатуры. Kbdclass отправляет этот запрос в стек устройств клавиатуры перед открытием устройства клавиатуры.
После того как Kbfiltr получил запрос на подключение с клавиатуры, Kbfiltr фильтрует запрос на подключение следующим образом:
- Сохраняет копию структуры kbdclass CONNECT_DATA (Kbdclass), которая передается в драйвер фильтра с помощью Kbdclass.
- Заменяет сведения о подключении драйвера класса собственными сведениями о подключении.
- Отправляет запрос IOCTL_INTERNAL_KEYBOARD_CONNECT вниз по стеку устройств.
Если запрос не выполнен, Kbfiltr завершает запрос с соответствующим состоянием ошибки.
Kbfiltr предоставляет шаблон для процедуры обратного вызова службы фильтрации, которая может дополнить работу KeyboardClassServiceCallback, подпрограммы обратного вызова службы класса Kbdclass. Обратный вызов службы фильтрации может фильтровать входные данные, передаваемые из входного буфера устройства в очередь данных класса.
IOCTL_INTERNAL_KEYBOARD_DISCONNECT
Запрос IOCTL_INTERNAL_KEYBOARD_DISCONNECT завершается с состоянием STATUS_NOT_IMPLEMENTED. Диспетчер Plug and Play может добавлять или удалять клавиатуру Plug and Play.
Для всех остальных запросов на управление устройством Kbfiltr пропускает текущий стек IRP и отправляет запрос вниз по стеку устройств без дальнейшей обработки.
Процедуры обратного вызова, реализованные Kbfiltr
Kbfiltr реализует следующие процедуры обратного вызова.
KbFilter_InitializationRoutine
См . PI8042_KEYBOARD_INITIALIZATION_ROUTINE
KbFilter_InitializationRoutine не требуется, если достаточно инициализации клавиатуры i8042prt по умолчанию.
I8042prt вызывает KbFilter_InitializationRoutine при инициализации клавиатуры. Инициализация клавиатуры по умолчанию включает следующие операции:
- сброс клавиатуры
- установка типотипичного значения скорости и задержки
- установка светодиодных светодиодов
/* Parameters DeviceObject [in] Pointer to the device object that is the context for this callback. SynchFuncContext [in] Pointer to the context for the routines pointed to by ReadPort and Writeport. ReadPort [in] Pointer to the system-supplied PI8042_SYNCH_READ_PORT callback that reads from the port. WritePort [in] Pointer to the system-supplied PI8042_SYNCH_WRITE_PORT callback that writes to the port. TurnTranslationOn [out] Specifies, if TRUE, to turn translation on. Otherwise, translation is turned off. Return value KbFilter_InitializationRoutine returns an appropriate NTSTATUS code. */ NTSTATUS KbFilter_InitializationRoutine( In PDEVICE_OBJECT DeviceObject, In PVOID SynchFuncContext, In PI8042_SYNCH_READ_PORT ReadPort, In PI8042_SYNCH_WRITE_PORT WritePort, Out PBOOLEAN TurnTranslationOn );KbFilter_IsrHook
См . PI8042_KEYBOARD_ISR. Этот обратный вызов не требуется, если достаточно операции по умолчанию для I8042prt.
IsR клавиатуры I8042prt вызывает KbFilter_IsrHook после проверки прерывания и считывания кода сканирования.
KbFilter_IsrHook работает в режиме ядра на irQL клавиатуры I8042prt.
/* Parameters DeviceObject [in] Pointer to the filter device object of the driver that supplies this callback. CurrentInput [in] Pointer to the input KEYBOARD_INPUT_DATA structure that is being constructed by the ISR. CurrentOutput [in] Pointer to an OUTPUT_PACKET structure that specifies the bytes that are being written to the hardware device. StatusByte [in, out] Specifies the status byte that is read from I/O port 60 when an interrupt occurs. DataByte [in] Specifies the data byte that is read from I/O port 64 when an interrupt occurs. ContinueProcessing [out] Specifies, if TRUE, to continue processing in the I8042prt keyboard ISR after this callback returns; otherwise, processing is not continued. ScanState [in] Pointer to a KEYBOARD_SCAN_STATE structure that specifies the keyboard scan state. Return value KbFilter_IsrHook returns TRUE if the interrupt service routine should continue; otherwise it returns FALSE. */ KbFilter_IsrHook KbFilter_IsrHook( In PDEVICE_OBJECT DeviceObject, In PKEYBOARD_INPUT_DATA CurrentInput, In POUTPUT_PACKET CurrentOutput, Inout UCHAR StatusByte, In PUCHAR DataByte, Out PBOOLEAN ContinueProcessing, In PKEYBOARD_SCAN_STATE ScanState );KbFilter_ServiceCallback
См . PSERVICE_CALLBACK_ROUTINE.
Подпрограмма завершения диспетчеризации ISR драйвера функции вызывает KbFilter_ServiceCallback, которая затем вызывает реализацию PSERVICE_CALLBACK_ROUTINE драйвера класса клавиатуры. Поставщик может реализовать обратный вызов службы фильтра для изменения входных данных, передаваемых из входного буфера устройства в очередь данных класса. Например, обратный вызов может удалять, преобразовывать или вставлять данные.
/* Parameters DeviceObject [in] Pointer to the class device object. InputDataStart [in] Pointer to the first keyboard input data packet in the input data buffer of the port device. InputDataEnd [in] Pointer to the keyboard input data packet that immediately follows the last data packet in the input data buffer of the port device. InputDataConsumed [in, out] Pointer to the number of keyboard input data packets that are transferred by the routine. Return value None */ VOID KbFilter_ServiceCallback( In PDEVICE_OBJECT DeviceObject, In PKEYBOARD_INPUT_DATA InputDataStart, In PKEYBOARD_INPUT_DATA InputDataEnd, Inout PULONG InputDataConsumed );Пример Moufiltr
Moufiltr используется с Mouclass, драйвером системного класса для устройств мыши, используемых в Windows 2000 и более поздних версиях, и I8042prt, драйвером функции для мыши в стиле PS/2, используемой в Windows 2000 и более поздних версиях. Moufiltr демонстрирует, как фильтровать запросы ввода-вывода и добавлять подпрограммы обратного вызова, которые изменяют операции Mouclass и I8042prt.
Дополнительные сведения об операции Moufiltr см. в следующих ресурсах:
- Файл заголовка WDK ntddmou.h .
- Пример исходного кода Moufiltr .
Коды элементов управления ввода-вывода Moufiltr
Следующие ioCTL используются Moufiltr.
IOCTL_INTERNAL_I8042_HOOK_MOUSE
Запрос IOCTL_INTERNAL_I8042_HOOK_MOUSE добавляет подпрограмму обратного вызова ISR в ISR мыши I8042prt. Обратный вызов ISR является необязательным и предоставляется драйвером фильтра мыши верхнего уровня.
I8042prt отправляет этот запрос после получения запроса IOCTL_INTERNAL_MOUSE_CONNECT . I8042prt отправляет синхронный запрос IOCTL_INTERNAL_I8042_HOOK_MOUSE в верхнюю часть стека устройств мыши.
После того как Moufiltr получит запрос на перехватчик мыши, он фильтрует запрос следующим образом:
- Сохраняет сведения верхнего уровня, передаваемые в Moufiltr, включая контекст объекта устройства верхнего уровня и указатель на обратный вызов ISR.
- Заменяет сведения верхнего уровня собственными.
- Сохраняет контекст I8042prt и указатели на обратные вызовы, которые могут использоваться обратными вызовами Moufiltr ISR.
IOCTL_INTERNAL_MOUSE_CONNECT
Запрос IOCTL_INTERNAL_MOUSE_CONNECT подключает службу Mouclass к устройству мыши.
IOCTL_INTERNAL_MOUSE_DISCONNECT
Moufiltr завершает запрос IOCTL_INTERNAL_MOUSE_DISCONNECT с состоянием ошибки STATUS_NOT_IMPLEMENTED.
Для всех остальных запросов Moufiltr пропускает текущий стек IRP и отправляет запрос вниз по стеку устройств без дальнейшей обработки.
Процедуры обратного вызова Moufiltr
Следующие процедуры обратного вызова реализуются MouFiltr.
MouFilter_IsrHook
См . PI8042_MOUSE_ISR.
/* Parameters DeviceObject Pointer to the filter device object of the driver that supplies this callback. CurrentInput Pointer to the input MOUSE_INPUT_DATA structure being constructed by the ISR. CurrentOutput Pointer to the OUTPUT_PACKET structure that specifies the bytes being written to the hardware device. StatusByte Specifies a status byte that is read from I/O port 60 when the interrupt occurs. DataByte Specifies a data byte that is read from I/O port 64 when the interrupt occurs. ContinueProcessing Specifies, if TRUE, that the I8042prt mouse ISR continues processing after this callback returns. Otherwise, processing is not continued. MouseState Pointer to a MOUSE_STATE enumeration value, which identifies the state of mouse input. ResetSubState Pointer to MOUSE_RESET_SUBSTATE enumeration value, which identifies the mouse reset substate. See the Remarks section. Return value MouFilter_IsrHook returns TRUE if the interrupt service routine should continue; otherwise it returns FALSE. */ BOOLEAN MouFilter_IsrHook( PDEVICE_OBJECT DeviceObject, PMOUSE_INPUT_DATA CurrentInput, POUTPUT_PACKET CurrentOutput, UCHAR StatusByte, PUCHAR DataByte, PBOOLEAN ContinueProcessing, PMOUSE_STATE MouseState, PMOUSE_RESET_SUBSTATE ResetSubState );Обратный вызов MouFilter_IsrHook не требуется, если достаточно операции по умолчанию для I8042prt.
IsR мыши I8042prt вызывает MouFilter_IsrHook после проверки прерывания.
Чтобы сбросить мышь, I8042prt проходит последовательность операционных подсостояния. Значение перечисления MOUSE_RESET_SUBSTATE определяет каждое подсостояние. Дополнительные сведения о том, как I8042prt сбрасывает мышь и соответствующие подсостояния сброса мыши, см. в документации по MOUSE_RESET_SUBSTATE в ntdd8042.h.
MouFilter_IsrHook работает в режиме ядра в IRQL isR мыши I8042prt.
MouFilter_ServiceCallback
/* Parameters DeviceObject [in] Pointer to the class device object. InputDataStart [in] Pointer to the first mouse input data packet in the input data buffer of the port device. InputDataEnd [in] Pointer to the mouse input data packet immediately following the last data packet in the port device's input data buffer. InputDataConsumed [in, out] Pointer to the number of mouse input data packets that are transferred by the routine. Return value None */ VOID MouFilter_ServiceCallback( _In_ PDEVICE_OBJECT DeviceObject, _In_ PMOUSE_INPUT_DATA InputDataStart, _In_ PMOUSE_INPUT_DATA InputDataEnd, _Inout_ PULONG InputDataConsumed );IsR DPC i8042prt вызывает MouFilter_ServiceCallback, который затем вызывает MouseClassServiceCallback. Обратный вызов службы фильтров можно настроить для изменения входных данных, передаваемых из входного буфера устройства в очередь данных класса. Например, обратный вызов может удалять, преобразовывать или вставлять данные.
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Windows driver documentation
- Драйверы фильтров. Разработчики драйверов должны убедиться, что их дополнительный драйвер является драйвером фильтра и не заменяет (или не будет использоваться вместо) существующих драйверов Windows HID во входном стеке.