![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Список всех дисков (не томов, именно физических дисков).
guav © (2007-11-20 12:29:00)Как можно получить список всех установленных дисков ?
Я находил следующие варианты:
1. Получить список всех томов, затем получить id для каждого диска.
2. Пробовать \\.\PhysicalDrive%d с %d от 0 до первой ошибки
3. Пробовать \\.\PhysicalDrive%d с %d от 0 до MAX_DRIVES
Ни один из вариантов мне не нравится, есть ли варианты получше ?
Riply (2007-11-26 22:05:00) [21]> [36] guav © (26.11.07 18:12)
> http://msdn2.microsoft.com/en-us/library/ms791134.aspx- здесь значение GUID для дисков.
Вот спасибо !
Чувствовала, что должны быть эти константы.
Перерыла Help - не нашла. Смирилась. А MSDN заглянуть, так это еще и сообразить надо :)
guav (2007-11-26 18:12:00) [22]http://msdn2.microsoft.com/en-us/library/ms791134.aspx- здесь значение GUID для дисков. Не перечислять же все учтройства, если можно обойтись дисками.
Riply (2007-11-24 14:54:00) [23]> [34] guav © (24.11.07 14:19)
> А чем в этом случае способ с перебором PhysicalDrive%d лучше ?
В этом случае, я знаю, что перебираю партишены PhysicalDrive%d и мне легко
составить их имена: PhysicalDrive%d\Partition%d
> PS: почту глянь.
ОК
guav (2007-11-24 14:19:00) [24]> [33] Riply © (24.11.07 13:41)
А чем в этом случае способ с перебором PhysicalDrive%d лучше ?
PS: почту глянь.
Riply (2007-11-24 13:41:00) [25]> [32] guav © (24.11.07 13:36)
> (Пока что) я никаких имён не получаю.
При использовании способа Rouse_ получения списков дисков,
я столкнулась с проблеммой получения на нем имен "партишнов".
Сходу решения не увидела :(
guav (2007-11-24 13:36:00) [26](Пока что) я никаких имён не получаю.
Riply (2007-11-24 13:25:00) [27]> [30] guav © (24.11.07 11:49)
> Задача была - перечислить все физические диски, в том числе и те на которых
> никаких партишнов нет и открыть выбраный из них через CreateFile.
> Всё кроме "через CreateFile" уже работает (использую NtOpenFile).
Саш, а как ты получаешь имена "партишнов" после открытия ?
guav (2007-11-24 11:49:00) [28]Задача была - перечислить все физические диски, в том числе и те на которых никаких партишнов нет и открыть выбраный из них через CreateFile.
Всё кроме "через CreateFile" уже работает (использую NtOpenFile).
slow!alfamoon!com (2007-11-24 09:43:00) [29]
> Не поняла, что нам такой просмотр может дать.
список symbolic link"ов, выбрать из них те, что ссылаются на партишены задача тривиальная
Мы хотим по "FileCreateName" получить "PhysicalDriveХ",
не используя способы, отсеянные guav-ом, как "недостойные" :)
исходная задача немного другая была
Riply (2007-11-22 23:41:00) [30]> [27] slow!alfamoon!com (22.11.07 21:38)
> кто мешает просмотреть содержимое соответствующей директории объектов
> \?? или \BaseNamedObjects
Не поняла, что нам такой просмотр может дать.
Мы хотим по "FileCreateName" получить "PhysicalDriveХ",
не используя способы, отсеянные guav-ом, как "недостойные" :)
Допустим, имеем FileCreateName равное '\Device\Ide\IdeDeviceP2T0L0-5'. Что дальше ?
Ради итереса посмотрела содержимое \Device\Ide :
IdeDeviceP1T0L0-12
IdeDeviceP2T0L0-5
IdePort0
IdePort1
IdePort2
IdePort3
PciIde0
PciIde0Channel0-0
PciIde0Channel1-1
PciIde1
PciIde1Channel0-2
PciIde1Channel1-3
А поработать с самим FileCreateName, как с объектом типа директория не получается,
что вообщем-то и не удивительно.
Или я опять чего-то не понимаю ?
slow!alfamoon!com (2007-11-22 21:38:00) [31]кто мешает просмотреть содержимое соответствующей директории объектов
\?? или \BaseNamedObjects
Riply (2007-11-22 08:28:00) [32]> [25] guav © (21.11.07 23:53)
А как по-другому ?
Если я правильно понимаю, то
имя типа "PhysicalDrive" из FileCreateName не получить, т.к. "PhysicalDrive" - символьная ссылка,
а объект не может знать кто и каких ссылок на него наплодил :)
Следовательно, остается только перебор с проверкой валидности.
Все это - ну очень большое IMHO.
P.S.
Совсем запуталась :(
guav (2007-11-21 23:53:00) [33]> [24] Anatoly Podgoretsky © (21.11.07 22:48)
Я вижу два способа использования while можно использовать двумя способами тут, но ни один мне не подохдит:
Count := GetDevicesCount();
Index := 0;
while Count > 0 do
begin
if CreateFile(\\\\.\\PhysicalDrive%d , ... ) then
Dec(Count);
Inc(Index);
end;
Index := 0;
while CreateFile(\\\\.\\PhysicalDrive%d , ... ) do
Inc(Index);
Anatoly Podgoretsky (2007-11-21 22:48:00) [34]> guav (21.11.2007 10:55:18) [18]
Я к тому, что здесь while надо использовать.
Riply (2007-11-21 12:43:00) [35]> [22] guav © (21.11.07 12:38)
> Мне просто CreateFile больше нравится тем что там меньше места для ошибки...
Используй NtOpenDirectoryObject, там вообще негде ошибиться :)
Кстати QueryDosDeviceW работает через нее :)
guav (2007-11-21 12:38:00) [36]Мне просто CreateFile больше нравится тем что там меньше места для ошибки...
Riply (2007-11-21 12:33:00) [37]> [20] guav © (21.11.07 12:24)
> Именно.
> Хотя "саполапный" вызов NtOpenFile мне тоже не очень нравится,
> но это лучше чем "самолапное" перечисление.
Может у нас планы по их дальнейшему использованию различны.
Я то все равно их открываю, перебираю "партишены" и т.д.
guav (2007-11-21 12:24:00) [38]> Их сильная сторона в том, что в самолапном коде наплодим
> ошибок и не сумеем все учесть,
> а там все за нас сделано :)
Именно.
Хотя "саполапный" вызов NtOpenFile мне тоже не очень нравится, но это лучше чем "самолапное" перечисление.
Riply (2007-11-21 11:27:00) [39]> [18] guav © (21.11.07 10:55)
> Открывать пока не наберётся нужное количество ?
> Тоже плохо, не открыться может не только потому что нет.
> Можно конечно анализировать ошибку, почему не открылся, но это уже будет сильно сложный способ,
> применю если не получится более простой с SetupDi функциями.
Ой не знаю.
Как раз сейчас разбираюсь с механикой работы SetupAPI...
Они только внешне простые :)
Там довольно много открывается ключей реестра, идет поиск в них.
Из одноо клуча всю инфу не удается получить (пока :).
Не исключено, что будет проще проверить на существование.
Но выводы пока рано делать. Я только начала смотреть.
Их сильная сторона в том, что в самолапном коде наплодим ошибок и не сумеем все учесть,
а там все за нас сделано :)
guav (2007-11-21 10:55:00) [40]> [17] Anatoly Podgoretsky © (20.11.07 21:13)
Открывать пока не наберётся нужное количество ? Тоже плохо, не открыться может не только потому что нет. Можно конечно анализировать ошибку, почему не открылся, но это уже будет сильно сложный способ, применю если не получится более простой с SetupDi функциями.