Instale um driver com devcon.exe

3

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\UNKNOWN
Device 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\UNKNOWN
Device 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

    
por hedgar2017 02.06.2018 / 21:17

2 respostas

1

*.inf não tem meta para ROOT\UNKNOWNdevcon install hidriver.inf root\hidriver00 , use %code%

No VirtualBox 5.2.8 + Win7 Pro SP1 x64, eu instalei EcoTUIODriver (baseado em vmulti ) e a configuração foi bem-sucedida sem qualquer dispositivo desconhecido. Eu editei ainda vmulti com WDK 7.1.0 (sem o Visual Studio) e a configuração também foi bem-sucedida. Sugiro que você verifique seus ambientes de criação e teste.

Ver dispositivos por conexão:

    
por 07.06.2018 / 02:17
1

Várias partes do seu arquivo inf parecem um pouco duvidosas, mas eu não sei o suficiente para sugerir uma correção. Mas pode haver outra maneira de gerar um arquivo inf viável do seu projeto.

Sugiro usar o Visual Studio 2017, versão de avaliação se necessário, crie o arquivo inf a partir da sua solução, conforme descrito no artigo da Microsoft Criando um pacote de drivers . o Kit de driver do Windows (WDK) precisa ser instalado após o Visual Studio ser instalado.

Se você tem dois pacotes desse tipo que você precisa instalar como um, você pode combiná-los como descrito em Usando um arquivo INF de extensão .

    
por 10.06.2018 / 10:26