Используя 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 или чего-либо похожего на него. Но устройство, которое я хочу, вернуто обратно. Если я посмотрю в System Profiler, я увижу устройство, на которое я нацелился, и там появится имя BSD.
Как они это получают?
В качестве альтернативы, есть ли способ обойти необходимость зацикливания этого материала и просто напрямую перейти с устройства BSD на устройство USB?