Получить данные из дескриптора устройства USB - PullRequest
0 голосов
/ 07 сентября 2018

В моем проекте (C #, приложение WPF) у меня есть устройство, которое отображается как VCP. Мне нужно подключиться к нему. Я определяю последовательный порт с помощью WMI и фильтрую по VID и PID. Это делает работу на 90%. Производитель устройства использует одну и ту же пару VID / PID для всех устройств. Точная модель находится в дескрипторе USB (часть Decsriptor устройства, свойство iProduct). Я не могу найти это нигде, исследуя WMI.

Как мне получить доступ к USB decriptor с помощью .NET? В C # read USB Descriptor ответов предлагают использовать WMI. В описании устройства WMI отсутствует дескриптор USB. Мне не нужно перечислять подключенные USB-устройства, но нужно прочитать определенные данные из дескриптора USB-устройства.

1 Ответ

0 голосов
/ 11 сентября 2018

Очень полезная статья https://lihashgnis.blogspot.com/2018/07/getting-descriptors-from-usb-device.html Я только что добавил код для получения String Descriptor:

    USB_STRING_DESCRIPTOR* stringDescriptor = nullptr;
    int sBufferSize = sizeof(USB_DESCRIPTOR_REQUEST) + MAXIMUM_USB_STRING_LENGTH;
    BYTE *sBuffer = new BYTE[sBufferSize];
    memset(sBuffer, 0, sBufferSize);

    requestPacket = (USB_DESCRIPTOR_REQUEST*)sBuffer;
    stringDescriptor = (USB_STRING_DESCRIPTOR*)((BYTE*)sBuffer + sizeof(USB_DESCRIPTOR_REQUEST));

    requestPacket->SetupPacket.bmRequest = 0x80;
    requestPacket->SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR;
    requestPacket->ConnectionIndex = usbPortNumber;
    requestPacket->SetupPacket.wValue = (USB_STRING_DESCRIPTOR_TYPE << 8); // String Descriptior 0
    requestPacket->SetupPacket.wLength = MAXIMUM_USB_STRING_LENGTH;

    err = DeviceIoControl(hUsbHub, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, sBuffer, sBufferSize, sBuffer, sBufferSize, &bytesReturned, nullptr);

    // Now get iProduct string in language at zero index
    requestPacket->SetupPacket.wValue = (USB_STRING_DESCRIPTOR_TYPE << 8) | deviceDescriptor->iProduct;
    requestPacket->SetupPacket.wIndex = (USHORT)stringDescriptor->bString[0];

    err = DeviceIoControl(hUsbHub, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, sBuffer, sBufferSize, sBuffer, sBufferSize, &bytesReturned, nullptr);

    std::wcout << stringDescriptor->bString
...