Надо узнать количество luns
Есть usb mass storage device. Он также понимает scsi команды. Требуется в определенный момент узнать количество его лунов. Т.е. на этом устройстве может быть память или карточка, ее отобразят как диск/диски в системе и её могут разбить так, что получится несколько лунов. А может быть и один..
Подозреваю, что надо открыть(createfile) какую-то шину(или само устройство) и пульнуть в нее запрос. Но какой?
p.s. хотелось бы обойтись без wmi и всяких сторонних библиотек/драйверов.
IOCTL_SCSI_PASS_THROUGH и иже с ним.
"Подозреваю, что надо открыть(createfile) какую-то шину(или само устройство) и пульнуть в нее запрос. Но какой?"
Цитата:
usb mass storage device. Он также понимает scsi команды.
Ну вот у вас есть, например внешний винт или там какая-нить флэшка. Вы знаете, каким образом её(или шину или что угодно) спросить, чтобы в ответ получить информацию о количестве лунов устройства?
Я просто уточнить. Тогда вы сами себе ответили и вам уже ответили - SPTI. Ну а шина и различение устройств на ней опять же зависит от шины и устройства.
http://www.t10.org/ftp/t10/drafts/sam3/sam3r14.pdf
SCSI Architecture Model - 3 (SAM-3)
4.9.3 Minimum LUN addressing requirements
All SCSI devices shall support LUN 0 (i.e., 00000000 00000000h) or the REPORT LUNS well-known logical unit. For SCSI devices that support the hierarchical addressing model the LUN 0 or the REPORT LUNS well-known logical unit shall be the logical unit that an application client addresses to determine information about the SCSI target device and the logical units contained within the SCSI target device.
Цитата:
SCSI Architecture Model - 3 (SAM-3)
4.9.3 Minimum LUN addressing requirements
All SCSI devices shall support LUN 0 (i.e., 00000000 00000000h) or the REPORT LUNS well-known logical unit. For SCSI devices that support the hierarchical addressing model the LUN 0 or the REPORT LUNS well-known logical unit shall be the logical unit that an application client addresses to determine information about the SCSI target device and the logical units contained within the SCSI target device.
т.е. любой scsi полюбому должен содеражать LUN 0 или (независимо от LUN, которому передана) поддерживать комманду Report LUNs.
Цитата: arrjj
http://www.t10.org/ftp/t10/drafts/sam3/sam3r14.pdf
т.е. любой scsi полюбому должен содеражать LUN 0 или (независимо от LUN, которому передана) поддерживать комманду Report LUNs.
т.е. любой scsi полюбому должен содеражать LUN 0 или (независимо от LUN, которому передана) поддерживать комманду Report LUNs.
Большое спасибо, неужели все так просто. Я сам просматривал спецификацию и команды, но небрежно, был уверен, что если есть такие команды, то мне железянщики наши скажут. Попробую в понедельник..
Возник другой, более насущный вопрос - как заставить Windows переспросить луны у устройства?! Т.е. по спец. команде устройство создает еще один лун - надо пнуть систему, чтобы он переспросила устройство и запросило эту информацию (в usb trace это какая-то команда с названием class interface, насколько я помню). Кто может подсказать, как это сделать?
IoInvalidateDeviceRelations это "переспрос" на одном из уровней
Цитата: Phodopus
IoInvalidateDeviceRelations это "переспрос" на одном из уровней
Сей способ подходит если у Mhael свой особенный драйвер устройства. Иначе либо инициировать переподключение устройством, либо делать количество лунок фиксированным и оповещать о вставке/изъятии медии.
Верно, просто имея эту информацию думаю будет легче допрыгать до того, что надо потянуть у драйвера USB-шины, чтобы он, в свою очередь, дернул Invalidate. Конкретно для драйвера-порта USB тактики не знаю.
Интересный вариант, насчет подключения/отключения медии. В принципе у нас только 2 луна по идее будет.
Логика тут такая - ввели пароль и в устройстве появился доп. лун, в винде появилось новое дисковое пространство у устройства, на нем один или несколько логических дисков.. Соотв., ввели пароль и запрос на скрытие - лун исчез, диски пропали. Вот что хочу сделать :)
Сейчас у нас 2 луна, на второй мы даем винде отлуп, мол устройство не доступно или как-то так. После того, как мы решили поднять второй диск, мы говорим на обращение к второму луну, мол все хорошо, выдаем капасити и т.п. Но винда сама совсем не рвется запрашивать какую-то информацию от второго луна :( Только, если в управлении дисками вручную вызвать обновление.
там было нечто вроде "Test Unit Ready" и диаграммы состояний. Вы им следуете?
При включении второго луна у нас вопрос решен с появлением нашего второго диска, более-менее нормально решен вроде. Я открываю этот второй диск как STORAGE и посылаю ему IOCTL_STORAGE_FIND_NEW_DEVICES . Ходо-бедно он появляется, иногда правда с задержкой. Но возникла проблема с отключением :)
Мы по специфической команде начинаем отключать второй диск. Девайс перестает по второму луну отвечать на команды кроме inquiry и там всяких юнит реди, я пытаюсь обновить винду с помощью IOCTL_STORAGE_FIND_NEW_DEVICES и IOCTL_DISK_UPDATE_PROPERTIES , но она не убирает диск и соот. ему логические диски. Что в принципе и понятно, диск как бы есть, просто не отвечает на основные команды.
Пытаюсь послать ему FSCTL_DISMOUNT_VOLUME. Команда вроде проходит, но результата нет. В смысле видимого пользователю - исчезновение дисков в программах. Наверное я что-то делаю не так или надо кинуть еще что-то, типа там.. IOCTL_MOUNTMGR_DELETE_POINTS что-ли? Может кто-то подсказать, что тут сделать? Задача сводиться по-видимому к удалению программно диска, его разделов и соотв. логических дисков. Или просто логических дисков, сойдет даже.. Абы видно не было.