С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99

Получение информации о накопителе, с которого запущена система

02.10.2014, 08:01. Показов 5276. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Какие существуют способы получения информации о накопителе (hdd/ssd) с которого запущена операционная система.
Нужно получить хотя бы имя устройства и InstanceID.

Была идея такая: получить путь по которому хранятся данные системы, вычленить букву раздела и по ней определить какой накопитель имеет эту букву диска путем проверки каждого из перечисления накопителей. Таким образом всю необходимую информацию получить не проблема, но мне кажется это велосипедом. И к тому же, я не нашел способа, как получить буквы разделов для конкретного накопителя.

Прошу помощи!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.10.2014, 08:01
Ответы с готовыми решениями:

Узнать внешний IP компьютера с которого запущена программа
Учусь работать с сокетами. Мне нужно узнать внешний IP адрес компьютера с которого запущена программа. Полазил по поисковикам. Понял что...

Как узнать какая система запущена
Подскажите, как мне сделать так чтоб программа определяла какая система (хр, 7) сейчас работает. Добавлено через 1 минуту Забыл...

При запуске ноутбука выходит ошибка, что система запущена некорректно
Привет всем, такая проблема: при запуске ноутбука(стоит windows 8.1) выходит ошибка, что система запущена некорректно. Я прогуглил,...

16
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
03.10.2014, 01:33
GetSystemWindowsDirectory(...) для получения директории ОС.
GetVolumeInformation(...) для получения более полной информации... Капать можно и дальше.
0
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99
03.10.2014, 08:43  [ТС]
По GetVolumeInformation я могу получить имя тома и его серийник. А как от этой информации перейти к самому устройству, на котором находится этот раздел?
0
03.10.2014, 13:18

Не по теме:

dBuSh83, а ты хорошо погуглил? Когда мне надо было - я за 5 минут нашёл и примеры и описание, и даже созхранил себе на комп отдельным файлом... Не уж то так лень что то делать? - Ну от лени лекарство только "удариться головой об стену".

0
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99
05.10.2014, 12:21  [ТС]
Цитата Сообщение от Izual Посмотреть сообщение
dBuSh83, а ты хорошо погуглил? Когда мне надо было - я за 5 минут нашёл и примеры и описание, и даже созхранил себе на комп отдельным файлом... Не уж то так лень что то делать? - Ну от лени лекарство только "удариться головой об стену".
Само собой я искал, прежде чем спрашивать. Возможно у меня руки не из того места, но я действительно не смог найти нужную информацию. И вместо того чтобы критиковать, можно было помочь нуждающемуся, не все такие пряморукие.

А теперь еще раз о проблеме поподробнее: я посредством SetupDiEnumDeviceInfo перечисляю по guidклассу все накопители(жесткие диски, твердотельные и usb-флешки), но устройство с запущенной системой (предположительно physicalDevice0) мне нужно проигнорировать. Вот именно это я и не могу определить.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
05.10.2014, 13:32
dBuSh83, я так понял что вопрос касается не только установленных ОС, но и "живых"? Если так, то предполагаю что в реестре должна быть инфа, доступ к реестру: RegOpenKeyEx() и далее RegQueryValueEx()
Либо, ну ты сам скажи почему GetSystemWindowsDirectory не подходит, а далее подумай какие параметры отличат устройство, возможно название папки, файлы опр., и т.п.
0
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99
05.10.2014, 13:42  [ТС]
Цитата Сообщение от Izual Посмотреть сообщение
я так понял что вопрос касается не только установленных ОС, но и "живых"?
Да, о ливах я не подумал, но думаю, это не так важно, поэтому можно пока упустить этот нюанс.
Цитата Сообщение от Izual Посмотреть сообщение
Либо, ну ты сам скажи почему GetSystemWindowsDirectory не подходит, а далее подумай какие параметры отличат устройство, возможно название папки, файлы опр., и т.п.
Я не говорю что не подходит. Я не могу понять как получить буквы разделов устройства: По GetSystemWindowsDirectory получаем путь к системе, вычленяем букву диска (могу получить хендл этого раздела) и все, я стопорюсь. Как от полученного SP_DEVINFO_DATA устройства (из перечисления) получить информацию, что на этом устройстве находится тот полученный раздел?
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
05.10.2014, 16:18
Тут пример: http://cpprog.narod.ru/visualc/25.html

