Я использую: IOServiceGetMatchingServices
kr = IOServiceGetMatchingServices(kIOMasterPortDefault,
IOServiceNameMatching("AppleUSBEHCI"), &io_objects);
Я ищу, как я узнаю информацию о внутреннем жестком диске, так как выше будет проверять USB-устройство.
Кажется, я не могу найти список или что-нибудь, что могло бы сказать мне это.
По сути, я ищу способ получить уникальный идентификатор из системы. В Windows другой разработчик использует идентификатор жесткого диска.
Кто-нибудь может пролить свет на эти ценности?
В командной строке вы можете использовать ioreg
инструмент для изучения реестра IO Kit. Для Lion или Older вы также можете использовать удобный инструмент IORegistryExplorer GUI из пакета Apple IO Tools. (он падает на Горного Льва)
Если посмотреть на свойства внутреннего жесткого диска, это довольно хорошее начало:
ioreg -irc IOAHCIBlockStorageDevice -w 0
Который на моем MacBook Air дает:
+-o IOAHCIBlockStorageDevice <class IORegistryEntry:IOService:IOBlockStorageDevice:IOAHCIBlockStorageDevice, id 0x100000216, registered, matched, active, busy 0 (472 ms), retain 7>
| {
| "IOCFPlugInTypes" = {"24514B7A-2804-11D6-8A02-003065704866"="SMARTLib.plugin"}
| "device-type" = "Generic"| "IOStorageFeatures" = {"Unmap"=Yes}
| "Device Characteristics" = {"Logical Block Size"=512,"Product Name"="APPLE SSD TS256C ","Medium Type"="Solid State","Physical Block Size"=512,"SATA Features"=23,"Serial Number"=" X06S10H7THRZ","Product Revision Level"="CJAA0201"}
| "Protocol Characteristics" = {"Physical Interconnect"="SATA","Physical Interconnect Location"="Internal"}
| "SMART Capable" = Yes
| "IOMinimumSegmentAlignmentByteCount" = 4
| }
|
+-o IOBlockStorageDriver <class IORegistryEntry:IOService:IOStorage:IOBlockStorageDriver, id 0x100000219, registered, matched, active, busy 0 (471 ms), retain 8>
+-o APPLE SSD TS256C Media <class IORegistryEntry:IOService:IOStorage:IOMedia, id 0x10000021a, registered, matched, active, busy 0 (471 ms), retain 11>
+-o IOMediaBSDClient <class IORegistryEntry:IOService:IOMediaBSDClient, id 0x10000021b, registered, matched, active, busy 0 (0 ms), retain 6>
+-o IOGUIDPartitionScheme <class IORegistryEntry:IOService:IOStorage:IOPartitionScheme:IOGUIDPartitionScheme, id 0x10000021d, !registered, !matched, active, busy 0 (3 ms), retain 8>
+-o EFI system partition@1 <class IORegistryEntry:IOService:IOStorage:IOMedia, id 0x100000263, registered, matched, active, busy 0 (0 ms), retain 9>
| +-o IOMediaBSDClient <class IORegistryEntry:IOService:IOMediaBSDClient, id 0x100000266, registered, matched, active, busy 0 (0 ms), retain 6>
+-o Customer@2 <class IORegistryEntry:IOService:IOStorage:IOMedia, id 0x100000264, registered, matched, active, busy 0 (2 ms), retain 11>
| +-o IOMediaBSDClient <class IORegistryEntry:IOService:IOMediaBSDClient, id 0x100000267, registered, matched, active, busy 0 (0 ms), retain 7>
+-o Recovery HD@3 <class IORegistryEntry:IOService:IOStorage:IOMedia, id 0x100000265, registered, matched, active, busy 0 (3 ms), retain 9>
+-o IOMediaBSDClient <class IORegistryEntry:IOService:IOMediaBSDClient, id 0x100000268, registered, matched, active, busy 0 (0 ms), retain 6>
Вы можете получить эти свойства программно через пользовательскую библиотеку IOKit, как вы уже обнаружили для USB.
На несколько более высоком уровне часть информации также доступна через Disk Arbitration Framework, через DADiskCopyDescription
функция. Свойства устройства, предоставляемые через эту функцию, похоже, не документированы за пределами DADisk.h
заголовочный файл, но он довольно понятен, например:
extern const CFStringRef kDADiskDescriptionDeviceGUIDKey; /* ( CFData ) */
extern const CFStringRef kDADiskDescriptionDeviceInternalKey; /* ( CFBoolean ) */
extern const CFStringRef kDADiskDescriptionDeviceModelKey; /* ( CFString ) */
extern const CFStringRef kDADiskDescriptionDevicePathKey; /* ( CFString ) */
extern const CFStringRef kDADiskDescriptionDeviceProtocolKey; /* ( CFString ) */
extern const CFStringRef kDADiskDescriptionDeviceRevisionKey; /* ( CFString ) */
extern const CFStringRef kDADiskDescriptionDeviceUnitKey; /* ( CFNumber ) */
extern const CFStringRef kDADiskDescriptionDeviceVendorKey; /* ( CFString ) */
Я считаю, что вы хотите, чтобы посмотреть на дескриптор устройства и посмотреть, есть ли у него серийный номер. Устройство может предоставить серийный номер, и возможно, что номер может быть не уникальным, если он вообще указан. Если у устройства есть собственный дескриптор, там тоже может быть полезно.
Смотрите следующее по дескрипторам:
http://www.beyondlogic.org/usbnutshell/usb5.shtml
Кажется, есть свойство для получения серийного номера в классе оболочки устройства HID:
Если это не сработает, должен быть способ получить прямой доступ к USB-устройству и запросить необходимые данные.