Как получить информацию о диске, на котором находится исполняемый файл в c ++

Мое приложение будет запускаться с USB-ключа, у которого есть конкретная информация, такая как идентификатор поставщика, идентификатор устройства, ... которая мне нужна.

Я пробовал использовать libusb, но, несмотря на то, что я все еще не могу заставить его работать должным образом, как мне найти правильный USB-накопитель для получения информации?

Обратите внимание, что я хотел бы, чтобы код был кроссплатформенным, поэтому я сначала выбираю libusb.

Редактировать :

Я нашел программу (usbviewer), которая перечисляет все порты USB и конкретную информацию на диске, когда он подключен.

Я читал исходники для linux, информация извлекается напрямую из / proc / bus / usb / devices, это довольно просто.

Но в Windows для получения информации о подключении к USB-узлу требуется около 1000 строк, прежде чем вы получите фактическую информацию в структуре данных (перечислите контроллеры концентраторов, корневые концентраторы, порты ...).

libusb на другой стороне заставляет меня сгенерировать файл INF и установить драйвер через inf-wizard.exe для каждого устройства, прежде чем я смогу получить информацию (хотя я не пробовал на linux).

Изменить 2:

Я нашел способ получить серийный номер устройства в Windows, Linux и Mac OS X (не пробовал MAC OS X, но он должен работать так же, как Linux). В Windows я использую функцию GetVolumeInformation(), в Linux для чтения серийного номера дисков с файловой системой FAT я читаю 4 байта в соответствующем файле / dev / *, начиная с 0x27 или 0x43 в зависимости от версии FAT.

Но для этого чтения требуется root-доступ, которого у программы не будет, и это кажется мне немного ненадежным.

Любые идеи ?


person perelo    schedule 10.05.2012    source источник
comment
Кроссплатформенность, что означает какие платформы? Думаю, вам наплевать на MVS, так что он, вероятно, включает в себя некоторые версии Windows, Linux, OS X? Android? iOS?   -  person Christopher Creutzig    schedule 10.05.2012
comment
если вы берете аргументы argc и argv в main (), первый аргумент всегда указывает на (команду, используемую для выполнения) ваш исполняемый файл с полной информацией о пути. оттуда вы можете использовать что-то вроде libusb   -  person std''OrgnlDave    schedule 10.05.2012
comment
Windows, Linux и OS X не будут использоваться на мобильных устройствах. Как этот путь может связать меня с устройством структуры данных libusb?   -  person perelo    schedule 10.05.2012
comment
@ std''OrgnlDave Стандарт действительно говорит, что он должен быть (если он доступен), но, очевидно, это нарушается с достаточной регулярностью. См. Эту ветку: stackoverflow.com/questions/ 5217395 /   -  person luke    schedule 10.05.2012
comment
нет ответов по моей проблеме? Мне удалось использовать libusb-win32, но мне приходится устанавливать драйвер через inf-wizard.exe (в режиме администратора ...) каждый раз, когда у меня появляется новое устройство USB.   -  person perelo    schedule 11.05.2012
comment
Если вы решили проблему самостоятельно, опубликуйте ее как ответ и отметьте как таковую. Здесь это разрешено и поощряется.   -  person RedX    schedule 23.05.2012


Ответы (1)


Я нашел решение, которое подходит мне для всех заинтересованных.

Для Windows:

Я извлекаю серийный номер устройства из реестра, зная букву диска: HKEY_LOCAL_MACHINE \ SYSTEM \ MountedDevices \ DosDevices \ X:

Для Unix:

Я получаю /dev файл с помощью команды df, затем читаю ссылку в /sys/block, соответствующую /dev файлу (например: диск - / dev / sdb, я читаю ссылку /sys/block/sdb. Затем я читаю файл serial, который находится в каталог, на который указывает ссылка, 6x каталог назад.

Надеюсь, это поможет.

person perelo    schedule 23.05.2012