如何在macOS上以编程方式找到挂载/弹出usb设备?



我试图在macOS上以编程方式卸载/弹出usb设备。使用IOkit,我试图注册到IOServiceMatching(kIOUSBInterfaceClassName)并迭代所有设备,对于每个设备,我试图获得BSD名称并从那里开始:

IORegistryEntrySearchCFProperty(usbDevice,kIOServicePlane,CFSTR(kIOBSDNameKey),kCFAllocatorDefault,kIORegistryIterateRecursively); 

但是我发现在基于英特尔的设备上,注册表搜索不起作用。

我有供应商id,产品id等。

我的问题是:

  1. 有其他选择吗?
  2. 有我可以使用的系统调用吗?也许不同的方法,不使用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,
}

最新更新