C 以编程方式获取Linux 5.4上USB设备的供应商ID、产品ID
我目前正在尝试列出所有连接到Linux系统的usb设备,代码将作为LSM在内核中运行。lsm代码已知良好 我看过这个问题,但它是六年前提出的 问题的答案建议使用以下代码:C 以编程方式获取Linux 5.4上USB设备的供应商ID、产品ID,c,linux-kernel,C,Linux Kernel,我目前正在尝试列出所有连接到Linux系统的usb设备,代码将作为LSM在内核中运行。lsm代码已知良好 我看过这个问题,但它是六年前提出的 问题的答案建议使用以下代码: struct usb_device udev; struct usb_bus *bus; ssize_t ret; static int __init usb_fun_init (void) { int result; __le16 idVendor = 0; __le16
struct usb_device udev;
struct usb_bus *bus;
ssize_t ret;
static int __init usb_fun_init (void)
{
int result;
__le16 idVendor = 0;
__le16 idProduct = 0;
__u8 iManufacturer = 0;
__u8 iSerialNumber = 0;
printk(KERN_INFO "\n************************************ in init\n");
list_for_each_entry(bus, &usb_bus_list, bus_list)
{
printk(KERN_INFO "***************** Begins ****************");
printk(KERN_INFO "Vendor ID = %x", bus->root_hub->descriptor.idVendor);
printk(KERN_INFO "Product ID = %x", bus->root_hub->descriptor.idProduct);
printk(KERN_INFO "Serial Number = %x", bus->root_hub->descriptor.iSerialNumber);
//printk(KERN_INFO "Manu = %s", bus->root_hub->descriptor.iManufacturer);
printk(KERN_INFO "Manu = %s", bus->root_hub->manufacturer);
printk(KERN_INFO "Product = %s", bus->root_hub->product);
printk(KERN_INFO "Serial Number = %s", bus->root_hub->serial);
printk(KERN_INFO "\nManufacturer = %s", udev.bus.iManufacturer);
}
return 0;
}
static void __exit usb_fun_exit (void)
{
printk(KERN_INFO "\n************************************ in exit\n");
}
module_init(usb_fun_init);
module_exit(usb_fun_exit);
MODULE_LICENSE("GPL");
但是,编译过程中出现了错误。从我所看到的情况来看,内核结构已经改变,我已经查看了头文件,我所能看到的唯一可能的候选者是
usb_bus_id
,因为它具有相同的方法签名和返回类型。然而,这也不起作用。有人能给我指出正确的方向吗?每个条目的列表
宏已替换为每个条目的idr\u
,用于列出连接到系统的USB设备
下面的代码列举了USB设备和连接到具有Linux内核的系统的所有子设备。应答代码采用内核模块的形式,但可以很容易地移植到LSM
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/usb.h>
#include <linux/usb/hcd.h>
#include <linux/list.h>
MODULE_LICENSE("GPL");
struct usb_device udev;
struct usb_bus *bus;
ssize_t ret;
static int __init usb_fun_init (void)
{
int id;
int chix;
struct usb_device *dev, *childdev = NULL;
printk(KERN_INFO "\n************************************ in init\n");
mutex_lock(&usb_bus_idr_lock);
idr_for_each_entry(&usb_bus_idr, bus, id)
{
printk(KERN_INFO "***************** Begins ****************");
printk(KERN_INFO "Vendor ID = %x", bus->root_hub->descriptor.idVendor);
printk(KERN_INFO "Product ID = %x", bus->root_hub->descriptor.idProduct);
printk(KERN_INFO "Serial Number = %x", bus->root_hub->descriptor.iSerialNumber);
//printk(KERN_INFO "Manu = %s", bus->root_hub->descriptor.iManufacturer);
printk(KERN_INFO "Manu = %s", bus->root_hub->manufacturer);
printk(KERN_INFO "Product = %s", bus->root_hub->product);
printk(KERN_INFO "Serial Number = %s", bus->root_hub->serial);
dev = bus->root_hub;
usb_hub_for_each_child(dev, chix, childdev)
{
if(childdev)
{
printk(KERN_INFO "***************** Child device ****************");
usb_lock_device(childdev);
printk(KERN_INFO "Vendor ID = %x", childdev->descriptor.idVendor);
printk(KERN_INFO "Product ID = %x", childdev->descriptor.idProduct);
printk(KERN_INFO "Serial Number = %x", childdev->descriptor.iSerialNumber);
printk(KERN_INFO "Manu = %s", childdev->manufacturer);
printk(KERN_INFO "Product = %s", childdev->product);
printk(KERN_INFO "Serial Number = %s", childdev->serial);
usb_unlock_device(childdev);
}
}
}
mutex_unlock(&usb_bus_idr_lock);
return 0;
}
static void __exit usb_fun_exit (void)
{
printk(KERN_INFO "\n************************************ in exit\n");
}
module_init(usb_fun_init);
module_exit(usb_fun_exit);
Feb 29 03:13:46 ubuntu kernel: [ 2743.505160] ***************** Begins ****************
Feb 29 03:13:46 ubuntu kernel: [ 2743.505161] Vendor ID = 1d6b
Feb 29 03:13:46 ubuntu kernel: [ 2743.505161] Product ID = 2
Feb 29 03:13:46 ubuntu kernel: [ 2743.505161] Serial Number = 1
Feb 29 03:13:46 ubuntu kernel: [ 2743.505162] Manu = Linux 5.0.0-23-generic ehci_hcd
Feb 29 03:13:46 ubuntu kernel: [ 2743.505163] Product = EHCI Host Controller
Feb 29 03:13:46 ubuntu kernel: [ 2743.505163] Serial Number = 0000:02:03.0
Feb 29 03:13:46 ubuntu kernel: [ 2743.505164] ***************** Child device ****************
Feb 29 03:13:46 ubuntu kernel: [ 2743.505165]
Feb 29 03:13:46 ubuntu kernel: [ 2743.505165] Vendor Id:26bd, Product Id:9917
Feb 29 03:13:46 ubuntu kernel: [ 2743.505165] Vendor ID = 26bd
Feb 29 03:13:46 ubuntu kernel: [ 2743.505166] Product ID = 9917
Feb 29 03:13:46 ubuntu kernel: [ 2743.505166] Serial Number = 3
Feb 29 03:13:46 ubuntu kernel: [ 2743.505166] Manu =
Feb 29 03:13:46 ubuntu kernel: [ 2743.505167] Product = USB DISK 2.0
Feb 29 03:13:46 ubuntu kernel: [ 2743.505167] Serial Number = 070172966462EB10