Windows - Composite RNDIS HID med MS OS 2.0 Descriptors

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg udvikler en USB RNDIS og HID komposit enhed. For RNDIS-enheden bruger jeg MS OS 2.0 Descriptors beskrevet i Microsoft-dokumentet 'Microsoft OS 2.0 Descriptors Specification' dateret april 2017 (linket nederst på https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors). Jeg arbejder med en Windows 10-vært. [5]


Begge enheder genkendes, men kun HID-enheden genkendes korrekt; windows tildeler RNDIS-enheden til en seriel port.


Her er nogle af pertinenterne.
Enhedsbeskrivelse:


.bLength = 18
.bDescriptorType = 1
.bcdUSB = 0x0201
.bDeviceClass = 0xef
.bDeviceSubClass = 2
.bDeviceProtocol = 1
.bMaxPacketSize0 = 64
.idVendor = USB\_DEVICE\_VENDOR\_ID,
.idProduct = USB\_DEVICE\_PRODUCT\_ID,
.bcdDevice = (USB\_DEVICE\_MAJOR\_VERSION << 8) | USB\_DEVICE\_MINOR\_VERSION,
.iManufacturer = 1
.iProduct = 2
.iSerialNumber = 3
.bNumConfigurations = 1


Konfigurationsbeskrivelse


Configuration Header:

    .bLength = 9
    .bDescriptorType = 2
    .wTotalLength = 100
    .bNumInterfaces = 3
    .bConfigurationValue = 1
    .iConfiguration = 0,
    .bmAttributes = 0xc0
    .bMaxPower = 0xfa

Interface Association Descritpor

    .bLength = 8
    .bDescriptorType = 11
    .bFirstInterface = 0
    .bInterfaceCount = 2
    .bFunctionClass = 2
    .bFunctionSubClass = 2
    .bFunctionProtocol = 0xff,
    .iFunction = 0

RNDIS Descriptor

    CDC IF Descriptor

        .bLength = 9
        .bDescriptorType = 4
        .bInterfaceNumber = 0
        .bAlternateSetting = 0,
        .bNumEndpoints =  1
        .bInterfaceClass = 2
        .bInterfaceSubClass = 2
        .bInterfaceProtocol = 0xff,
        .iInterface = 0

    [Remainder of RNDIS Control & Data interface]

HID Descriptor
[HID Descriptor details]


BOS Descriptor


Header

    .bLength = 5
    .bDescriptorType = 15
    .wTotalLength = 33
    .bNumDeviceCaps = 1

Platform Capabilities Descriptor

    .bLength = 28
    .bDescriptorType = 16
    .bDevCapability = 5
    .bReserved = 0,
    .capabilityId = {0xdf, 0x60, 0xdd, 0xd8, 0x89, 0x45, 0xc7, 0x4c, 0x9c, 0xd2, 0x65, 0x9d, 0x9e, 0x64, 0x8a, 0x9f}

Windows Descriptor Set

    .dwWindowsVersion = 0x06030000
    .wLength = 46
    .bMsVendorCode = 1
    .bAltEnumCode = 0


MS Kompatibilitetsbeskrivelse:


Header

    .wLength = 10
    .wDescriptorType = 0
    .dwWindowsVersion = 0x06030000
    .wTotalLength = 46

Configuration Subset Header

    .wLength = 8
    .wDescriptorType = 1
    .bConfigurationValue = 1
    .bReserved = 0,
    .wTotalLength = 36

Function Subset Header

    .wLength = 8
    .wDescriptorType = 2
    .bFirstInterface = 0
    .bReserved = 0,
    .wSubsetLength = 28

Compatibility ID

    .wLength = 20
    .wDescriptorType =  3
    .compatibleId = {'R', 'N', 'D', 'I', 'S', 0, 0, 0},
    .subCompatibleId = {'5', '1', '6', '2', '0', '0', '1', 0}


Hvis jeg bygger min enhed som en RNDIS-enhed, virker alle som forventet - enheden genkendes af Windows som en RNDIS-enhed; Jeg installerer ikke nogen drivere. Her er et resumé af de ændringer, jeg foretager til en RNDIS-eneste enhed (der blev også foretaget størrelsesændringer):



  • Skift enhedsklassefelter for enhedsbeskrivelse

  • Fjern IAD & HID-sektioner i konfigurationsbeskrivelsen

  • Reducer konfigurationsbeskrivelsen bNumInterfaces tæller til 2

  • Fjern undermenuen for konfigurationsundergruppe og & Funktion Subset Header fra MS Compatibility Descriptor



Bemærk, at hvis jeg forlader konfigurationsundergruppens header & Funktion Subset Header i MS Compatibility Descriptor, Windows reagerer som ovenfor - tildeler RNDIS-enheden til en seriel port.


Jeg har forsøgt forskellige permutationer, men kan ikke synes at komme ud over dette punkt. Jeg har endnu ikke forsøgt at oprette en INF til en brugerdefineret enhed, men det er noget, jeg vil undgå.


Eventuelle hjælp eller forslag?


Tak.

Bedste reference


Prøv at ændre bConfigurationValue i dine Microsoft OS 2.0 Descriptors (specifikt Konfiguration Subset Header) fra 1 til 0. Det er faktisk et indeks i rækken af ​​konfigurationer; det er ikke det samme som det, der hedder bConfigurationValue i USB 2.0-specifikationen.


Jeg havde det samme problem som beskrevet her:


https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/ae64282c-3bc3-49af-8391-4d174479d9e7/microsoft-os-20-descriptors-not-working-on-an-interface-of- a-komposit-uSB-enhed? forum=WDK [6]


Jeg kontrollerede ikke resten af ​​dine deskriptorer, så der kan meget godt være andre problemer.