Russian Qt Forum
Ноябрь 10, 2024, 22:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Определение серийного номера USB-накопителя  (Прочитано 14731 раз)
andrew.k
Гость
« : Июль 02, 2010, 10:43 »

Задача:
    Запретить монтирование носителей, которые не зарегистрированы в системе. Монтирование произвожу сам (среда изолированная), поэтому мне достаточно определить можно ли монтировать данное устройство.
Подход:
    Серийный номер определяю при помощи libusb. Далее, если номер зарегистрирован монтирую блочное устройство /dev/sdb1 например.
Условия:
    Система МСВС 14 изм 2. udev там нет. Поэтому через него не реализовать, надо как-то выкручиваться.

Суть проблемы:
    libusb различает устройства по номеру шины и номеру порта юсб. Поэтому все что я могу определить это сколько устройств подключено и их серийные номера. Но не могу определить какому блочному файлу они соотвествуют (/dev/sdb ? /dev/sdc)
Пример:
    Имею два подключенных устройства (флешки). libusb их видит и сообщает, что они висят на шине 001 и на портах 010 и 011. Один серийный номер зарегистрирован, другой нет.
Определяю номера 010 - не зарегистрирована, 011 - зарегистрирована.
Далее я перехожу к этапу монтирования. смотрю список устройств.
Вижу, что имеется /dev/sdb1 и /dev/sdc1.
Вопрос:
    Как определить, кого монтировать можно, а кого нет?
    Как провести соответствие между номером порта юсб и блочным устройством?
    Можно еще попробовать определить минорный номер, но мне это не удалось.
Пытался разобраться с usbdevice_fs.h, пытался извлеч какую-то инфу, но почему-то у меня ничего не вышло. Видимо не смог правильно воспользоваться.
Призыв:
    Помогите! Улыбающийся
« Последнее редактирование: Июль 02, 2010, 10:50 от andrew.k » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Июль 02, 2010, 11:01 »

Цитировать
Можно еще попробовать определить минорный номер, но мне это не удалось.
вот небольшой примерчик для Linux для определения мажорного и минорного номеров устройства:
Код:
    if (!result.isEmpty()) {
        struct stat buf;
        if (::stat(this->m_name.toLocal8Bit().constData(), &buf))
            result.clear();
        else {
            result.append("/LCK.%1.%2");
            result = result.arg(major(buf.st_rdev)).arg(minor(buf.st_rdev));
        }
    }

где m_name - имя у-ва (например /dev/sda)

смотрите в примере на struct stat buf и на major/minor , а на остальное не смотрите.

ЗЫ: пример на Qt был
Записан

ArchLinux x86_64 / Win10 64 bit
andrew.k
Гость
« Ответ #2 : Июль 02, 2010, 11:06 »

Цитировать
Можно еще попробовать определить минорный номер, но мне это не удалось.
вот небольшой примерчик для Linux для определения мажорного и минорного номеров устройства:
Спасибо за ответ. Но это не помогает делу. Определить мажорный номер для блочного устройства действительно не проблема.
Проблема определить минорный при помощи libusb для заданного устройства это проблема или скорее вообще невозможно.
Как мне определить какому устройству в libusb соответствует /dev/sdb?
Мажорный и минорный номер присваивает kernel на сколько я понял по логам, может у кернеля как-то можно запросить?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Июль 02, 2010, 11:23 »

дык:
Код:
...
minor(buf.st_rdev)
...

или я не понял?
---
аа.. вроде понял...

смотрите тогда в сторону : struct stat
там есть поле:
Цитировать
st_ino  
    Serial number for the file.

мож оно?

может даже не понадобится libusb
« Последнее редактирование: Июль 02, 2010, 11:29 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
andrew.k
Гость
« Ответ #4 : Июль 02, 2010, 13:23 »

дык:
Код:
...
minor(buf.st_rdev)
...

или я не понял?
---
аа.. вроде понял...

смотрите тогда в сторону : struct stat
там есть поле:
Цитировать
st_ino  
    Serial number for the file.

мож оно?


может даже не понадобится libusb

Оно! Только где Вы взяли такое поле?
У меня написано:
ino_t     st_ino;     /* inode number */
Боюсь, что это какая-то ошибка.
« Последнее редактирование: Июль 02, 2010, 13:25 от andrew.k » Записан
andrew.k
Гость
« Ответ #5 : Июль 02, 2010, 13:29 »

А если зайти с другой стороны. Допустим исходным значением имя блочного файла /dev/sdb1.
Как определить какому реальному устройству оно сопоставлено? должны же быть какие-то другие функции. ведь open его открывает и как-то узнает, к какому устройству нужно обращаться. Или ядро перенаправляет его запросы, скорее всего, и для него нет разницы что он открывает. Значит надо у ядра эту информацию как-то запросить.

Довольно тривиальная задача с виду, неужели нет решения?
Записан
vladimir_l
Гость
« Ответ #6 : Февраль 09, 2011, 13:50 »

Столкнулся с точно такой же проблемой. Из программы нужно распаролить (пользуюсь libusb), а потом монтировать и открыть устройство usb как флэшку, но как определить что монтировать не знаю. Неужели никто не нашел решение?НепонимающийНепонимающий
Записан
vladimir_l
Гость
« Ответ #7 : Февраль 11, 2011, 10:37 »

Вопрос:
    Как определить, кого монтировать можно, а кого нет?
    Как провести соответствие между номером порта юсб и блочным устройством?
    Можно еще попробовать определить минорный номер, но мне это не удалось.
Призыв:
    Помогите! Улыбающийся

 Плачущий Неужели никто не знает?
Записан
andrew.k
Гость
« Ответ #8 : Февраль 12, 2011, 14:01 »

Вопрос:
    Как определить, кого монтировать можно, а кого нет?
    Как провести соответствие между номером порта юсб и блочным устройством?
    Можно еще попробовать определить минорный номер, но мне это не удалось.
Призыв:
    Помогите! Улыбающийся

 Плачущий Неужели никто не знает?
Я так и не нашел решения.
Как я решил проблему. Как говорится все гениальное просто.
Когда я до этого додумался, удивился, что мне сразу не пришло это в голову.
1. При помощи libusb проверяем подключенные устройства, сверяем с базой зарегистрированных. Если все подключенные устройства "хорошие", то можно монтировать все обнаруженные символьные устройства (sdb, sdc...).
2. Если есть хотя бы одно устройство левое (которого нет в нашей базе), то монтирование запрещается и все примонтированные устройства нужно размонтировать.
Все. Нет проблем Улыбающийся

Еще мне было предложено решение, но мне оно не понравилось, я не стал его использовать.
Это постоянно сканировать /var/log/messages, и отслеживать системные сообщения относящиеся к флешкам, тогда можно установить соответствие между символьным именем и серийным номером.
Записан
Ashborn
Гость
« Ответ #9 : Март 30, 2012, 09:50 »

От себя добавлю ещё 5 копеек, ибо тема редкая гадость, может кому сэкономит пару часов поисков .

В силу специфики работы, как и vladimir_l , занимался монтированием флешки, которая хитро дешифровалась и переподключалась. Для чего в нагрузку к приложению был написан демон-парсер /var/log/messages который, находя новое устройство ("hub.c: new USB device 02:00.0-1, assigned address 10"), искал в следующих строчках сообщение типа ("sd*: sd*1"), а после узнавал про него всё через /proc/bus/usb/devices. Метод плохой, но такого
Цитировать
Если есть хотя бы одно устройство левое (которого нет в нашей базе), то монтирование запрещается и все примонтированные устройства нужно размонтировать.
себе позволить было нельзя. Но если у кого найдётся (ВНЕЗАПНО) ещё один вариант решения — милости прошу отписаться, рефакторинг в данном случае считаю вполне уместным, но, за неимением других вариантов...
Записан
andrew.k
Гость
« Ответ #10 : Март 30, 2012, 11:52 »

От себя добавлю ещё 5 копеек, ибо тема редкая гадость, может кому сэкономит пару часов поисков .

В силу специфики работы, как и vladimir_l , занимался монтированием флешки, которая хитро дешифровалась и переподключалась. Для чего в нагрузку к приложению был написан демон-парсер /var/log/messages который, находя новое устройство ("hub.c: new USB device 02:00.0-1, assigned address 10"), искал в следующих строчках сообщение типа ("sd*: sd*1"), а после узнавал про него всё через /proc/bus/usb/devices. Метод плохой, но такого
У меня тоже был такой вариант решения. Правда это делал всего лишь скрипт. Но я решил, что извлекать информацию из логов более не круто, чем запрещать монтирование новых флеш, при одной запрещенной. Тут я хотя бы уверен.
"А лог-файл и подделать можно" - Матроскин (С)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.055 секунд. Запросов: 23.