我试图在macOS上以编程方式卸载/弹出usb设备。使用IOkit,我试图注册到IOServiceMatching(kIOUSBInterfaceClassName)
并迭代所有设备,对于每个设备,我试图获得BSD名称并从那里开始:
IORegistryEntrySearchCFProperty(usbDevice,kIOServicePlane,CFSTR(kIOBSDNameKey),kCFAllocatorDefault,kIORegistryIterateRecursively);
但是我发现在基于英特尔的设备上,注册表搜索不起作用。
我有供应商id,产品id等。
我的问题是:
- 有其他选择吗? 有我可以使用的系统调用吗?也许不同的方法,不使用IoKit?
感谢我尝试使用Iokit注册:IOServiceMatching(kIOUSBHostDeviceClassName)
和IOServiceMatching(kIOUSBInterfaceClassName);
和IOServiceMatching(kIOUSBDeviceClassName);
首先,这里没有"弹出"的概念。USB本身。挂载、卸载、弹出等都是存储设备/卷的概念,USB大容量存储设备只是一种存储设备,您可以在其上执行这些操作。
因此,您需要查看磁盘仲裁框架,特别是用于弹出的DADiskEject
函数。I/O Kit和磁盘仲裁对象之间有一定的映射关系,但并不是所有的DADisk
对象都必须有相应的I/O Kit对象,因为它们也存在于APFS快照卷、网络挂载等。如果通过I/O Kit查找设备是自然的(例如,因为您对特定的供应商+产品ID对感兴趣),那么您可以使用DADiskCreateFromIOMedia
轻松找到IOMedia
对象对应的DADisk
。
要搜索USB设备的I/O Kit注册表,请使用文档中的匹配字典格式之一。
例如:
@{
@kIOProviderClassKey: @kIOUSBHostDeviceClassName,
@kUSBVendorID : @1234,
@kUSBProductID: @5678,
}