Прочитайте информацию об устройстве USB в windows - PullRequest
0 голосов
/ 25 апреля 2020

Мне нужно получить имя производителя, красивое имя, серийный номер и точку монтирования (D: \, E: \, et c.) USB-накопителей fla sh в Windows. Использование winusb отсутствует, потому что эти устройства используют usbstor.sys. Он должен работать со случайными USB-накопителями fla sh.

Я уже использую несколько вызовов setupapi для получения переменной DevicePath. Я использую GUID_DEVINTERFACE_USB_DEVICE, который помогает мне перечислять все подключенные USB-устройства.

Я думаю, что первое, что мне нужно, это каким-то образом получить дескриптор устройства и дескриптор интерфейса для фильтрации запоминающих устройств других USB-устройств. А затем прочитайте информацию о производителе и серийный номер из дескриптора устройства.

Однако я не знаю, как go переслать, и если этот подход доставит меня туда, куда мне нужно.

Код до сих пор :

std::vector<std::string> find_usb_device_paths()
{
    std::vector<std::string> paths;

    HDEVINFO usb_devices = SetupDiGetClassDevs(
        &GUID_DEVINTERFACE_USB_DEVICE,
        nullptr,
        nullptr,
        DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

    if (usb_devices == INVALID_HANDLE_VALUE)
        return paths;

    SP_DEVICE_INTERFACE_DATA device_interface;
    device_interface.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);

    for (int i = 0; ; ++i) {
        SetupDiEnumDeviceInterfaces(usb_devices, nullptr, &GUID_DEVINTERFACE_USB_DEVICE, i, &device_interface);
        if (GetLastError() == ERROR_NO_MORE_ITEMS)
            break;

        DWORD interface_size;
        PSP_DEVICE_INTERFACE_DETAIL_DATA interface_detail {nullptr};
        SP_DEVINFO_DATA device;
        device.cbSize = sizeof(SP_DEVINFO_DATA);

        SetupDiGetDeviceInterfaceDetail(usb_devices, &device_interface, nullptr, 0, &interface_size, nullptr);

        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
            interface_detail = reinterpret_cast<PSP_DEVICE_INTERFACE_DETAIL_DATA>(new char[interface_size]);
            interface_detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
            int success = SetupDiGetDeviceInterfaceDetail(usb_devices, &device_interface, interface_detail, interface_size, nullptr, &device);

            if (!success) {
                delete[] interface_detail;
                break;
            }

            paths.push_back(interface_detail->DevicePath);

        }
        delete [] interface_detail;
    }

    SetupDiDestroyDeviceInfoList(usb_devices);

    return paths;
}
...