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

Ни один из вариантов мне не нравится, есть ли варианты получше ?


Anatoly Podgoretsky   (2007-11-20 21:13:00) [41]

> guav  (20.11.2007 13:31:04)  [4]

Почему не годится, не используй только for


Riply   (2007-11-20 18:28:00) [42]

> [14] guav ©   (20.11.07 17:34)
> Вот с чего я начал http://www.codeproject.com/system/EnumDevices.asp(warning: C++ ;-)

Если шарахаться таких warning-ов, то и в Help не зайти будет :)

> [15] guav ©   (20.11.07 17:54)
> Глянь кстати на демку в ветке http://www.delphimaster.ru/cgi-bin/forum.pl?n=5&id=1195566682
> пост [3] - там уже всё готово и на Delphi :) все диски в категории Disk Drives

А все оказывается было прямо под носом :)


guav   (2007-11-20 17:54:00) [43]

Глянь кстати на демку в ветке http://www.delphimaster.ru/cgi-bin/forum.pl?n=5&id=1195566682пост [3] - там уже всё готово и на Delphi :) все диски в категории Disk Drives


guav   (2007-11-20 17:34:00) [44]

> [13] Riply ©   (20.11.07 17:03)
> А кто ж тебя знает, где и что ты откопал :)


Вот с чего я начал http://www.codeproject.com/system/EnumDevices.asp(warning: C++ ;-)


Riply   (2007-11-20 17:03:00) [45]

> [11] guav ©   (20.11.07 16:42)
> Ну а как ты думаешь ? :)

А кто ж тебя знает, где и что ты откопал :)

P.S.
Перевела все же пример с FindFirstVolume\FindNextVolume.
Полностью с тобой согласна: некузявый он :)


guav   (2007-11-20 16:48:00) [46]

Немного не ту фнукцию указал, надо Get, а не Set.
Вообще вот почти всё, только отфильтровать диски и получить именно нужное http://support.microsoft.com/kb/259695


guav   (2007-11-20 16:42:00) [47]

> [9] kernel ©   (20.11.07 16:17)

Про пункт 2 уже сказано.
Но это таки не пункт 2, а 3.
Он не устраивает тем, что мы закладываемся на константу MAX_DRIVES.

Ну и юзер френдли имена сразу через SetupDi - тоже гут.


> [8] Riply ©   (20.11.07 16:13)

Ну а как ты думаешь ? :)
http://msdn2.microsoft.com/en-us/library/ms792978.aspx
PS: В оффлайновом MSDN у меня часть функций, необходимая для получения информации, описана не только в DDK, но и в "обычной" части MSDN, как Device Management Functions. оттуда информация, помимо той что в DDK:

Client Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows Me, or Windows 98.
Server Requires Windows Server "Longhorn", Windows Server 2003, or Windows 2000 Server.
Header Declared in Setupapi.h.

Library Use Setupapi.lib.

DLL Requires Setupapi.dll.


Riply   (2007-11-20 16:23:00) [48]

> [9] kernel ©   (20.11.07 16:17)
> А чем "пункт 2 в [0]" не устраивает, если не секрет?

В ситуации [4] guav © не получим PhysicalDrive2


kernel   (2007-11-20 16:17:00) [49]

А чем "пункт 2 в [0]" не устраивает, если не секрет?


Riply   (2007-11-20 16:13:00) [50]

> [7] guav ©   (20.11.07 15:57)
> Нашел вроде вариант через SetupDi функции.
> Он мне нравится (особенно тем что можно получить юзер-фредли имя).
> Нужно только с ним разобратся :)

Где его (этот вариант) можно посмотреть ? Тоже поразбираюсь :)


guav   (2007-11-20 15:57:00) [51]

> [6] kernel ©   (20.11.07 15:41)


Это я уже видел, пункт 2 в [0]

#define  MAX_IDE_DRIVES  16
...
for (drive = 0; drive < MAX_IDE_DRIVES; drive++)
...
sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);


Не устраивает.


> [5] Riply ©   (20.11.07 14:50)

Это я знаю что работает, пункт 1. в [0]
Не устраивает.

Нашел вроде вариант через SetupDi функции. Он мне нравится (особенно тем что можно получить юзер-фредли имя).
Нужно только с ним разобратся :)


kernel   (2007-11-20 15:41:00) [52]

http://www.winsim.com/diskid32/diskid32.html


Riply   (2007-11-20 14:50:00) [53]

> [4] guav ©   (20.11.07 13:31)
> Значит имеем \\.\PhysicalDrive0 и \\.\PhysicalDrive2 , т.е. 1 пропущен. Результат из NtQuerySystemInformation - 2 устройства.
> T.е. способ for I := 0 to SystemConfigurationInformation^.DiskCount - 1 do не годится, будем дальше искать.

Попробуй поработать с FindFirstVolume\FindNextVolume и
FindFirstVolumeMountPoint\FindNextVolumeMountPoint.

О результатах расскажи.

P.S.
В Help`е пример есть :)

P.S.S.
Ну и разленилась же я, только и делаю, что сижу и жду результатов :)


guav   (2007-11-20 13:31:00) [54]

Уже сам додумался и попробовать на флешках :) у дураков мысли сходятся :)

Значит имеем \\.\PhysicalDrive0 и \\.\PhysicalDrive2 , т.е. 1 пропущен. Результат из NtQuerySystemInformation - 2 устройства.
T.е. способ for I := 0 to SystemConfigurationInformation^.DiskCount - 1 doне годится, будем дальше искать.


Riply   (2007-11-20 12:55:00) [55]

> [2] guav ©   (20.11.07 12:49)
> А что будет если добавили в систему диск,
> затем добавили ещё один, затем первый удалили ?

Ну до таких экспериментов я еще не доходила :)
Это можно сэмулировать с помощью флешек,
ибо они рассматриваются как "физические диски".
Попробуешь - расскажи.


guav   (2007-11-20 12:49:00) [56]

> [1] Riply ©   (20.11.07 12:35)

Ага, уже нашел в примере DeviceIoControl здесь http://www.schevchenko.net.ru/
А что будет если добавили в систему диск, затем добавили ещё один, затем первый удалили ?


Riply   (2007-11-20 12:35:00) [57]

> [0] guav ©   (20.11.07 12:29)
> Как можно получить список всех установленных дисков ?

NtQuerySystemInformation(SystemConfigurationInformation... ?


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

Наверх

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