Программно получить идентификатор поставщика, идентификатор продукта устройства USB на Linux 5.4 - PullRequest
0 голосов
/ 07 февраля 2020

В настоящее время я пытаюсь перечислить все USB-устройства, которые подключены к системе Linux, код будет работать в ядре, как LSM. Код lsm известен как хороший.

Я смотрел на этот вопрос, но ему задавали шесть лет go.

Ответ на вопрос, предложенный с использованием следующий код:

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, поскольку он имеет ту же сигнатуру метода и тип возвращаемого значения. Однако это тоже не работает. Может ли кто-нибудь указать мне правильное направление?

1 Ответ

1 голос
/ 29 февраля 2020

Макрос list_for_each_entry был заменен на idr_for_each_entry для перечисления 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
...