3

Я разработал HID-драйвер для нескольких устройств, который состоит из двух устройств: драйвера виртуальной мыши и прокси-сервера для него.

Прокси-сервер необходим для приема выходных отчетов от клиентов, поскольку мыши открываются исключительно ядром Windows.

Это мой дескриптор отчета:

HID_REPORT_DESCRIPTOR g_reportDescriptor[] = {
    0x05, 0x01,     // USAGE_PAGE (Generic Desktop)
    0x09, 0x02,     // USAGE (Mouse)
    0xA1, 0x01,     // COLLECTION (Application)
    0x85,               REPORT_ID_MOUSE_INPUT,
    0x09, 0x01,         // USAGE_PAGE (Pointer)
    0xA1, 0x00,         // COLLECTION (Physical)
    0x05, 0x09,             // USAGE_PAGE (Buttons)
    0x19, 0x01,             // USAGE_MINIMUM (1)
    0x29, 0x03,             // USAGE_MAXIMUM (3)
    0x15, 0x00,             // LOGICAL_MINIMUM (0)
    0x25, 0x01,             // LOGICAL_MAXIMUM (1)
    0x95, 0x03,             // REPORT_COUNT (3)
    0x75, 0x01,             // REPORT_SIZE (1)
    0x81, 0x02,             // INPUT (Data, Variable, Absolute)
    0x95, 0x01,             // REPORT_COUNT (1)
    0x75, 0x05,             // REPORT_SIZE (5)
    0x81, 0x01,             // INPUT (Constant)
    0x05, 0x01,             // USAGE_PAGE (Generic Desktop)
    0x09, 0x30,             // USAGE (X)
    0x09, 0x31,             // USAGE (Y)
    0x15, 0x81,             // LOGICAL_MINIMUM (-127)
    0x25, 0x7F,             // LOGICAL_MAXIMUM (127)
    0x75, 0x08,             // REPORT_SIZE (8)
    0x95, 0x02,             // REPORT_COUNT (2)
    0x81, 0x06,             // Input (Data, Variable, Relative)
    0xC0,               // END_COLLECTION
    0xC0,           // END_COLLECTION(8)

    0x05, 0x01,     // USAGE_PAGE (Generic Desktop)
    0x09, 0x00,     // USAGE (Undefined)
    0xa1, 0x01,     // COLLECTION (Application)
    0x85,               REPORT_ID_MOUSE_OUTPUT,
    0x15, 0x00,         // LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,   // LOGICAL_MAXIMUM (255)
    0x95, 0x0b,         // REPORT_COUNT (11)
    0x75, 0x08,         // REPORT_SIZE (8)
    0x09, 0x00,         // USAGE (Undefined)
    0x91, 0x02,         // OUTPUT (Data, Variable, Absolute)
    0xc0            // END_COLLECTION
};

У меня проблема с установкой драйвера с помощью devcon.exe .

Это всегда терпит неудачу, независимо от того, что я делаю. Я вечно играю с моим *.inf файлом и не знаю, что делать дальше. Вот как я запускаю devcon.exe:

.\devcon.exe install .\hidriver.inf "ROOT\UNKNOWN\0000"

Выход:

Device node created. Install is complete when drivers are installed...
Updating drivers for ROOT\UNKNOWN\0000 from D:\share\opt\KMDFDriver\hidriver.inf.
devcon.exe failed.

В результате операции создается новое устройство с именем Unknown device без дочерних элементов.

Когда я устанавливаю драйвер из Device Manager -> Add Legacy Hardware , все в порядке, и создается новое устройство SampleClass с двумя дочерними элементами (общая мышь и устройство, совместимое с HID), поэтому я не думаю, что это так, потому что мой *. В файле *.inf чего-то не хватает.

Вот мой *.inf файл:

[Version]
Signature="$WINDOWS NT$"
Class=%ClassName%
ClassGuid={78A1C341-4539-11d3-B88D-00C04FAD5171}
Provider=%ProviderName%
CatalogFile=hidriver.cat
DriverVer=01/07/2018

[ClassInstall32]
Addreg=ClassReg
[ClassReg]
HKR,,,0,%ClassName%
HKR,,Icon,,-24

[SourceDisksNames]
1=%DiskName%,,,
[SourceDisksFiles]
hidriver.sys=1
[DestinationDirs]
DefaultDestDir=12

[Manufacturer]
%ManufacturerName%=Microsoft,NT$ARCH$.6.1
[Microsoft.NT$ARCH$.6.1]
%DeviceName%=DefaultInstall,root\hidriver

[DefaultInstall.NT]
CopyFiles=Files
[Files]
hidriver.sys

[DefaultInstall.NT.HW]
AddReg=HWAddReg
[HWAddReg]
HKR,,"LowerFilters",0x00010008,"hidriver"

[DefaultInstall.NT.Services]
AddService=hidriver,0x00000000,hidriverService
AddService=mshidkmdf,0x00000002,mshidkmdfService
[hidriverService]
DisplayName=%ServiceName%
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\hidriver.sys
[mshidkmdfService]
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\mshidkmdf.sys

[DefaultInstall.NT.Wdf]
KmdfService=hidriver,KmdfLibrary
[KmdfLibrary]
KmdfLibraryVersion=$KMDFVERSION$

[Strings]
DeviceName="VARIABLE_1"
DiskName="VARIABLE_2"
ProviderName="VARIABLE_3"
ManufacturerName="VARIABLE_4"
ServiceName="VARIABLE_5"
ClassName="VARIABLE_6"

Я также пытался отследить действия Device manager с помощью Process Monitor , но он работает с DrvInst.exe и дюжиной временных файлов, поэтому я не думаю, что это правильный путь.

Что мне делать, ребята?

[Обновление на следующий день]

Я также попробовал pnputil.exe:

pnputil.exe /add-driver D:\share\opt\KMDFDriver\hidriver.inf /install

Microsoft PnP Utility

Adding driver package:  hidriver.inf
Driver package added successfully.
Published Name:         oem40.inf
Driver package installed on matching devices.

Total driver packages:  1
Added driver packages:  1

Несмотря на сладкий вывод, это не имеет никакого эффекта.

[Обновление после первого ответа]

devcon.exe install hidriver.inf root\hidriver работает на win10 и win8.1, но имеет небольшую проблему на win7. На win7 дочерние классы устройств не определяются автоматически, поэтому я получаю два дочерних неизвестных устройства.

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

Update driver
-> Browse for driver software on this computer
-> Let me pick from a list of device drivers on this computer
-> Mice and pointing devices
-> Microsoft
-> HID-compliant mouse

Есть ли надежный способ добавить такие инструкции в INF-файл, чтобы сделать его автоматическим?

[Обновление через некоторое время] Я записал действия Device manager с помощью procmon и получил DrvInst.exe:

DrvInst.exe "2" "211" "HID\VARIABLE_6&COL01\1&1302B6B5&12&0000" "C:\Windows\INF\msmouse.inf" "msmouse.inf:MSMfg.NTamd64:HID_Mouse_Inst:6.1.7600.16385::hid_device_system_mouse" "6fe2f36b3" "0000000000000060" "00000000000005F8" "00000000000005F0"

Я сообщу результаты эксперимента через некоторое время.

[Скриншот устройства]

Здесь нет HWID, только путь к экземпляру устройства

[Обновить с помощью setupapi.dev.log]

Я полностью удалил драйвер, затем удалил журнал, затем установил драйвер и скопировал все содержимое журнала.

setupapi.dev.log

2 ответа2

1

*.inf не имеет цели для ROOT\UNKNOWN\0000 , используйте devcon install hidriver.inf root\hidriver


На VirtualBox 5.2.8 + Win7 Pro SP1 x64 я установил EcoTUIODriver (на основе vmulti), и установка прошла успешно без любого неизвестного устройства. Далее я собрал vmulti с WDK 7.1.0 (без Visual Studio), и установка тоже прошла успешно. Я предлагаю проверить вашу среду сборки и тестирования.

Просмотр устройств по подключению:

1

Различные части вашего inf файла кажутся несколько сомнительными, но я не знаю достаточно, чтобы предложить исправление. Но может быть другой способ создания жизнеспособного файла inf из вашего проекта.

Я бы предложил использовать Visual Studio 2017, пробную версию, если необходимо, а затем создать файл inf из вашего решения, как описано в статье Microsoft Создание пакета драйверов. Windows Driver Kit (WDK) необходимо установить после установки Visual Studio.

Если у вас есть два таких пакета, которые нужно установить как один, вы можете объединить их, как описано в разделе Использование файла INF расширения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .