powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / WinAPI: Как получить точку монтирования для диска
5 сообщений из 5, страница 1 из 1
WinAPI: Как получить точку монтирования для диска
    #37668621
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При помощи SetupAPI я получил список дисков и отобрал из них подключенные USB накопители. В итоге у меня есть низкоуровневое имя диска, например такое \\?\usbstor#disk&ven_corsair&prod_flash_voyager&rev_0.00#86712732c5c73b&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} , и я могу получить описатель устройства при помощи CreateFile, но как мне добраться до точки монтирования я что-то никак не въеду.

Проще говоря, можно ли по такому имен для usb устройства узнать под какой буквой смонтирован накопитель в ОС ?

Спасибо
--------------------------------------------------------------
o(O_O)o
...
Рейтинг: 0 / 0
WinAPI: Как получить точку монтирования для диска
    #37668694
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumможно ли по такому имен для usb устройства узнать под какой буквой смонтирован накопитель в ОС?Можно при помощи WMI:
http://www.codeproject.com/Articles/63878/Enumerate-and-Auto-Detect-USB-Drives
...
Рейтинг: 0 / 0
WinAPI: Как получить точку монтирования для диска
    #37671949
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тащить в код С/С++ WMI мне не очень хочется, поэтому я пошел другим путем.

Исходя из условий у нас есть низкоуровневый маркер устройства (\\?\usbstor#disk&ven_corsair&prod_flash_voyager...) и полученный через CreateFile описатель этого устройства - hDrive, делаем следующее:

1. Запрашиваем по hDrive уникальный номер этого диска в системе

Код: plaintext
1.
DeviceIoControl(hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, ...);


на выходе имеем указатель на стуктуру STORAGE_DEVICE_NUMBER, поле DeviceNumber это то, что искали.

Дальше уже сложнее, т.к. сам девайс (и собственно его драйвер) ничего не знают о логических разделах (volumes) созданных на нем, т.к. оперируют понятием физического раздела (partitions). Логическими разделами управляет системный MountManager, но он ничего не знает о названии устройств и их описателях (по крайней мере я не нашел способа развязать ему "язык"). Единственное, что он знает - на каком физическом диске расположен тот или иной том . Судя по всему это единственная точка соприкосновения partition'ов с volume'aми, ну не считая данных о размерах самих дисков, но на них полагаться не стоит.

2. Запрашиваем имеющиеся в системе буквы для томов, принадлежащие интересующих нас устройствам.

Код: plaintext
1.
2.
GetLogicalDrives
GetDriveTypes



3. Перебирая буквы и подсовывая их в виде \\.\C:, \\.\D: и т.д. в CreateFile мы получим прямой доступ к дискам и описатель для манипуляций с ним.

Код: plaintext
1.
hVolume = CreateFile("\\\\.\\x:",,,,,);



4. По полученному описателю hVolume обращаемся к менеджеру точек монтирования при помощи IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS.

Код: plaintext
1.
2.
PVOLUME_DISK_EXTENTS vvx = malloc(...);
DeviceIoControl(hVolume, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, 0, 0, vvx, dwOutSize, &dwRequired, NULL))


в итоге мы получим данные о принадлежности точки монтирования к физическому диску, т.е.

Код: plaintext
1.
if (vvx->Extent[x].DiskNumber = DeviceNumber /*из п.1*/)


мы нашли диск, который искали

Знаете способ обойтесь без перебора букв и WMI?
Welcome!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
WinAPI: Как получить точку монтирования для диска
    #38447327
mdvalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CerebrumТащить в код С/С++ WMI мне не очень хочется, поэтому я пошел другим путем.

Исходя из условий у нас есть низкоуровневый маркер устройства (\\?\usbstor#disk&ven_corsair&prod_flash_voyager...) и полученный через CreateFile описатель этого устройства - hDrive, делаем следующее:

1. Запрашиваем по hDrive уникальный номер этого диска в системе

Код: plaintext
1.
DeviceIoControl(hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, ...);


на выходе имеем указатель на стуктуру STORAGE_DEVICE_NUMBER, поле DeviceNumber это то, что искали.

Дальше уже сложнее, т.к. сам девайс (и собственно его драйвер) ничего не знают о логических разделах (volumes) созданных на нем, т.к. оперируют понятием физического раздела (partitions). Логическими разделами управляет системный MountManager, но он ничего не знает о названии устройств и их описателях (по крайней мере я не нашел способа развязать ему "язык"). Единственное, что он знает - на каком физическом диске расположен тот или иной том . Судя по всему это единственная точка соприкосновения partition'ов с volume'aми, ну не считая данных о размерах самих дисков, но на них полагаться не стоит.

2. Запрашиваем имеющиеся в системе буквы для томов, принадлежащие интересующих нас устройствам.

Код: plaintext
1.
2.
GetLogicalDrives
GetDriveTypes



3. Перебирая буквы и подсовывая их в виде \\.\C:, \\.\D: и т.д. в CreateFile мы получим прямой доступ к дискам и описатель для манипуляций с ним.

Код: plaintext
1.
hVolume = CreateFile("\\\\.\\x:",,,,,);



4. По полученному описателю hVolume обращаемся к менеджеру точек монтирования при помощи IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS.

Код: plaintext
1.
2.
PVOLUME_DISK_EXTENTS vvx = malloc(...);
DeviceIoControl(hVolume, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, 0, 0, vvx, dwOutSize, &dwRequired, NULL))


в итоге мы получим данные о принадлежности точки монтирования к физическому диску, т.е.

Код: plaintext
1.
if (vvx->Extent[x].DiskNumber = DeviceNumber /*из п.1*/)


мы нашли диск, который искали

Знаете способ обойтесь без перебора букв и WMI?
Welcome!


Нет ли варианта как можно реализовать нахождение буквы диска имея только DeviceInstanceID вида #USBSTOR#pid_****&vid_**** {GUID} ибо в вашем примере еще имеется hDrive а как быть если пишется программа которая работает по событию WM_DEVICECHANGE и вытаскивается dbcc_name т.е этот ID?
...
Рейтинг: 0 / 0
WinAPI: Как получить точку монтирования для диска
    #38450472
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--нахождение буквы диска имея только DeviceInstanceID в

на одном disk id можно сделать 26 логичских дисков
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / WinAPI: Как получить точку монтирования для диска
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]