【发布时间】:2014-11-07 21:52:07
【问题描述】:
this question 中有关通过 IOKit 询问已安装驱动器的重要信息。但是有没有办法确定IOIteratorNext() 返回的哪些设备是引导驱动器?或者更好的是,有没有办法在IOServiceGetMatchingServices() 返回的迭代器中只获取引导驱动器?
【问题讨论】:
this question 中有关通过 IOKit 询问已安装驱动器的重要信息。但是有没有办法确定IOIteratorNext() 返回的哪些设备是引导驱动器?或者更好的是,有没有办法在IOServiceGetMatchingServices() 返回的迭代器中只获取引导驱动器?
【问题讨论】:
引导是从媒体完成的,而不是设备本身。设备有媒体,媒体有卷。我不相信 IOKit 中表示卷。
这可能是使用磁盘仲裁最简单的方法。将DADiskCreateFromVolumePath() 与CFURL 一起用于/。然后调用DADiskCopyDescription()获取描述字典。这将包括卷、媒体、设备甚至总线的属性,包括 IOKit 路径(如果需要)。不过,您要查找的信息很有可能直接在描述字典中。
Mark Setchell 引用的 NVRAM 信息也可从 IOKit 获得,路径为 IOService:/AppleACPIPlatformExpert/AppleEFIRuntime/AppleEFINVRAM。有一个属性efi-boot-device。它的值是一个包含服务匹配字典的属性列表。如您所见,它查找提供程序类为IOMedia 的条目,其UUID 属性是某个UUID。
【讨论】:
你可以用这个:
nvram efi-boot-device
efi-boot-device <array><dict><key>IOMatch</key><dict><key>IOProviderClass</key><string>IOMedia</string><key>IOPropertyMatch</key><dict><key>UUID</key><string>78025031-4C42-4FDE-8DD1-A515A2BF6032</string></dict></dict><key>BLLastBSDName</key><string>disk0s3</string></dict></array>%00
【讨论】:
system() 的用途。而且没有什么可安装的,Apple 在所有 Mac 上提供 nvram,所以它不是外部包依赖。
stat("/"),但是如果有某种方法可以在注册表中查找它而无需调用文件系统system() 或stat,它会更安全,因为我怀疑替代方案在一个沙盒。