Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Список всех дисков (не томов, именно физических дисков).


Страницы:   1 2 3

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 функциями.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо