102 lines
4.1 KiB
C++
102 lines
4.1 KiB
C++
#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();
|
||
}
|