GetVolumeInformation - предотвратить обращение к CD и floppy
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.01.11 18:05
Оценка:
Здравствуйте, коллеги!

При вызове GetVolumeInformation для флоппи-дисковода и CD-ROM последние начинают проверять наличие диска. И если для CD это вроде быстро проходит, то для флоппи тормозит, обращаясь к дисководу. Можно ли как-то это обойти?
Прверять GetDriveType на REMOVABLE и игнорировать их — не катит, так как HDD тоже могут быть REMOVABLE, а по ним хочется иметь данные.
В принципе, можно не получать данные для диско A, B — но по идее, какой-нибудь LS120 или ZIP тоже может быть без дискеты, и наверное тоже будет тормозить. Как тут лучше поступить, никто не решал подобную задачу?
Маньяк Робокряк колесит по городу
Re: GetVolumeInformation - предотвратить обращение к CD и fl
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.01.11 18:08
Оценка:
Здравствуйте, Marty, Вы писали:

По поводу ZIP, LS120 — я предположил, что подобные устройства со сменным носителем могут иметь букву диска больше чем 'B'.
Маньяк Робокряк колесит по городу
Re: GetVolumeInformation - предотвратить обращение к CD и fl
От: Pavel Dvorkin Россия  
Дата: 15.01.11 15:38
Оценка: 4 (1) +1
Здравствуйте, Marty, Вы писали:

M> Здравствуйте, коллеги!


M> При вызове GetVolumeInformation для флоппи-дисковода и CD-ROM последние начинают проверять наличие диска. И если для CD это вроде быстро проходит, то для флоппи тормозит, обращаясь к дисководу. Можно ли как-то это обойти?

M>Прверять GetDriveType на REMOVABLE и игнорировать их — не катит, так как HDD тоже могут быть REMOVABLE, а по ним хочется иметь данные.
M>В принципе, можно не получать данные для диско A, B — но по идее, какой-нибудь LS120 или ZIP тоже может быть без дискеты, и наверное тоже будет тормозить. Как тут лучше поступить, никто не решал подобную задачу?

В порядке обсуждения.

Есть такая функция — QueryDOSDevice. Она возвращает внутреннеее имя по диска


    wchar_t buf[1000];
    QueryDosDevice(L"C:",buf, 1000);
+        buf    0x0043f398 "\Device\HarddiskVolume2"    wchar_t [1000]
    QueryDosDevice(L"A:",buf, 1000);
+        buf    0x002bf194 "\Device\Floppy0"    wchar_t [1000]
    QueryDosDevice(L"F:",buf, 1000);
+        buf    0x003bf068 "\Device\CdRom0"    wchar_t [1000]
    QueryDosDevice(L"G:",buf, 1000); // flash
+        buf    0x0036f30c "\Device\HarddiskVolume9"    wchar_t [1000]



Увы, я не поручусь за то, что под всеми версиями NT там будет один и тот же текст. Но ИМХО для флоппи слово Floppy или для CDROM слово CDRom там всегда было. Лучше все же проверить.
Функция эта ни к какому физическому устройству не обращается, выдает данные из диспетчера объектов NT
With best regards
Pavel Dvorkin
Re: GetVolumeInformation - предотвратить обращение к CD и fl
От: Alexey Frolov Беларусь  
Дата: 24.01.11 16:30
Оценка:
Здравствуйте, Marty, Вы писали:

M> При вызове GetVolumeInformation для флоппи-дисковода и CD-ROM последние начинают проверять наличие диска. И если для CD это вроде быстро проходит, то для флоппи тормозит, обращаясь к дисководу. Можно ли как-то это обойти?

Что вы имеете ввиду под словом обойти? Никогда не вызывать GetVolumeInformation для такого типа устройств или вызывать только тогда когда там есть носитель?

M>Прверять GetDriveType на REMOVABLE и игнорировать их — не катит, так как HDD тоже могут быть REMOVABLE, а по ним хочется иметь данные.

Вы возможно удивитесь, но HDD подключенный через USB покажет FIXED через функцию GetDriveType. От него конечно можно добиться REMOVABLE, но не с помощью этой функции. Во-первых, для проверки у DeviceNode спрашивается свойство Capabilities и в нем проверяется флаг CM_DEVCAP_REMOVABLE. А во-вторых, в данном случае это надо спрашивать не у нода типа Disk, а у нижележащего нода типа USB Mass Storage (естественно речь идет о USB подключении)
И тем не менее не стоит путать свойство устройства Removable со свойством RemovableMedia, которое означает что в устройстве есть съемный носитель. Опять же, на этом мучения не заканчиваются обычная флешка покажет что у нее есть сменный носитель, хотя по факту это не так, но в винде все реализовано именно так, вставив флэшку вы реально можете из эксплорера выполнить команду eject.

M>В принципе, можно не получать данные для диско A, B — но по идее, какой-нибудь LS120 или ZIP тоже может быть без дискеты, и наверное тоже будет тормозить. Как тут лучше поступить, никто не решал подобную задачу?

по буквам точно лучше не ориентироваться, их можно перетасовать как угодно

операция GetVolumeInformation работает с объектом типа Volume, то есть когда имеется носитель и на нем смонтирована файловая система, в остальных случаях функция будет возвращать ошибку и система ругаться, если не включить подавление критических ошибок с помощью SetErrorMode.
Re[2]: GetVolumeInformation - предотвратить обращение к CD и
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 07.02.11 11:43
Оценка:
Здравствуйте, Alexey Frolov, Вы писали:

Надо перечислить все имеющиеся диски в системе и получить тип и метку тома (если вставлен носитель), и надо чтоб не тормозило
Тип — в принципе не слишком важен, (хотя я сейчас получаю изображение иконки стандартными средствами, потом, возможно, захочу заменить и выбирать как раз по типу диска). Еще по типу я генерирую название, если метка тома не задана.
Принципиально мне не очень важно, какое устройство вставлено, флешка или хард диск, важнее добится максимальной схожести с проводником, с тем, как он показывает диски.
Маньяк Робокряк колесит по городу
Re[2]: GetVolumeInformation - предотвратить обращение к CD и
От: Mr.Delphist  
Дата: 09.02.11 18:45
Оценка:
Здравствуйте, Marty, Вы писали:

M> По поводу ZIP, LS120 — я предположил, что подобные устройства со сменным носителем могут иметь букву диска больше чем 'B'.


Абсолютно не факт. Если Win9x еще имели такую гарантию, то NT-линейка может смонтировать как A: много чего интересного
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.