Desenvolvi um driver HID de vários dispositivos, que consiste em dois dispositivos: um driver de mouse virtual e um proxy para ele.
O proxy é necessário para aceitar relatórios de saída de clientes, porque os mouses são abertos exclusivamente pelo kernel do Windows.
Este é o meu descritor de relatório:
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
};
Eu tenho um problema com a instalação do meu driver com devcon.exe
.
Sempre falha, não importa o que eu faça. Eu tenho jogado com meu arquivo *.inf
por toda a eternidade e não sei o que fazer a seguir. É assim que eu corro devcon.exe
:
.\devcon.exe install .\hidriver.inf "ROOT\UNKNOWNDevice node created. Install is complete when drivers are installed...
Updating drivers for ROOT\UNKNOWN[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"
00 from D:\share\opt\KMDFDriver\hidriver.inf.
devcon.exe failed.
00"
Saída:
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
Como resultado da operação, ele cria um novo dispositivo chamado Unknown device
sem filhos.
Quando eu instalo meu driver a partir de Device Manager -> Add Legacy Hardware
, está tudo bem e um novo dispositivo SampleClass com dois filhos (um mouse genérico e um dispositivo compatível com HID) é criado, então não acho que seja porque meu *.inf
arquivo não tem nada.
Aqui está o meu arquivo *.inf
:
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
Eu também tentei capturar Device manager
s atividade com Process Monitor
, mas ele faz alguma mágica com DrvInst.exe
e uma dezena de arquivos temporários, então eu não acho que é o caminho certo a seguir.
O que devo fazer, pessoal?
[Atualizar no dia seguinte]
Eu também tentei pnputil.exe
:
pnputil.exe /add-driver D:\share\opt\KMDFDriver\hidriver.inf /install
DrvInst.exe "2" "211" "HID\VARIABLE_6&COL01&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"
Apesar do resultado doce, não tem efeito.
[Atualização após a primeira resposta]
devcon.exe install hidriver.inf root\hidriver
funciona no win10 e win8.1, mas tem um pequeno problema no win7. No win7, as classes de dispositivo para crianças não são detectadas automaticamente, por isso acabo com dois dispositivos desconhecidos secundários.
Embora meu proxy HID seja capaz de aceitar relatórios como sendo um dispositivo desconhecido, o mouse não funciona. Para corrigir isso eu tenho que definir manualmente o driver para o filho do mouse via
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
};
Existe uma maneira robusta de adicionar essas instruções ao arquivo INF para torná-lo automático?
[Atualizar depois de algum tempo]
Capturei a atividade de Device manager
em procmon
e obtive um DrvInst.exe
:
.\devcon.exe install .\hidriver.inf "ROOT\UNKNOWNDevice node created. Install is complete when drivers are installed...
Updating drivers for ROOT\UNKNOWN[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"
00 from D:\share\opt\KMDFDriver\hidriver.inf.
devcon.exe failed.
00"
Vou relatar os resultados da experiência depois de um tempo.
[Captura de tela do dispositivo]
[Atualizarcomosetupapi.dev.log]
Euremoviodrivercompletamente,removiolog,instaleiodriverecopieitodooconteúdodolog.
setupapi.dev.log