Добавлено через 4 минуты
Цитата Сообщение от dBuSh83 Посмотреть сообщение
Как от полученного SP_DEVINFO_DATA устройства (из перечисления) получить информацию, что на этом устройстве находится тот полученный раздел?
Вот этот вопрос не понятен совершенно.
Давай первое, филосовский взгляд: Правильно заданный вопрос - это уже половина ответа.
Второе: ну ты же "вычленил букву", так что же тебе ещё надо? Тебе я так понял надо доп инфу по диску.. так после нахождения буквы раздела - бери и используй GetVolumeInformation()... так как показано в примере.
1
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99
05.10.2014, 16:41  [ТС]
Цитата Сообщение от Izual Посмотреть сообщение
Давай первое, филосовский взгляд: Правильно заданный вопрос - это уже половина ответа.
Да, вполне согласен. Вобщем, рассмотрю на примере:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
int main( int argc, char *argv[ ], char *envp[ ] )
   {
       HDEVINFO hDevInfo;
       SP_DEVINFO_DATA DeviceInfoData;
       DWORD i;
        GUID storegeGUID = /*   Константный GUID класса накопителей */;
        
       hDevInfo = SetupDiGetClassDevs(storegeGUID,
           0, // Enumerator
           0,
           DIGCF_PRESENT | DIGCF_ALLCLASSES );
       
       if (hDevInfo == INVALID_HANDLE_VALUE)
       {
           return 1;
       }
       
       DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
       for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
           &DeviceInfoData);i++)
       {
           if (IsSystemDevice(DeviceInfoData))  //  <= проверка: система запущена с этого устройства?
           {
                DWORD DataT;
            LPTSTR buffer = NULL;
            DWORD buffersize = 0;
           
            while (!SetupDiGetDeviceRegistryProperty(
               hDevInfo,
               &DeviceInfoData,
               SPDRP_DEVICEDESC,
               &DataT,
               (PBYTE)buffer,
               buffersize,
               &buffersize))
                {
                    if (GetLastError() == 
                        ERROR_INSUFFICIENT_BUFFER)
                    {
                        if (buffer) LocalFree(buffer);
                        buffer = LocalAlloc(LPTR,buffersize * 2);
                    }
                    else
                    {
                        break;
                    }
                }
                printf("DEVICEDESC:[%s]\n",buffer);
                if (buffer) LocalFree(buffer);
                
                /*  ... и еще различная информация дальше выводится   */
           }
       }
       
       
       if ( GetLastError()!=NO_ERROR &&
            GetLastError()!=ERROR_NO_MORE_ITEMS )
       {
           return 1;
       }
       
       SetupDiDestroyDeviceInfoList(hDevInfo);
       
       return 0;
   }

В IsSystemDevice(DeviceInfoData) мне нужно проверить, располагается ли на текущем устройстве (DeviceInfoData) запущенная система.

Цитата Сообщение от Izual Посмотреть сообщение
Второе: ну ты же "вычленил букву", так что же тебе ещё надо? Тебе я так понял надо доп инфу по диску.. так после нахождения буквы раздела - бери и используй GetVolumeInformation()... так как показано в примере.
По GetVolumeInformation() я могу получить имя раздела и еще некоторую информацию о разделе, но на каком устройстве этот раздел находится я не вижу способа получить, чтобы в моей функции IsSystemDevice(DeviceInfoData) проверить, является ли то самое устройство (DeviceInfoData) родителем для полученного раздела.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
05.10.2014, 17:02
Я бы попробовал сделать следующим образом.

