Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
guav ©   (2007-11-20 12:29) [0]

Как можно получить список всех установленных дисков ?

Я находил следующие варианты:
1. Получить список всех томов, затем получить id для каждого диска.
2. Пробовать \\.\PhysicalDrive%d с %d от 0 до первой ошибки
3. Пробовать \\.\PhysicalDrive%d с %d от 0 до MAX_DRIVES

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


 
Riply ©   (2007-11-20 12:35) [1]

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

NtQuerySystemInformation(SystemConfigurationInformation... ?


 
guav ©   (2007-11-20 12:49) [2]

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

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


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

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

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


 
guav ©   (2007-11-20 13:31) [4]

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

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


 
Riply ©   (2007-11-20 14:50) [5]

> [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.
Ну и разленилась же я, только и делаю, что сижу и жду результатов :)


 
kernel ©   (2007-11-20 15:41) [6]

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


 
guav ©   (2007-11-20 15:57) [7]

> [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 функции. Он мне нравится (особенно тем что можно получить юзер-фредли имя).
Нужно только с ним разобратся :)


 
Riply ©   (2007-11-20 16:13) [8]

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

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


 
kernel ©   (2007-11-20 16:17) [9]

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


 
Riply ©   (2007-11-20 16:23) [10]

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

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


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

> [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.


 
guav ©   (2007-11-20 16:48) [12]

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


 
Riply ©   (2007-11-20 17:03) [13]

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

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

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


 
guav ©   (2007-11-20 17:34) [14]

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


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


 
guav ©   (2007-11-20 17:54) [15]

Глянь кстати на демку в ветке http://delphimaster.net/view/4-1195566682/ пост [3] - там уже всё готово и на Delphi :) все диски в категории Disk Drives


 
Riply ©   (2007-11-20 18:28) [16]

> [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://delphimaster.net/view/4-1195566682/
> пост [3] - там уже всё готово и на Delphi :) все диски в категории Disk Drives

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


 
Anatoly Podgoretsky ©   (2007-11-20 21:13) [17]

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

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


 
guav ©   (2007-11-21 10:55) [18]

> [17] Anatoly Podgoretsky ©   (20.11.07 21:13)

Открывать пока не наберётся нужное количество ? Тоже плохо, не открыться может не только потому что нет. Можно конечно анализировать ошибку, почему не открылся, но это уже будет сильно сложный способ, применю если не получится более простой с SetupDi функциями.


 
Riply ©   (2007-11-21 11:27) [19]

> [18] guav ©   (21.11.07 10:55)
> Открывать пока не наберётся нужное количество ?
> Тоже плохо, не открыться может не только потому что нет.
> Можно конечно анализировать ошибку, почему не открылся, но это уже будет сильно сложный способ,
> применю если не получится более простой с SetupDi функциями.

Ой не знаю.
Как раз сейчас разбираюсь с механикой работы SetupAPI...
Они только внешне простые :)
Там довольно много открывается ключей реестра, идет поиск в них.
Из одноо клуча всю инфу не удается получить (пока :).
Не исключено, что будет проще проверить на существование.
Но выводы пока рано делать. Я только начала смотреть.

Их сильная сторона в том, что в самолапном коде наплодим ошибок и не сумеем все учесть,
а там все за нас сделано :)


 
guav ©   (2007-11-21 12:24) [20]

> Их сильная сторона в том, что в самолапном коде наплодим
> ошибок и не сумеем все учесть,
> а там все за нас сделано :)


Именно.
Хотя "саполапный" вызов NtOpenFile мне тоже не очень нравится, но это лучше чем "самолапное" перечисление.


 
Riply ©   (2007-11-21 12:33) [21]

> [20] guav ©   (21.11.07 12:24)
> Именно.
> Хотя "саполапный" вызов NtOpenFile мне тоже не очень нравится,
> но это лучше чем "самолапное" перечисление.

Может у нас планы по их дальнейшему использованию различны.
Я то все равно их открываю, перебираю "партишены" и т.д.


 
guav ©   (2007-11-21 12:38) [22]

Мне просто CreateFile больше нравится тем что там меньше места для ошибки...


 
Riply ©   (2007-11-21 12:43) [23]

> [22] guav ©   (21.11.07 12:38)
> Мне просто CreateFile больше нравится тем что там меньше места для ошибки...

Используй NtOpenDirectoryObject, там вообще негде ошибиться :)
Кстати QueryDosDeviceW работает через нее :)


 
Anatoly Podgoretsky ©   (2007-11-21 22:48) [24]

> guav  (21.11.2007 10:55:18)  [18]

Я к тому, что здесь while надо использовать.


 
guav ©   (2007-11-21 23:53) [25]

