#include "usbFilter.h" using json = nlohmann::json; usbFilter::usbFilter(/* args */) { } usbFilter::~usbFilter() { } string usbFilter::EnumDriversAndDevices() { json list = json::array(); // 1. 获取USB设备(libudev) { udev* udev_ctx = udev_new(); if (udev_ctx) { udev_enumerate* enumerate = udev_enumerate_new(udev_ctx); udev_enumerate_add_match_subsystem(enumerate, "usb"); udev_enumerate_scan_devices(enumerate); udev_list_entry* devices = udev_enumerate_get_list_entry(enumerate); udev_list_entry* dev_list_entry; udev_list_entry_foreach(dev_list_entry, devices) { const char* path = udev_list_entry_get_name(dev_list_entry); udev_device* dev = udev_device_new_from_syspath(udev_ctx, path); const char* vendor = udev_device_get_sysattr_value(dev, "idVendor"); const char* product = udev_device_get_sysattr_value(dev, "idProduct"); const char* devpath = udev_device_get_syspath(dev); const char* devname = udev_device_get_property_value(dev, "ID_MODEL_FROM_DATABASE"); if (!devname) devname = udev_device_get_property_value(dev, "ID_MODEL"); if (!devname) devname = udev_device_get_property_value(dev, "ID_VENDOR_FROM_DATABASE"); if (!devname) devname = devpath ? devpath : ""; if (vendor && product) { json item; item["VendorId"] = vendor; item["ProductId"] = product; item["DeviceName"] = devname ? devname : ""; item["DevPath"] = devpath ? devpath : ""; item["Subsystem"] = "USB"; list.push_back(item); } udev_device_unref(dev); } udev_enumerate_unref(enumerate); udev_unref(udev_ctx); } } // 2. 获取PCI/PCIe设备(libudev) { udev* udev_ctx = udev_new(); if (udev_ctx) { udev_enumerate* enumerate = udev_enumerate_new(udev_ctx); udev_enumerate_add_match_subsystem(enumerate, "pci"); udev_enumerate_scan_devices(enumerate); udev_list_entry* devices = udev_enumerate_get_list_entry(enumerate); udev_list_entry* dev_list_entry; udev_list_entry_foreach(dev_list_entry, devices) { const char* path = udev_list_entry_get_name(dev_list_entry); udev_device* dev = udev_device_new_from_syspath(udev_ctx, path); const char* vendor = udev_device_get_sysattr_value(dev, "vendor"); const char* product = udev_device_get_sysattr_value(dev, "device"); // 尝试多种方式获取设备名 const char* devpath = udev_device_get_syspath(dev); const char* devname = udev_device_get_property_value(dev, "ID_MODEL_FROM_DATABASE"); if (!devname) devname = udev_device_get_property_value(dev, "ID_MODEL"); if (!devname) devname = udev_device_get_property_value(dev, "ID_VENDOR_FROM_DATABASE"); if (!devname) devname = devpath ? devpath : ""; if (vendor && product) { // vendor和device通常是0x开头的16进制,去掉0x string vendor_id = vendor; string product_id = product; if (vendor_id.find("0x") == 0) vendor_id = vendor_id.substr(2); if (product_id.find("0x") == 0) product_id = product_id.substr(2); json item; item["VendorId"] = vendor_id; item["ProductId"] = product_id; item["DeviceName"] = devname ? devname : ""; item["DevPath"] = devpath ? devpath : ""; item["Subsystem"] = "PCI"; list.push_back(item); } udev_device_unref(dev); } udev_enumerate_unref(enumerate); udev_unref(udev_ctx); } } return list.dump(); }