1) С помощью SHGetFolderPath с CSIDL_WINDOWS получить путь к папке Windows,
путь обрезать до буквы диска, а затем через QueryDosDevice узнать имя
устройства, на которое этот путь указывает. Пускай, например, получится
путь "\Device\HarddiskVolume2".

2) С помощью Setup API перечислить все устройства, поддерживающие интерфейс
GUID_DEVINTERFACE_DISK (SetupDiGetClassDevs + SetupDiEnumDeviceInterfaces).

3) Для каждого найденного диска получить символьную ссылку:
SetupDiGetDeviceInterfaceDetail.

4) Открыть Mount Manager (CreateFile + "\\.\MountPointManager") и с помощью
IOCTL_MOUNTMGR_QUERY_POINTS запросить у него все точки монтирования для
каждого диска. На выходе для каждого диска будет получен массив структур
MOUNTMGR_MOUNT_POINT, каждая из которых описывает один из томов диска или
одну из его точек монтирования (что, по большому счету, одно и то же).
В каждой структуре будет имя тома, его символьная ссылка и ID.

5) Для каждой найденной ссылки определяется имя устройства (QueryDosDevice),
которое затем сравнивается с именем, полученным в пункте 1.
Если найдено совпадение, значит диск, массив структур MOUNTMGR_MOUNT_POINT
которого содержит данную ссылку, и является диском, с которого загружена система.
1
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99
05.10.2014, 17:39  [ТС]
Спасибо! Похоже на то, что мне нужно! Как проверю, отпишусь.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
05.10.2014, 23:12
Сейчас попробовал вариант, который сам написал. Mount Manager-у нужна
ссылка на volume, а не на disk. И для разрешения символьных ссылок мощнее
NtOpenSymbolicLinkObject/NtQuerySymbolicLinkObject, а не QueryDosDevice.
Ну в общем, не работает этот "рецепт". Как будет время, попробую пореверсить,
откуда берет список дисков диспетчер устройств. Он же как-то это делает.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
06.10.2014, 00:08
А ответ от сюда не подойдёт? http://forum.sources.ru/index.php?showtopic=271122

Добавлено через 12 минут
Ну или если хочется пошаманить, почему бы не изучить ветви реестра в "HKEY_LOCAL_MACHINE/HARDWARE" и найти там хард диск и взять его номер оттуда? А там уже по ходу дела посмотреть где хранится код исполнения файла запуска ОС, и плясать дальше?.. Бред сивой кобылы конешно, но если уж WMI не нравится, то бубном надо с фантазией пользоваться)))

Добавлено через 14 минут
Посмотрел (от пива в голове видимо, так бы фильм какой нить смотрел уже, но кончились, даже продолжения кунг-фу панды нет^^), в реестре: "HKEY_LOCAL_MACHINE/SYSTEM/setup" есть значение WorkingDirectory, там написанно С:\Windows\Panther, может это как раз и есть основной сетап файл для винды (юзаю 7). Исходя из этого есть буква дирректории.
Почему я это написал - потому что функция GetSystemWindowsDirectory ищет лишь название папки system32, но ведь если захочется кому то хакнуть, то ясен пень можно создать и на другом диске такую же папку, и функция выдаст не верный результат.

Кстати, автор, нафиг вам вся эта пень-телега с HDD? (ежели вы защищаете свой продукт, то ну если это не фурор в области программинга, то можно и через GetVolumeInformation просто ид тома взять и не париться)
0
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99
08.10.2014, 19:16  [ТС]
Цитата Сообщение от Izual Посмотреть сообщение
Кстати, автор, нафиг вам вся эта пень-телега с HDD? (ежели вы защищаете свой продукт, то ну если это не фурор в области программинга, то можно и через GetVolumeInformation просто ид тома взять и не париться)
По сути для себя делаю, разбираюсь-ковыряюсь в шиндовс апи. Поставил такую задачу для себя: вывести системную информацию для всех дисков, кроме системного.


А способ я нашел: получить хендл с помошью setup api у меня получилось с помощью физического имени SetupDiGetDeviceRegistryProperty(SPDRP_P HYSICAL_DEVICE_OBJECT_NAME) и ntCreateFile (пример).
По хендлу я получил номер диска через DeviceIoControl(IOCTL_STORAGE_GET_DEVICE _NUMBER).
Для нахождения системного диска я взял по GetSystemWindowsDirectory получил букву диска и через createFile получил его хендл.
Затем уже к этому хендлу применил DeviceIoControl(IOCTL_STORAGE_GET_DEVICE _NUMBER) и получил номер диска системного раздела. Если совпало, то диск найден, иначе проверял следующий диск.

Остался один пунктик по поводу того, что шиндовс отказывается выдавать хендл системного раздела с GENERIC_READ или, тем более, GENERIC_WRITE.
2
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
08.10.2014, 21:02
Цитата Сообщение от dBuSh83 Посмотреть сообщение
Остался один пунктик по поводу того, что шиндовс отказывается выдавать хендл системного раздела с GENERIC_READ или, тем более, GENERIC_WRITE.
Так уже много лет:
Changes to the file system and to the storage stack to restrict direct disk
access and direct volume access in Windows Vista and in Windows Server 2008

https://support2.microsoft.com/kb/942448/en

Добавлено через 3 минуты
Цитата Сообщение от dBuSh83 Посмотреть сообщение
Для нахождения системного диска я взял по GetSystemWindowsDirectory получил букву диска и через createFile получил его хендл.
Так здесь получается хэндл тома, а не диска.

Добавлено через 8 минут
Но способ любопытный, надо будет попробовать.
0
5 / 5 / 1
Регистрация: 10.07.2013
Сообщений: 99
11.10.2014, 11:46  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Так уже много лет:
Changes to the file system and to the storage stack to restrict direct disk
access and direct volume access in Windows Vista and in Windows Server 2008
https://support2.microsoft.com/kb/942448/en
Как получить доступ к диску для чтения и записи описан здесь, но, к системному все-равно не получится - система не даст его отмонтировать и залочить.
Цитата Сообщение от Убежденный Посмотреть сообщение
Так здесь получается хэндл тома, а не диска.
Да, тома, а не диска.

Вроде все получается, системный диск адекватно теперь игнорируется.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.10.2014, 11:57
Цитата Сообщение от dBuSh83 Посмотреть сообщение
Как получить доступ к диску для чтения и записи описан здесь, но, к системному все-равно не получится - система не даст его отмонтировать и залочить.
И это правильно.
А статьи, с цитатами вроде "ребята из Майкрософт изрядно наложили в штаны" и
"поскольку вся винда написана через то место, на котором сидят" лучше вообще
не читать, т.к. их авторы, как правило, ничего в безопасности не смыслят.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2014, 11:57
Помогаю со студенческими работами здесь

Какой командой можно определить под каким пользователем (имя) запущена система?
Имеется ли команда, позволяющая узнать под каким пользователем запущена система? Причём рассматриваются два варианта: 1. на локальном...

Бесконечная перезагрузка с сообщением "система запущена некорректно"
Доброго всем времени суток.Проблема возникла при попытке откатить систему к точке восстановления.Так уж получилось,что во время...

Получение информации о ПК
всем привет! Как мне listview получить следующую информацию о ПК: 1. Имя компьютера 2. Имя пользователя 3. Ip адрес 4. Mac адрес ...

Получение информации об ОС
Есть программа которая показывает следующие функции: 1 Имя компьютера 2 Системная информация 3 Системные цвета 4 Директорию Windows...

Получение информации из AD
Доброго дня. Прошу помочь понять, есть ли возможность получения информации о пользователях домена AD (SID, Name, Created и т.п.) c...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru