From 682df2c04a5f52d9f9cc34a75546666fe803439d Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Sat, 2 Dec 2023 11:05:43 +0800 Subject: [PATCH] support string descriptor --- device/win_usb/win_usb.cpp | 48 ++++++++++++++++++++++++++++++++++++++ device/win_usb/win_usb.h | 8 +++++++ 2 files changed, 56 insertions(+) diff --git a/device/win_usb/win_usb.cpp b/device/win_usb/win_usb.cpp index 5aa8d4b..41bf912 100644 --- a/device/win_usb/win_usb.cpp +++ b/device/win_usb/win_usb.cpp @@ -73,6 +73,20 @@ std::wstring ansi2unicode(const char* ansi, UINT cp = CP_ACP) return unic; } +std::string unicode2ansi(const wchar_t* unic, UINT cp = CP_ACP) +{ + int len = WideCharToMultiByte(cp, 0, unic, lstrlenW(unic), NULL, 0, NULL, NULL); + char *buf = new char[len + 4]; + + memset(buf, 0, len + 4); + len = WideCharToMultiByte(cp, 0, unic, lstrlenW(unic), buf, len, NULL, NULL); + buf[len--] = 0; + + std::string ansi(buf); + delete[] buf; + + return ansi; +} ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // OVERLAPPED ... ovl_cls::ovl_cls(uint32_t type) : ref_(1), io_bytes_(0), type_(type) @@ -387,6 +401,16 @@ bool usb_device::init(void) COPY_MEMBER(dev_desc_, &info->ConnectionInfo->DeviceDescriptor, iSerialNumber); COPY_MEMBER(dev_desc_, &info->ConnectionInfo->DeviceDescriptor, bNumConfigurations); } + PSTRING_DESCRIPTOR_NODE strdesc = info->StringDescs; + while (strdesc) + { + STRCFG sc; + sc.id = strdesc->DescriptorIndex; + sc.val = strdesc->StringDescriptor ? unicode2ansi(strdesc->StringDescriptor->bString) : ""; + str_cfg_.push_back(sc); + + strdesc = strdesc->Next; + } if (info->ConfigDesc) { libusb_config_descriptor* desc = NULL; @@ -469,6 +493,7 @@ void usb_device::clear(void) { close(); + str_cfg_.clear(); if (dev_desc_) delete dev_desc_; dev_desc_ = NULL; @@ -534,6 +559,23 @@ int usb_device::get_config_descriptor(int index, libusb_config_descriptor** desc return LIBUSB_SUCCESS; } +int usb_device::get_config_string(uint8_t desc_index, unsigned char* data, int length) +{ + for (auto& v : str_cfg_) + { + if (v.id == desc_index) + { + if (length < v.val.length()) + memcpy(data, v.val.c_str(), length); + else + strcpy((char*)data, v.val.c_str()); + + return LIBUSB_SUCCESS; + } + } + + return LIBUSB_ERROR_NOT_FOUND; +} int usb_device::open(libusb_device_handle** dev_handle) { if (handle_) @@ -1249,6 +1291,7 @@ void usb_monitor::quit(void) std::lock_guard lock(lock_); for (auto& v : devices_) v->release(); + devices_.clear(); } } @@ -1503,3 +1546,8 @@ int LIBUSB_CALL libusb_cancel_transfer(struct libusb_transfer* transfer/*in wind { return ((usb_device*)transfer)->cancel_io(); } +int LIBUSB_CALL libusb_get_string_descriptor_ascii(libusb_device_handle* dev_handle, + uint8_t desc_index, unsigned char* data, int length) +{ + return ((usb_device*)dev_handle)->get_config_string(desc_index, data, length); +} diff --git a/device/win_usb/win_usb.h b/device/win_usb/win_usb.h index 558d11f..d62af96 100644 --- a/device/win_usb/win_usb.h +++ b/device/win_usb/win_usb.h @@ -104,6 +104,13 @@ class usb_device // consider as libusb_device libusb_device_descriptor *dev_desc_; std::vector cfg_desc_; + typedef struct _str_cfg + { + int id; + std::string val; + }STRCFG; + std::vector str_cfg_; + typedef struct _usb_pipe { UCHAR address; @@ -149,6 +156,7 @@ public: void clear(void); int get_descriptor(libusb_device_descriptor* desc); int get_config_descriptor(int index, libusb_config_descriptor** desc); + int get_config_string(uint8_t desc_index, unsigned char* data, int length); int open(libusb_device_handle** dev_handle); int close(void); int set_timeout(unsigned milliseconds);