Virtual hid minidriver что это
Создание драйвера источника HID с помощью виртуальной платформы HID (ВХФ)
Сводка
Относится к
Важные API
Сведения о создании драйвера источника HID, который передает данные HID в операционную систему.
Устройство ввода HID, такое как клавиатура, мышь, перо, касание или кнопка, отправляет различные отчеты в операционную систему, чтобы они могли понять назначение устройства и предпринять необходимые действия. Отчеты представлены в виде коллекций HID и использования HID. устройство отправляет эти отчеты по различным транспортам, некоторые из которых поддерживаются Windows, например hid через I2C и hid через USB. в некоторых случаях транспорт может не поддерживаться Windows или отчеты могут не сопоставляться напрямую с реальным оборудованием. Это может быть поток данных в формате HID, который отправляется другим компонентом программного обеспечения для виртуального оборудования, например, для кнопок или датчиков, не относящихся к GPIO. Например, рассмотрим акселерометр данные с телефона, который работает в качестве игрового устройства и отправляет беспроводное подключение на ПК. в другом примере компьютер может получить удаленный ввод с Miracast устройства с помощью протокола уибк.
в предыдущих версиях Windows для поддержки новых транспортов (реального оборудования или программного обеспечения) пришлось написать HID-транспорт минидривер и привязать его к поставляемому корпорацией майкрософт драйверу класса в box, Hidclass.sys. Пара класс/мини-драйвер предоставляет коллекции HID, такие как коллекции верхнего уровня для драйверов верхнего уровня и приложения пользовательского режима. В этой модели сложность была написана на минидривер, что может быть сложной задачей.
начиная с Windows 10 новая виртуальная среда HID (вхф) устраняет необходимость написания минидривер транспорта. Вместо этого можно написать драйвер источника HID с помощью интерфейсов программирования КМДФ или WDM. Платформа состоит из статической библиотеки, предоставляемой корпорацией Майкрософт, которая предоставляет программные элементы, используемые драйвером. Он также включает встроенный драйвер, предоставляемый корпорацией Майкрософт, который перечисляет одно или несколько дочерних устройств и переходит к созданию виртуального дерева HID и управлению им.
В этом разделе описывается архитектура платформы, дерево виртуальных устройств HID и сценарии конфигурации.
Дерево виртуальных устройств HID
На этом рисунке в дереве устройств показаны драйверы и связанные с ними объекты устройств.
Драйвер источника HID (драйвер)
Драйвер источника HID ссылается на Вхфкм. lib и включает ВХФ. h в свой проект сборки. драйвер можно записать с помощью WDM (WDM) или платформы Kernel-Mode driver framework (кмдф), которая входит в состав Windows платформ драйверов (вдф). Драйвер можно загрузить в виде драйвера фильтра или драйвера функции в стеке устройства.
Статическая библиотека ВХФ (вхфкм. lib)
статическая библиотека входит в комплект драйверов Windows (WDK) для Windows 10. Библиотека предоставляет программные интерфейсы, такие как подпрограммы и функции обратного вызова, используемые драйвером источника HID. Когда драйвер вызывает функцию, статическая библиотека перенаправляет запрос к драйверу ВХФ, который обрабатывает запрос.
Драйвер ВХФ (Vhf.sys)
Драйвер, предоставленный корпорацией Майкрософт. Этот драйвер необходимо загрузить в качестве более низкого драйвера фильтра под драйвером в исходном стеке устройств HID. Драйвер ВХФ динамически перечисляет дочерние устройства и создает объекты физических устройств (PDO) для одного или нескольких устройств HID, указанных драйвером источника HID. В нем также реализована функция мини-драйвера транспортного устройства с перечисленными дочерними устройствами.
Пара драйверов классов HID (Hidclass.sys, Mshidkmdf.sys)
Пара Хидкласс/Мшидкмдф перечисляет коллекции верхнего уровня (ТЛК) аналогично тому, как она перечисляет коллекции для реального HID-устройства. Клиент HID может по-прежнему запрашивать и использовать Тлкс так же, как и реальное устройство HID. Эта пара драйверов устанавливается как драйвер функции в стеке устройства.
Клиент HID (приложение)
Запрос и использование Тлкс, сообщаемых стеком устройств HID.
Требования к заголовку и библиотеке
В этой процедуре описывается написание простого драйвера источника HID, который сообщает кнопки гарнитуры операционной системе. В этом случае драйвер, реализующий этот код, может быть существующим аудио драйвером КМДФ, который был изменен для использования в качестве кнопок гарнитуры отчетов HID Source с помощью ВХФ.
Создание виртуального устройства HID
В вызове вхфкреате драйвер может задавать определенные параметры конфигурации, например операции, которые должны обрабатываться асинхронно или задавать сведения об устройстве (идентификаторы поставщиков и продуктов).
Например, приложение запрашивает ТЛК. Когда пара из драйвера класса HID получает этот запрос, эта пара определяет тип запроса и создает соответствующий запрос МИНИДРИВЕР ioctl и пересылает его в ВХФ. При получении запроса IOCTL ВХФ может обработать запрос, использовать драйвер источника HID для его обработки или выполнить запрос с STATUS_NOT_SUPPORTED.
ВХФ обрабатывает эти запросы IOCTL:
Если запрос является реализованным, сетфеатуре, вритерепортили ЖЕТИНПУТРЕПОРТ, а драйвер источника HID зарегистрировал СООТВЕТСТВУЮЩУЮ функцию обратного вызова, ВХФвызывает функцию обратного вызова. В рамках этой функции драйвер источника HID может получать или задавать данные HID для виртуального устройства HID. Если драйвер не регистрирует обратный вызов, ВХФ завершает запрос с состоянием STATUS_NOT_SUPPORTED.
ВХФ вызывает функции обратного вызова событий, реализованные в драйвере источника HID, для этих IOCTL:
Если драйвер хочет получить или задать отчет о компонентах HID асинхронно, драйвер должен реализовать функцию евтвхфасинкоператион и указать указатель на функцию реализации get или Set в элементе евтвхфасинкоператионжетфеатуре или евтвхфасинкоператионсетфеатуре элемента VHF_CONFIG.
Если драйвер хочет асинхронно получить входной отчет HID, драйвер должен реализовать функцию евтвхфасинкоператион и указать указатель на функцию в евтвхфасинкоператионжетинпутрепорт члене VHF_CONFIG.
Если драйвер желает получить асинхронную запись входного отчета HID, драйвер должен реализовать функцию евтвхфасинкоператион и указать указатель на функцию в евтвхфасинкоператионвритерепорт члене VHF_CONFIG.
Для любого другого МИНИДРИВЕР ioctlВХФ завершает запрос с STATUS_NOT_SUPPORTED.
Отправка входного отчета HID
Как правило, HID-устройство отправляет сведения об изменениях состояния, отправляя входные отчеты через прерывания. Например, гарнитура устройства может отправить отчет при изменении состояния кнопки. В таком случае вызывается процедура службы прерываний (ISR) драйвера. В этой подпрограмме драйвер может запланировать отложенный вызов процедур (DPC), который обрабатывает входной отчет и отправляет его в ВХФ, который отправляет данные в операционную систему. По умолчанию ВХФ помещает отчет в буфер, а драйвер источника HID может начать отправлять отчеты с данными HID, как они приходят. Это и устраняет необходимость реализации в драйвере источника HID сложной синхронизации.
Удаление виртуального устройства HID
Удалите виртуальное устройство HID, вызвав вхфделете.
Что такое HID Keyboard Device? Как установить драйверы HID-клавиатуры
Что такое HID Keyboard Device?
Устройства интерфейса пользователя (или HID) — это класс компьютерных периферийных устройств, с помощью которых вы вводите команды. Этот термин обычно используется для обозначения мышей и клавиатур, но геймпады и джойстики тоже составляют эту категорию.
Клавиатуры HID ничем не отличаются от стандартных клавиатур PS / 2 в ноутбуках, за исключением того, что они подключаются через USB, а не встроены. Вопреки распространенному мнению, аббревиатура HID — это не термин, впервые использованный Microsoft. Фактически это происходит из спецификаций USB, поскольку USB HID является родительским классом.
Установите драйверы HID Keyboard
Если вы недавно обновились до Windows 10, переустановили или обновили ее, возможно, вы обнаружили, что вам необходимо установить (или обновить) драйверы HID Keyboard.
В большинстве случаев вам действительно не нужно ничего делать или вручную загружать и устанавливать драйверы клавиатуры. Обновления Windows обычно заботятся об этом, и процесс завершается в фоновом режиме без сбоев. Но бывают случаи, когда ваша клавиатура может начать вести себя странно, например, регистрировать случайные вводы и игнорировать фактические, или вообще перестать работать после загрузки Windows после переустановки.
Вот несколько способов обновить и переустановить драйверы клавиатуры и решить проблемы, с которыми вы можете столкнуться.
# 1: обновите драйверы клавиатуры из диспетчера устройств
Чтобы установить / обновить драйверы клавиатуры, откройте RUN, нажав Winkey + R, введите «devmgmt.msc» и нажмите Enter.
В диспетчере устройств разверните ветку Клавиатуры.
Затем щелкните правой кнопкой мыши на клавиатуре и выберите «Обновить драйвер».
Выберите Автоматический поиск драйверов.
Драйверы будут установлены / обновлены автоматически. Перезагрузите компьютер, чтобы изменения вступили в силу.
Вы также можете просмотреть (свой) компьютер в поисках драйверов, если вы уже загрузили драйверы с вашего компьютера или веб-сайта производителя клавиатуры.
Нажмите «Обзор», найдите папку с файлом драйвера и нажмите «Далее».
Кроме того, вы можете нажать «Разрешить мне выбрать» из списка доступных драйверов на моем компьютере и посмотреть, какие предложения Windows предлагает вам.
Затем выберите один из предложенных вариантов и нажмите «Далее».
Если вы не можете найти вариант, снимите флажок «Показать совместимое оборудование» и получите полный список драйверов от разных производителей на выбор. Затем нажмите Далее.
Необходимо обновить драйверы клавиатуры. Перезагрузите компьютер, чтобы изменения вступили в силу.
# 2: удалите и переустановите драйверы
Неисправный драйвер — частая причина того, что клавиатура начинает самостоятельно создавать проблемы. Самый простой способ избавиться от этой привязки — удалить текущие драйверы и все их файлы и снова переустановить драйверы. Это устраняет любые проблемы, которые могут быть связаны с неисправными драйверами.
Откройте диспетчер устройств, как показано ранее (Win + X). Вы также можете использовать для этого только мышь: щелкните правой кнопкой мыши кнопку «Пуск» и выберите «Диспетчер устройств».
Затем щелкните правой кнопкой мыши на клавиатуре в ветви «Клавиатуры» и выберите «Удалить устройство».
Снова нажмите Удалить.
Выберите Да и перезагрузите компьютер, чтобы удалить.
После перезапуска Windows автоматически установит драйверы клавиатуры по умолчанию и снова заставит клавиатуру работать.
Если клавиатура не работает после перезагрузки, это означает, что вам необходимо переустановить / обновить драйверы самостоятельно из диспетчера устройств. Но поскольку вы можете выполнить шаги, описанные выше, с помощью одной только мыши, это не должно быть проблемой.
HID Проблемы с клавиатурой
Как и большинство периферийных устройств, HID-клавиатуры имеют тенденцию создавать несколько собственных проблем. Хотя в основном проблемы возникают из-за ошибок в драйверах, проблемы также могут включать проблемы совместимости или другие программы и службы, мешающие правильному функционированию устройства.
Исправления: клавиатура не работает
Большинство вышеупомянутых проблем можно решить, просто обновив или переустановив драйверы, как показано в предыдущем разделе. Но если проблема с вашей клавиатурой не устранена, вы также можете взглянуть на следующее:
Убедитесь, что порт USB работает
Звучит достаточно очевидно, но это никогда не будет приятным сюрпризом, когда мы в конце концов обнаружим проблему там, где меньше всего хотели бы искать, — в оборудовании. Если ваша HID-клавиатура начинает проявлять странные проблемы, такие как периодическое обновление сама по себе, причиной может быть одна (или несколько) из следующих причин:
Чтобы проверить, работает ли порт USB, отключите клавиатуру HID и подключите другое устройство USB, например флэш-накопитель или мышь. Если он тоже не распознается, у вас проблема с оборудованием. Помимо исправления базовой инфраструктуры, вам также следует обойти любые USB-концентраторы, которые вы можете использовать, и подключить клавиатуру напрямую к ПК.
Конфликт обновления драйвера Windows 10
Некоторые пользователи сообщают о любопытной проблеме при перезагрузке Windows 10. Функциональная клавиатура перестает работать, как только драйверы устройства обновляются автоматически с помощью обновления Windows.
В таких случаях проблема заключается в драйверах, которые Windows обновляет самостоятельно. Быстрое решение этой проблемы — отключить обновление Windows и установить драйверы (как показано ранее) вручную. Многие производители устройств размещают на своих веб-сайтах собственные приложения, которые предоставляют подходящие драйверы для вашей системы и постоянно обновляют их.
Единственным недостатком этого решения является то, что мы должны держать обновления Windows выключенными, чтобы избежать конфликта между драйверами, которые мы установили вручную, и теми, которые обновление Windows хочет нам навязать. Однако вы можете сначала попытаться создать точку восстановления системы и снова включить обновления, чтобы проверить, работает ли ваша клавиатура.
Отключить ключи фильтра
Наконец, FilterKeys — функция «легкого доступа», которая сообщает Windows игнорировать повторяющиеся или слишком короткие нажатия клавиш. Однако этот параметр может заставить клавиатуру вести себя странно, например, регистрировать нажатие клавиши, когда оно не было выполнено, или вообще не регистрировать нажатие клавиши.
Лучше оставить ключи фильтров выключенными. Чтобы в этом убедиться, нажмите Win + I и откройте «Настройки». Щелкните «Удобство доступа».
Прокрутите вниз и выберите «Клавиатура» на левой панели.
Теперь справа в разделе «Использовать ключи фильтра» выключите кнопку и снимите флажок «Разрешить ярлыку запускать ключи файлов».
Вы также можете один раз обновить / переустановить драйверы, на всякий случай. Затем перезагрузите компьютер. Этот метод должен обновить драйверы и предотвратить вмешательство других функций во ввод данных.
Мы надеемся, что теперь вы стали лучше осведомлены о HID-клавиатурах и обновлении их дисков, чем раньше. Выполнение этого несколькими различными способами также гарантирует, что вы избежите любых проблем, которые в противном случае могли бы беспокоить вашу клавиатуру.
Write a HID source driver by using Virtual HID Framework (VHF)
Summary
Applies to
Important APIs
Learn about writing a HID source driver that reports HID data to the operating system.
A HID input device, such as – a keyboard, mouse, pen, touch, or button, sends various reports to the operating system so that it can understand the purpose of the device and take necessary action. The reports are in the form of HID collections and HID Usages. The device sends those reports over various transports, some of which are supported by Windows, such as HID over I2C and HID over USB. In some cases, the transport might not be supported by Windows, or the reports might not directly map to real hardware. It can be a stream of data in the HID format that is sent by another software component for virtual hardware such as, for non-GPIO buttons or sensors. For example, consider accelerometer data from a phone that is behaving as a game controller, sent wirelessly to a PC. In another example, a computer can receive remote input from a Miracast device by using the UIBC protocol.
In previous versions of Windows, to support new transports (real hardware or software), you had to write a HID transport minidriver and bind it to the Microsoft-provided in-box class driver, Hidclass.sys. The class/mini driver pair provided the HID collections, such as Top-Level Collections to upper-level drivers and user-mode applications. In that model, the challenge was writing the minidriver, which can be a complex task.
Starting in WindowsВ 10, the new Virtual HID Framework (VHF) eliminates the need to write a transport minidriver. Instead you can write a HID source driver by using KMDF or WDM programming interfaces. The framework consists of a Microsoft-provided static library that exposes programming elements used by your driver. It also includes a Microsoft-provided in-box driver that enumerates one or more child devices and proceeds to build and manage a virtual HID tree.
NoteВ В In this release, VHF supports a HID source driver only in kernel mode.
This topic describes the architecture of the framework, the virtual HID device tree, and the configuration scenarios.
Virtual HID device tree
In this image, the device tree shows the drivers and their associated device objects.
HID source driver (your driver)
The HID source driver links to Vhfkm.lib and includes Vhf.h in its build project. The driver can be written by using either Windows Driver Model (WDM) or Kernel-Mode Driver Framework (KMDF) that is part of the Windows Driver Frameworks (WDF). The driver can be loaded as a filter driver or a function driver in the device stack.
VHF static library (vhfkm.lib)
The static library is included in the Windows Driver Kit (WDK) for WindowsВ 10. The library exposes programming interfaces such as routines and callback functions that are used by your HID source driver. When your driver calls a function, the static library forwards the request to the VHF driver that handles the request.
VHF driver (Vhf.sys)
A Microsoft-provided in-box driver. This driver must be loaded as a lower filter driver below your driver in the HID source device stack. The VHF driver dynamically enumerates child devices and creates physical device objects (PDO) for one or more HID devices that are specified by your HID source driver. It also implements the HID Transport mini-driver functionality of the enumerated child devices.
HID class driver pair (Hidclass.sys, Mshidkmdf.sys)
The Hidclass/Mshidkmdf pair enumerates Top-Level Collections (TLC) similar to how it enumerates those collections for a real HID device. A HID client can continue to request and consume the TLCs just like a real HID device. This driver pair is installed as the function driver in the device stack.
NoteВ В In some scenarios, a HID client might need to identify the source of HID data. For example, a system has a built-in sensor and receives data from a remote sensor of the same type. The system might want to choose one sensor to be more reliable. To differentiate between the two sensors connected to the system, the HID client queries for the container ID of the TLC. In this case, a HID source driver can provide the container ID, which is reported as the container ID of the virtual HID device by VHF.
HID client (application)
Queries and consumes the TLCs that are reported by the HID device stack.
Header and library requirements
This procedure describes how to write a simple HID source driver that reports headset buttons to the operating system. In this case, the driver that implements this code can be an existing KMDF audio driver that has been modified to act as a HID source reporting headset buttons by using VHF.
Create a virtual HID device
Initialize a VHF_CONFIG structure by calling the VHF_CONFIG_INIT macro and then call the VhfCreate method. The driver must call VhfCreate at PASSIVE_LEVEL after the WdfDeviceCreate call, typically, in the driver’s EvtDriverDeviceAdd callback function.
In the VhfCreate call, the driver can specify certain configuration options, such as operations that must be processed asynchronously or setting device information (vendor/product IDs).
For example, an application requests a TLC. When the HID class driver pair receives that request, the pair determines the type of request and creates an appropriate HID Minidriver IOCTL request and forwards it to VHF. Upon getting the IOCTL request, VHF can handle the request, rely on the HID source driver to process it, or complete the request with STATUS_NOT_SUPPORTED.
VHF handles these IOCTLs:
If the request is GetFeature, SetFeature, WriteReport, or GetInputReport, and the HID source driver registered a corresponding callback function, VHF invokes the callback function. Within that function, the HID source driver can get or set HID data for the HID virtual device. If the driver doesn’t register a callback, VHF completes the request with status STATUS_NOT_SUPPORTED.
VHF invokes HID source driver-implemented event callback functions for these IOCTLs:
If the driver wants to handle the buffering policy while submitting a buffer to obtain HID Input Report, it must implement the EvtVhfReadyForNextReadReport and specify a pointer in the EvtVhfAsyncOperationGetInputReport member. For more information, see Submit the HID Input Report.
If the driver wants to get or set a HID Feature Report asynchronously, the driver must implement the EvtVhfAsyncOperation function and specify a pointer to the get or set implementation function in the EvtVhfAsyncOperationGetFeature or EvtVhfAsyncOperationSetFeature member of VHF_CONFIG.
If the driver wants to get a HID Input Report asynchronously, the driver must implement the EvtVhfAsyncOperation function and specify a pointer to the function in the EvtVhfAsyncOperationGetInputReport member of VHF_CONFIG.
If the driver wants to get a write a HID Input Report asynchronously, the driver must implement the EvtVhfAsyncOperation function and specify a pointer to the function in the EvtVhfAsyncOperationWriteReport member of VHF_CONFIG.
For any other HID Minidriver IOCTL, VHF completes the request with STATUS_NOT_SUPPORTED.
The virtual HID device is deleted by calling the VhfDelete. The EvtVhfCleanup callback is required if the driver allocated resources for the virtual HID device. The driver must implement the EvtVhfCleanup function and specify a pointer to that function in the EvtVhfCleanup member of VHF_CONFIG. EvtVhfCleanup is invoked before the VhfDelete call completes. For more information, see Delete the virtual HID device.
NoteВ В After an asynchronous operation completes, the driver must call VhfAsyncOperationComplete to set the results of the operation. You can call the method from the event callback or at a later time after returning from the callback.
Submit the HID input report
Submit the HID input report by calling VhfReadReportSubmit.
Typically, a HID device sends information about state changes by sending input reports through interrupts. For example, the headset device might send a report when the state of a button changes. In such an event, the driver’s interrupt service routine (ISR) is invoked. In that routine, the driver might schedule a deferred procedure call (DPC) that processes the input report and submits it to VHF, which sends the information to the operating system. By default, VHF buffers the report and the HID source driver can start submitting HID Input Reports as they come in. This and eliminates the need for the HID source driver to implement complex synchronization.
The HID source driver can submit input reports by implementing the buffering policy for pending reports. To avoid duplicate buffering, the HID source driver can implement the EvtVhfReadyForNextReadReport callback function and keep track of whether VHF invoked this callback. If it was previously invoked, the HID source driver can call VhfReadReportSubmit to submit a report. It must wait for EvtVhfReadyForNextReadReport to get invoked before it can call VhfReadReportSubmit again.
Delete the virtual HID device
Delete the virtual HID device by calling VhfDelete.
VhfDelete can be called synchronous or asynchronously by specifying the Wait parameter. For a synchronous call, the method must be called at PASSIVE_LEVEL, such as from EvtCleanupCallback of the device object. VhfDelete returns after deleting the virtual HID device. If the driver calls VhfDelete asynchronously, it returns immediately and VHF invokes EvtVhfCleanup after the delete operation is complete. The method can be called at maximum DISPATCH_LEVEL. In this case, the driver must have registered and implemented an EvtVhfCleanup callback function when it previously called VhfCreate. Here is the sequence of events when HID source driver wants to delete the virtual HID device: