使用 IOKit,我已经弄清楚了如何获取挂载点的 BSD 设备名称,但后来我无法弄清楚如何获取具有该名称的 USB 设备。
我发现我可以像这样枚举设备(如果代码看起来很奇怪,那是因为它是 Java):
int kr;
IOKit ioKit = IOKit.INSTANCE;
CoreFoundation coreFoundation = CoreFoundation.INSTANCE;
CFDictionary.CFMutableDictionaryRef matchingDict =
ioKit.IOServiceMatching(IOUSBLib.kIOUSBDeviceClassName);
if (matchingDict == null)
{
logger.error("Couldn't create a USB matching dictionary");
return null;
}
PointerByReference iterator = new PointerByReference();
kr = ioKit.IOServiceGetMatchingServices(null, matchingDict, iterator);
if (kr != IOReturn.kIOReturnSuccess)
{
logger.error(String.format("Couldn't enumerate devices: %08x", kr));
return null;
}
while (true)
{
Pointer device = ioKit.IOIteratorNext(iterator.getValue()); // returns an io_object_t
if (device == null)
{
break; // end of the iterator.
}
// do stuff with the device here
kr = ioKit.IOObjectRelease(usbRef);
if (kr != IOReturn.kIOReturnSuccess)
{
logger.warn(String.format("Couldn't release device object: %08x", kr));
}
}
这会返回很多设备,但它们似乎都没有 BSD Name 属性或任何类似的东西。但是我想要的设备被退回了。如果我查看 System Profiler,我确实看到了我所针对的设备,并且 BSD 名称确实出现在其中。
他们是如何得到它的?
或者,有什么方法可以绕过循环这些东西,直接从 BSD 设备到 USB 设备?