Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
WinAPI: Как получить точку монтирования для диска
|
|||
|---|---|---|---|
|
#18+
При помощи 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2012, 18:54 |
|
||
|
WinAPI: Как получить точку монтирования для диска
|
|||
|---|---|---|---|
|
#18+
Cerebrumможно ли по такому имен для usb устройства узнать под какой буквой смонтирован накопитель в ОС?Можно при помощи WMI: http://www.codeproject.com/Articles/63878/Enumerate-and-Auto-Detect-USB-Drives ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2012, 20:27 |
|
||
|
WinAPI: Как получить точку монтирования для диска
|
|||
|---|---|---|---|
|
#18+
Тащить в код С/С++ WMI мне не очень хочется, поэтому я пошел другим путем. Исходя из условий у нас есть низкоуровневый маркер устройства (\\?\usbstor#disk&ven_corsair&prod_flash_voyager...) и полученный через CreateFile описатель этого устройства - hDrive, делаем следующее: 1. Запрашиваем по hDrive уникальный номер этого диска в системе Код: plaintext 1. на выходе имеем указатель на стуктуру STORAGE_DEVICE_NUMBER, поле DeviceNumber это то, что искали. Дальше уже сложнее, т.к. сам девайс (и собственно его драйвер) ничего не знают о логических разделах (volumes) созданных на нем, т.к. оперируют понятием физического раздела (partitions). Логическими разделами управляет системный MountManager, но он ничего не знает о названии устройств и их описателях (по крайней мере я не нашел способа развязать ему "язык"). Единственное, что он знает - на каком физическом диске расположен тот или иной том . Судя по всему это единственная точка соприкосновения partition'ов с volume'aми, ну не считая данных о размерах самих дисков, но на них полагаться не стоит. 2. Запрашиваем имеющиеся в системе буквы для томов, принадлежащие интересующих нас устройствам. Код: plaintext 1. 2. 3. Перебирая буквы и подсовывая их в виде \\.\C:, \\.\D: и т.д. в CreateFile мы получим прямой доступ к дискам и описатель для манипуляций с ним. Код: plaintext 1. 4. По полученному описателю hVolume обращаемся к менеджеру точек монтирования при помощи IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS. Код: plaintext 1. 2. в итоге мы получим данные о принадлежности точки монтирования к физическому диску, т.е. Код: plaintext 1. мы нашли диск, который искали Знаете способ обойтесь без перебора букв и WMI? Welcome! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2012, 11:46 |
|
||
|
WinAPI: Как получить точку монтирования для диска
|
|||
|---|---|---|---|
|
#18+
CerebrumТащить в код С/С++ WMI мне не очень хочется, поэтому я пошел другим путем. Исходя из условий у нас есть низкоуровневый маркер устройства (\\?\usbstor#disk&ven_corsair&prod_flash_voyager...) и полученный через CreateFile описатель этого устройства - hDrive, делаем следующее: 1. Запрашиваем по hDrive уникальный номер этого диска в системе Код: plaintext 1. на выходе имеем указатель на стуктуру STORAGE_DEVICE_NUMBER, поле DeviceNumber это то, что искали. Дальше уже сложнее, т.к. сам девайс (и собственно его драйвер) ничего не знают о логических разделах (volumes) созданных на нем, т.к. оперируют понятием физического раздела (partitions). Логическими разделами управляет системный MountManager, но он ничего не знает о названии устройств и их описателях (по крайней мере я не нашел способа развязать ему "язык"). Единственное, что он знает - на каком физическом диске расположен тот или иной том . Судя по всему это единственная точка соприкосновения partition'ов с volume'aми, ну не считая данных о размерах самих дисков, но на них полагаться не стоит. 2. Запрашиваем имеющиеся в системе буквы для томов, принадлежащие интересующих нас устройствам. Код: plaintext 1. 2. 3. Перебирая буквы и подсовывая их в виде \\.\C:, \\.\D: и т.д. в CreateFile мы получим прямой доступ к дискам и описатель для манипуляций с ним. Код: plaintext 1. 4. По полученному описателю hVolume обращаемся к менеджеру точек монтирования при помощи IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS. Код: plaintext 1. 2. в итоге мы получим данные о принадлежности точки монтирования к физическому диску, т.е. Код: plaintext 1. мы нашли диск, который искали Знаете способ обойтесь без перебора букв и WMI? Welcome! Нет ли варианта как можно реализовать нахождение буквы диска имея только DeviceInstanceID вида #USBSTOR#pid_****&vid_**** {GUID} ибо в вашем примере еще имеется hDrive а как быть если пишется программа которая работает по событию WM_DEVICECHANGE и вытаскивается dbcc_name т.е этот ID? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 18:38 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38450472&tid=2019893]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
161ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
| others: | 11ms |
| total: | 263ms |

| 0 / 0 |
