问题描述
我正在尝试调试名为 libusb_kernel_driver_active() 的 libusb 函数。它告诉 USB 设备是否连接了操作系统驱动程序。它需要一个接口号作为它的参数之一。我希望能够找出操作系统的驱动程序当前连接到哪个接口。有没有办法使用终端命令或 IOKit 来做到这一点?
我尝试过 IORegistryExplorer,但它没有列出这些信息。 ioreg 似乎没有列出 USB 接口信息。
也许有人知道 IOKit 函数可以告诉我们我们想要的信息。
解决方法
要查找此信息,请打开 IORegistryExplorer 程序(spotlight 可以找到它)。然后从窗口左上角的下拉菜单中选择 IOService。在搜索栏中输入您的设备名称。如果找到,请在下面的树中选择。然后从搜索字段中删除所有文本以查看所有可用字段。
,IORegistryExplorer 的答案是正确的,但正如问题所暗示的那样,还有其他方法可以在终端上和以编程方式获取信息。
终端 (ioreg
)
命令
ioreg -irc IOUSBDevice
将列出系统检测到的所有 USB 设备,以及 I/O 注册表中的所有客户端对象。这意味着驱动程序客户端直接(kext、dext 或用户空间)或表示复合设备上不同接口的 IOUSBInterface
对象,以及连接到每个接口的驱动程序客户端。
您可以使用 -n
选项代替 -c
来按名称而不是类类型进行搜索,但 USB 级名称通常与设备的零售名称不匹配,或者以某种方式缩写.手动检查所有 USB 设备通常更容易。
以编程方式
在您的程序中,您可以使用如下方式搜索系统中的所有 USB 设备:
io_iterator_t device_iter = IO_OBJECT_NULL;
IOReturn ret = IOServiceGetMatchingServices(kIOMasterPortDefault,IOServiceMatching(kIOUSBDeviceClassName),&device_iter);
if (ret == kIOReturnSuccess && device_iter != IO_OBJECT_NULL)
{
while (io_service_t device = IOIteratorNext(device_iter))
{
io_name_t device_name = "";
IORegistryEntryGetName(device,device_name);
// do something with device_name…
}
}
一旦您选择了您的设备,您就可以使用 IORegistryEntryCreateIterator()
迭代其子对象(可能是递归的),这应该允许您识别正在使用的驱动程序或获取您需要的任何其他信息。>