> [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);


 
Riply ©   (2007-11-22 08:28) [26]

> [25] guav ©   (21.11.07 23:53)

А как по-другому ?
Если я правильно понимаю, то
имя типа "PhysicalDrive" из FileCreateName не получить, т.к. "PhysicalDrive" - символьная ссылка,
а объект не может знать кто и каких ссылок на него наплодил :)
Следовательно, остается только перебор с проверкой валидности.

Все это - ну очень большое IMHO.

P.S.
Совсем запуталась :(


 
slow!alfamoon!com   (2007-11-22 21:38) [27]

кто мешает просмотреть содержимое соответствующей директории объектов
\?? или \BaseNamedObjects


 
Riply ©   (2007-11-22 23:41) [28]

> [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-24 09:43) [29]


> Не поняла, что нам такой просмотр может дать.


список symbolic link"ов, выбрать из них те, что ссылаются на партишены задача тривиальная

Мы хотим по "FileCreateName" получить "PhysicalDriveХ",
не используя способы, отсеянные guav-ом, как "недостойные" :)


исходная задача немного другая была


 
guav ©   (2007-11-24 11:49) [30]

Задача была - перечислить все физические диски, в том числе и те на которых никаких партишнов нет и открыть выбраный из них через CreateFile.
Всё кроме "через CreateFile" уже работает (использую NtOpenFile).


 
Riply ©   (2007-11-24 13:25) [31]

> [30] guav ©   (24.11.07 11:49)
> Задача была - перечислить все физические диски, в том числе и те на которых
> никаких партишнов нет и открыть выбраный из них через CreateFile.
> Всё кроме "через CreateFile" уже работает (использую NtOpenFile).

Саш, а как ты получаешь имена "партишнов" после открытия ?


 
guav ©   (2007-11-24 13:36) [32]

(Пока что) я никаких имён не получаю.


 
Riply ©   (2007-11-24 13:41) [33]

> [32] guav ©   (24.11.07 13:36)
> (Пока что) я никаких имён не получаю.

При использовании способа Rouse_ получения списков дисков,
я столкнулась с проблеммой получения на нем имен "партишнов".
Сходу решения не увидела :(


 
guav ©   (2007-11-24 14:19) [34]

> [33] Riply ©   (24.11.07 13:41)

А чем в этом случае способ с перебором PhysicalDrive%d лучше ?

PS: почту глянь.


 
Riply ©   (2007-11-24 14:54) [35]

> [34] guav ©   (24.11.07 14:19)
> А чем в этом случае способ с перебором PhysicalDrive%d лучше ?

В этом случае, я знаю, что перебираю партишены PhysicalDrive%d и мне легко
составить их имена: PhysicalDrive%d\Partition%d

> PS: почту глянь.

ОК


 
guav ©   (2007-11-26 18:12) [36]

http://msdn2.microsoft.com/en-us/library/ms791134.aspx - здесь значение GUID для дисков. Не перечислять же все учтройства, если можно обойтись дисками.


 
Riply ©   (2007-11-26 22:05) [37]

> [36] guav ©   (26.11.07 18:12)
> http://msdn2.microsoft.com/en-us/library/ms791134.aspx - здесь значение GUID для дисков.
Вот спасибо !
Чувствовала, что должны быть эти константы.
Перерыла Help - не нашла. Смирилась. А MSDN заглянуть, так это еще и сообразить надо :)


 
slow!alfamoon!com   (2007-11-26 23:36) [38]

Позвольте вмешаться в вашу высоконаучную беседу с предложением воспользоваться WinObjEx от Four-F и внимательно посмотреть на содержимое директории ArcName


 
guav ©   (2007-11-27 00:25) [39]

> [38] slow!alfamoon!com   (26.11.07 23:36)


хорошее прдложение.


 
Riply ©   (2007-11-27 00:56) [40]

> [38] slow!alfamoon!com   (26.11.07 23:36)
Спасибо.

Ну "Name" из "ArcName" получить на сложно.
А каким образом они получают SymLink ?



Страницы: 1 2 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.09.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.053 c
2-1217707537
programmer90
2008-08-03 00:05
2008.09.14
Делфи 2007+Инет+МС Офис


2-1217453505
Alex_Storm
2008-07-31 01:31
2008.09.14
Добавить строки в ListViev


2-1217460977
fluxion
2008-07-31 03:36
2008.09.14
Заливка ячеек DBGrid


2-1217484390
a.a.j.
2008-07-31 10:06
2008.09.14
inifiles vs xml


2-1217571111
kate
2008-08-01 10:11
2008.09.14
Cохранение выбранного элемента ComboBox как название файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский