Форум: "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.077 c