Главная страница
    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 ?


 
Riply ©   (2007-11-27 01:13) [41]

> [40] Riply ©   (27.11.07 00:56)
> А каким образом они получают SymLink ?

А ларчик просто открывался: NtOpenSymbolicLinkObject  :)


 
Riply ©   (2007-11-27 01:16) [42]

>[41] Riply ©   (27.11.07 01:13)

Sorry.
Не ту функциюию скопипайстила :)

NtOpenSymbolicLinkObject читать как NtQuerySymbolicLinkObject


 
Riply ©   (2007-11-27 04:01) [43]

ArcName все же не совсем то.
В ней только "стационарные" объекты.
Во всяком случае, у меня Zip disk`а и флешек в ней нет.

Очень не плохо получается, если взять за корень \Device
и перебрать все ее содержимое (не рекурсивно), фильтруя по
OBJECT_DIRECTORY_INFORMATION.TypeName равным Directory.
Остается совсем мало объектов, среди которых
сидят и все HardDisk%d. (у меня присутствуют все).
Что и требовалось :)

А как бонус за все страдания: внутри них, на блюдечке с голубой каемочкой,
находим имена их партишенов
(сканировать с фильтром Obj.TypeName равным SymbolicLink).

P.S.
Реклама:
 Летайте самолетами... Тьфу !
 Пользуйтесь утилитами от Mark Russinovich.
 Смотрите на систему с высоты птичьего полета ! :)


 
slow!alfamoon!com   (2007-11-27 10:34) [44]

Riply,

На мой взгляд, лучше (и удобнее) использовать WinObjEx (можно взять в разделе Инструменты на wasm.ru), чем аналогичный утиль от Руссиновича. Аналогично с autoruns.. Лучше OSAM от online-solutions нежели autoruns от Руссиновича (проверял)


 
Riply ©   (2007-11-27 11:53) [45]

>  [44] slow!alfamoon!com   (27.11.07 10:34)
> Лучше OSAM от online-solutions нежели autoruns от Руссиновича

А можно аргументировать ? :)

P.S.
Я доверяю только трем известным производителям
програмного обеспечения: Microsoft, Borland и Riply :)


 
slow!alfamoon!com   (2007-11-27 16:13) [46]


>
> А можно аргументировать ? :)
>
> P.S.
> Я доверяю только трем известным производителям
> програмного обеспечения: Microsoft, Borland и Riply :)
>


Можно.
1) Количество мест автозагрузки в OSAM больше чем в autoruns
2) Доступ к реестру без использования API (как к файлу)
3) Визуально удобнее и информации больше.


 
guav ©   (2007-11-27 17:05) [47]

Предлагаю для решения задачи сопоставления томов и дисков использовать IOCTL_MOUNTMGR_QUERY_POINTS для сопоставления имён томов и символьных ссылок на них и IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS или IOCTL_VOLUME_LOGICAL_TO_PHYSICAL для сопоставления разделов и номеров физических дисков.


 
slow!alfamoon!com   (2007-11-27 17:11) [48]

Тоже вариант


 
Riply ©   (2007-11-27 17:28) [49]

> [47] guav ©   (27.11.07 17:05)
Тебя же (если я ничего не путаю) не устраивал DeviceIoControl ?
Изменился подход к решению задачи ?

> Предлагаю для решения задачи сопоставления томов и дисков использовать IOCTL_MOUNTMGR_QUERY_POINTS
> для сопоставления имён томов и символьных ссылок на них и IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
> или IOCTL_VOLUME_LOGICAL_TO_PHYSICAL для сопоставления разделов и номеров физических дисков.

Спасибо. Пойду пробовать.


 
guav ©   (2007-11-27 17:43) [50]

> [49] Riply ©   (27.11.07 17:28)


> Изменился подход к решению задачи ?

Нет, это просто другая задача. Не будеv вдаватmся в детали :)


> Спасибо. Пойду пробовать.

Ещё, чтоб те долго не думать, чему слать IOCTL_MOUNTMGR_QUERY_POINTS - шли этому:
CreateFile("\\.\MountPointManager", 0,  FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,  0, 0)


 
guav ©   (2007-11-27 18:17) [51]

Проблема получения номера диска из "\Device\Ide\IdeDeviceP2T0L0-5" тоже решается через IOCTL код.
IOCTL_STORAGE_GET_DEVICE_NUMBER


 
Riply ©   (2007-11-27 22:01) [52]

> [50] guav ©   (27.11.07 17:43)

А чему равен IOCTL_MOUNTMGR_QUERY_POINTS ?    7143432 ?
Дело в том, что не очень люблю определения чего-то через "строки" типа:

#define MOUNTMGRCONTROLTYPE  ((ULONG)"m")

#define IOCTL_MOUNTMGR_QUERY_POINTS \
 CTL_CODE(MOUNTMGRCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)

Так и до ошибки не далеко, а рядом всякие "IOCTL_MOUNTMGR_DELETE_" - ы   :)


 
guav ©   (2007-11-27 22:48) [53]

> [52] Riply ©   (27.11.07 22:01)

Ой не боюсь не скажу сегодня... я как раз снёс предыдущие версии срдеств разработки MS, чтобы поставить VS 2008 Express, и застрял на сносе самой VS 2008 beta, там ошибка в анинсталле и ни туда ни сюда :(

Кстати, здесь можжно глянуть уже переведнные SetupApi, Native API, также в win32api объявление других IOCTL с раскрытым  CTL_CODE, можно по аналогии сделать.
http://jedi-apilib.sourceforge.net/

PS: Почту глянь :)


 
Riply ©   (2007-11-28 19:11) [54]

> [47] guav ©   (27.11.07 17:05)

Еще раз спасибо. Теперь есть полная навигация :)
А ты сам не разбирался с IOCTL_MOUNTMGR_QUERY_POINTS ?
Может подскажешь: в MOUNTMGR_MOUNT_POINT, что они подразумевают под UniqueId ?
И размер у него какой-то странный: 12 Byte.


 
guav ©   (2007-11-28 22:57) [55]

Сорри, сегодня не было времени глянуть эту константу...

Про UniqueId пишут там же, в MSDN :)
http://msdn2.microsoft.com/en-us/library/ms802377.aspx

Я бы воспользовался этим:
If the input triple is empty, the mount manager returns the entire mounted device list.
и дальше бы сам прошелся по томам, анализируя другие два параметры.

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

На правах рекламы: вышла новая Visual Studio, это наверное тебя не интересует, но вместе с ней вышла и новая MSDN Library http://www.microsoft.com/downloads/details.aspx?FamilyID=6ff3bc60-32c8-4c22-8591-a20bf8dff1a2&DisplayLang=en


 
Riply ©   (2007-11-29 00:30) [56]

> [55] guav ©   (28.11.07 22:57)
> Сорри, сегодня не было времени глянуть эту константу...
Да я ее уже проверила: все правильно.

> Про UniqueId пишут там же, в MSDN :)
Нашла. Спасибо.

> Я бы воспользовался этим:
> If the input triple is empty, the mount manager returns the entire mounted device list.
> и дальше бы сам прошелся по томам, анализируя другие два параметры.

Я так и делаю. Поэтому и возник вопрос про UniqueId.

> На правах рекламы: вышла новая Visual Studio, это наверное тебя не интересует,
> но вместе с ней вышла и новая MSDN Library

А чего она такая маленькая ? Всего 2 GB :)


 
guav ©   (2007-11-29 11:43) [57]

> А чего она такая маленькая ? Всего 2 GB :)

А разве старые больше ?
Вот за апрель 2007 такая же http://www.microsoft.com/downloads/details.aspx?FamilyID=B8704100-0127-4D88-9B5D-896B9B388313&displaylang=en а предыдущие ещё меньше.



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

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

Наверх




Память: 0.61 MB
Время: 0.047 c
2-1217587744
Аннушка21
2008-08-01 14:49
2008.09.14
связать раблицы dbf


15-1216798715
axis_of_evil
2008-07-23 11:38
2008.09.14
на моей памяти этот вопрос задавали раз 5, но ..


3-1205735599
Karburator
2008-03-17 09:33
2008.09.14
события открытия и закрытия списка поля в DBGrid-e


3-1205749554
harisma
2008-03-17 13:25
2008.09.14
Выборка из таблицы


15-1216791164
WondeRu
2008-07-23 09:32
2008.09.14
Теперь я еще и MVP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский