Соответствует ли этот набор входов/выходов или арбитрам дисков?
Для первого, я не думаю, что существует чистый способ сопоставления объекта IOMedia, поскольку для этого потребуется сопоставление с более чем одним уровнем дерева устройств ввода-вывода (с по меньшей мере одним уровнем между ними) , Таким образом, вам нужно сделать пассивное совпадение с объектом IOMedia, а затем изучить поставщика провайдера (поставщика поставщика провайдера ...), чтобы определить, действительно ли соответствовать, например. матч против:
<key>IOProviderClass</key>
<string>IOMedia</string>
<key>IOPropertyMatch</key>
<dict>
<key>Whole</key>
<true/>
</dict>
, а затем перебирать свой путь вверх по дереву, пока вы не найти узел, который содержит «Протокол Характеристики» словарь и изучить его свойства «Физическая Interconnect», чтобы увидеть, если он говорит, что «USB».
Я не уверен на 100%, что нет более простого способа, но я не знаю об этом, если он существует.
Если вы используете рамки Disk арбитражных легко:
CFMutableDictionaryRef matchingDict =
CFDictionaryCreateMutable(
kCFAllocatorDefault,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFDictionaryAddValue(matchingDict,
kDADiskDescriptionDeviceProtocolKey,
CFSTR(kIOPropertyPhysicalInterconnectTypeUSB));
(цитата из программирования Disk арбитражной Guide). Оттуда вы можете получить базовый объект IOMedia, вызвав функцию DADiskCopyIOMedia, что делает этот, вероятно, лучший API, предполагая, что вы не выполняете сопоставление в ядре.
Для других людей, которые могли бы прочитать этот ответ в будущем, если вы выполняете сопоставление в ядре для kext, который необходимо подключить к контуру IOMedia, просто пройдите цепочку поставщиков в методе зонда и верните либо экземпляр вашего класса (чтобы ваш драйвер подключался), либо NULL (чтобы отклонить объект IOMedia). Очевидно, что это не относится к приложению Cocoa. Ваши благословения. :-)
Да, это путь. Я бы рекомендовал Disk Arbitration также для инструментов пользовательского пространства. – pmdj