Мне нужно получить имя производителя, красивое имя, серийный номер и точку монтирования (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;
}