Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2014, 13:37   #1
Glaciuse
Пользователь
 
Регистрация: 22.05.2011
Сообщений: 44
По умолчанию Как получить список жестких дисков?

Нужно получить список жестких дисков на локальном компьютере и их разделов в формате:
\Device\Harddisk0\Partition1
\Device\Harddisk1\Partition1
\Device\Harddisk1\Partition2
...
\Device\HarddiskN\PartitionM

Смог найти функцию WinAPI QueryDosDevice, но она не подходит тем, что возвращает строку вида:
\Device\HarddiskVolume1

Так же выяснил что устройства вида \Device\HarddiskN\PartitionM это есть ссылка на устройство вида \Device\HarddiskVolumeX, которое выдает функция QueryDosDevice, но пока не знаю как и можно ли это использовать.

Спасибо за любую помощь.
Glaciuse вне форума Ответить с цитированием
Старый 02.02.2014, 15:00   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Попробовать использовать WMI. Скажем запрос
Код:
select Caption,Size from Win32_DiskPartition
Как заюзать это дело уже обсуждалось: http://yandex.ua/yandsearch?text=WMI...oc=50&lr=20554
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.02.2014, 15:03   #3
ВВС
Пользователь
 
Регистрация: 31.01.2014
Сообщений: 18
По умолчанию

DWORD res=GetLogicalDrives();
и дальше по маске
res & 0x00000001 !=0 есть A
res & 0x00000002 !=0 есть B
res & 0x00000004 !=0 есть C
...
ВВС вне форума Ответить с цитированием
Старый 02.02.2014, 15:44   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от ВВС Посмотреть сообщение
DWORD res=GetLogicalDrives();
А что делаем с другими файловыми системами?
waleri вне форума Ответить с цитированием
Старый 02.02.2014, 17:54   #5
ВВС
Пользователь
 
Регистрация: 31.01.2014
Сообщений: 18
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А что делаем с другими файловыми системами?
FindFirstVolume
FindNextVolume
FindVolumeClose

Они возвращают все, что видят
ВВС вне форума Ответить с цитированием
Старый 02.02.2014, 18:17   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
GetLogicalDrives();
Так он только букву вернет, или вернее код, а автору нужно в виде \Device\Harddisk0\Partition1
Цитата:
FindFirstVolume
Он вроде как возвращает какой-то GUID, если верить MSDN...
Хотя не, все верно: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
I'm learning to live...

Последний раз редактировалось Stilet; 02.02.2014 в 18:19.
Stilet вне форума Ответить с цитированием
Старый 02.02.2014, 18:41   #7
ВВС
Пользователь
 
Регистрация: 31.01.2014
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Так он только букву вернет, или вернее код, а автору нужно в виде \Device\Harddisk0\Partition1

Он вроде как возвращает какой-то GUID, если верить MSDN...
Хотя не, все верно: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Правильно, а по гуиду определяешь девайс
ВВС вне форума Ответить с цитированием
Старый 03.02.2014, 10:06   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от ВВС Посмотреть сообщение
Они возвращают все, что видят
Я в курсе, речь шла о GetLogicalDrives()...
waleri вне форума Ответить с цитированием
Старый 04.02.2014, 18:03   #9
Glaciuse
Пользователь
 
Регистрация: 22.05.2011
Сообщений: 44
По умолчанию

Всем спасибо, однако не понятно как по GUID получить строку вида:
\Device\HarddiskN\PartitionM

Stilet, wmi посмотрел (через wmic.exe)
Кажется, данные в алиасе partition вида:
Код:
Caption
Disk #2, Partition #0
Disk #1, Partition #0
Disk #3, Partition #1
Disk #3, Partition #2
....
и есть то что нужно (только номера разделов не с 0 начинаются, а с 1)
Disk #2, Partition #0 == \Device\Harddisk2\Partition1
Disk #1, Partition #0 == \Device\Harddisk1\Partition1
Disk #3, Partition #1 == \Device\Harddisk3\Partition2
Disk #3, Partition #2 == \Device\Harddisk3\Partition3
...

Жалко что в этом алиасе нет буквы диска, чтоб я, скажем, мог сопоставить F:\ с Disk #3, Partition #1, тогда можно было бы легко сказать что
F:\ == \Device\Harddisk3\Partition2

Все же интересно как по GUID получить \Device\HarddiskN\PartitionM

Последний раз редактировалось Glaciuse; 04.02.2014 в 19:48.
Glaciuse вне форума Ответить с цитированием
Старый 06.02.2014, 00:07   #10
Glaciuse
Пользователь
 
Регистрация: 22.05.2011
Сообщений: 44
По умолчанию

В общем нашел вот такой скрипт на power shell:
Код:
$Hash = @{}
foreach ($Drive in Get-WmiObject win32_diskDrive )
{
    write-host $Drive.caption
    $did = $Drive.deviceid.replace('\','\\') 
    foreach ($Partition in gwmi -query ('associators of {win32_diskdrive.deviceid="'+$did+
        '"} where assocclass = win32_diskDriveToDiskPartition'))
    {
        $l = $Partition.name
        if ($Partition.BootPartition) {$l+=" [Boot]"}
        if ($Partition.PrimaryPartition) {$l+=" [Primary]"}
        write-host "`t$l"
        foreach ($Disk in gwmi -query ('associators of {win32_diskpartition.deviceid="'+$Partition.deviceID+
            '"} where assocclass = win32_logicalDiskToPartition'))
        {
            write-host "`t`t$($Disk.DeviceID) ($($Disk.VolumeName))"
            $Hash[$Disk.DeviceId]+=@($Drive.deviceid)
        }
    }
}
Который выводит имя диска, номер диска с номерами разделов (из этих данных можно составить строку \Device\HarddiskN\PartitionM) и букву диска
Glaciuse вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить список СВОБОДНЫХ букв дисков calypso Общие вопросы Delphi 4 15.08.2013 15:22
Получить список локальных дисков igrok111 Общие вопросы Delphi 7 08.06.2013 15:41
Как получить список подключенных сетевых дисков calypso Работа с сетью в Delphi 1 02.12.2012 19:59
Определение количества жестких дисков 13h bondik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 30.11.2010 10:24
Подключение жестких дисков в Linux MalCer Компьютерное железо 4 06.10.2009 13:38