0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
|
|||||||||||
1 | |||||||||||
Точка монтирования USB диска SetupAPI30.10.2013, 16:59. Показов 10505. Ответов 38
Метки нет (Все метки)
Вообщем есть DeviceID которое получено через SetupAPI с помощью :
1.
2. Далее я смог получить с помощью этого http://msdn.microsoft.com/en-u... s.85).aspx в итоге получаю что-то вроде
Скорее всего камень предкновения это Volume name: \\?\Volume{4c1b02c1-d990-11dc-99ae-806e6f6e6963}\ но неясно как куда и зачем)))
0
|
30.10.2013, 16:59 | |
Ответы с готовыми решениями:
38
Перехват события монтирования диска Точка монтирования Получение буквы диска через SetupApi Работа с эндпоинтами устройств USB и setupapi |
Ушел с форума
|
|
07.11.2013, 12:02 | 21 |
В обоих случаях символьная ссылка.
Может, правильнее сравнивать не сами ссылки, а объекты, на которые они указывают ? Объект можно найти с помощью QueryDosDevice, ну или посмотреть в WinObj (Sysinternals). Отпишитесь по результатам. Тема интересная, а воспроизвести такое поведение, как в Вашем случае, у меня не на чем.
0
|
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
|
|||||||||||
07.11.2013, 12:30 [ТС] | 22 | ||||||||||
нету ХР?
Ну я как подумал решить эту проблему. 1. Приходит событие подключения съемного диска DBT_DEVTYP_VOLUME 2. Из него я извлекаю букву диска (Е: или F: например) 3. Отправляю букву в функцию с MOUNTMNGR там идет перебор всех подключенных дисков и если в строке buffer типа (\DosDevices\A есть совпадение с нашей буквой то возвращается символьная ссылка устройства (\??\****#*****#{***})
4.1 Если у нас 7 то мы ничего не делаем а просто извлекаем информацию об этом устройстве с помощью SetupDiGetClassDevs (указывая Enumerate = DeviceInstanseID) SetupDiEnumDeviceInfo SetupDiGetDeviceRegistryProperty Ну мне достаточно Friendlyname, Class, Enumeratorname 4.2 А вот если у нас ХР тогда мы заведомо знаем что полученное в функции это USBSTOR#RemovableMedia#******#{***} и тогда отправляем эту символьную ссылку в функцию которая находит DeviceInstanceID родителя этого RemovableMedia (при помощи SetupDiGetClassDevs SetupDiEnumDeviceInterfaces SetupDiGetDeviceInterfaceDetail ) И в итоге получаю DeviceInstanceID который возвращаю в функцию которая на шаге(4.1) !!Но вот неизвестно будет ли такая штука работать с переносными HDD которые определяются как логические диски. Будет ли приходить событие DBT_DEVTYP_VOLUME при их подключении или нет. *Для тех устройств которые уже подключены до запуска программы еще не думал как реализовать. PS что за объекты? это \Device\HarddiskVolume1 ? я думаю от них некуда шагать. функция поиска строки в подстроке)
0
|
Ушел с форума
|
|
07.11.2013, 13:28 | 23 |
Только виртуальная. И для тех устройств, что я подключал, обе ссылки всегда
получаются идентичными. Кстати, диспетчер оборудования ведь как-то умеет определять тома дисков. На досуге посмотрю каким-нибудь API Monitor-ом, как он это делает. Что-то мне подсказывает, что все должно быть проще, через IOCTL-запросы к девайсам, разрешение символьных ссылок и прочую простую логику. Способ, который Вы привели, возможно и рабочий, но уж больно он заумный для такой стандартной операции. Ну вот у нас есть две символьные ссылки. Одна получена из SetupDiGetDeviceInterfaceDetail, вторая у mount manager-а. Их нужно сравнить. На Win7 они (для данного конкретного случая) одинаковы, а на WinXP разные (опять же, я рассматриваю эту ситуацию как некий специальный случай, что она не обязана повторяться на других дисках). Теперь вызовем на обеих ссылках QueryDosDevice и получим имя устройства, на которое они указывают. И вот полученные имена уже можно сравнивать. Повторяю, это лишь предположение, так как проверить мне не на чем.
0
|
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
|
|
07.11.2013, 16:37 [ТС] | 24 |
Может быть у меня не правильный MOUNTMGR?
А у вас на ХР когда флешку вставляете появляется в диспетчере как у меня отдельный раздел с RemovableMedia?
0
|
Ушел с форума
|
|
07.11.2013, 16:56 | 25 |
0
|
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
|
|
07.11.2013, 17:01 [ТС] | 26 |
Ах ну да точно, уже забыл о обычных виртуалках ибо сам с мака работаю и виртуалкой стоит и ХР и 7)) и тут позволяет такое делать) VMwareFusion)
0
|
Ушел с форума
|
|
07.11.2013, 17:26 | 27 |
VMWare и под Windows позволяет прокидывать устройства, насколько я знаю.
Но я пользуюсь Hyper-V на 2008-ом серваке, там этой возможности нет. А вживую видел XP где-то год назад Так что результаты изысканий в этой теме очень интересуют. Я позже покопаю диспетчер устройств, если удастся что-то найти - отпишусь.
0
|
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
|
|
07.11.2013, 18:55 [ТС] | 28 |
Испытал DBT_DEVTYPE_VOLUME событие приходит кстати во всех случая появления нового диска
1. Флешка 2. Внешний жесткий диск 3. Флешка-модем монтирующаяся как CD-привод!!
0
|
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
|
|
08.11.2013, 19:54 [ТС] | 29 |
Вообщем поставил виртуалкой Vista, всё также как и на Windows 7
Т е никаких RemovableMedia так что получается это специфика Windows XP (то что появляется эта дополнительная ветка в Диспетчере устройств) Ну придется находить родителя RemovableMedia немного муторно но будет точно работать)
0
|
Ушел с форума
|
|
08.11.2013, 20:05 | 30 |
Вы так и не проверили, что выдает QueryDosDevice, если ей "скормить"
обе символьные ссылки, которые получаются на XP...
0
|
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
|
|
08.11.2013, 20:21 [ТС] | 31 |
Скорее всего я непонимаю что куда кормить))
Вот структура DWORD WINAPI QueryDosDevice( _In_opt_ LPCTSTR lpDeviceName, - это у нас буква диска C: E: D: _Out_ LPTSTR lpTargetPath, - это чтото вроде \Device\CdRom _In_ DWORD ucchMax - чтото вроде кол-ва символов );
0
|
Ушел с форума
|
|
08.11.2013, 20:52 | 32 |
Первый параметр - символьная ссылка.
На XP у Вас получаются две ссылки:
0
|
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
|
|
08.11.2013, 21:22 [ТС] | 33 |
Ладно на выходных попробую, только что оно мне вернуть должно.
DWORD i = QueryDosDevice(device1,device2,sizeof(device2)); чтото типа того ? на выходных попробую)
0
|
Ушел с форума
|
||||||
08.11.2013, 21:34 | 34 | |||||
Имя устройства, на которое указывает символьная ссылка.
Грубо говоря:
P.S. Удачных выходных !
0
|
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
|
||||||
10.11.2013, 12:56 [ТС] | 35 | |||||
printf("%s",Buffer);
ничего не возвращает (пробывал и с %ls) тоже пусто. А теперь появилась еще проблема как узнать по букве диска что это именно съемный диск? С сетевыми понятно.
Но проблема в чем 1. Флоппик определяется как Removable 2. Переносной HDD на 500гб определяется как Fixed
0
|
Ушел с форума
|
|
10.11.2013, 16:36 | 36 |
Надо wprintf, это же Unicode, "широкие символы". Ну или в MessageBoxW вывести.
Сначала одну ссылку скормить в QueryDosDevice, затем вторую. И сравнить полученные значения. SetupDiGetDeviceRegistryProperty с кодом SPDRP_REMOVAL_POLICY не пробовали ?
0
|
Maniac
|
|
11.11.2013, 17:04 | 37 |
1
|
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
|
|||||||||||
23.11.2013, 11:25 [ТС] | 38 | ||||||||||
Немогу понять что за значение возвращает это SPDRP_REMOVAL_POLICY вроде как DWORD но что с ним делать ? как мне определить что это за устройство ? Если выводить как строку то нулевой символ какойто возвращает и все.
0
|
Ушел с форума
|
||||||
23.11.2013, 11:41 | 39 | |||||
WinDDK 7600.1, /inc/api/cfgmgr32.h
0
|
23.11.2013, 11:41 | |
23.11.2013, 11:41 | |
Помогаю со студенческими работами здесь
39
Ошибка монтирования образа диска на VirtualBox Программа для монтирования образа диска (iso) Как изменить флаги монтирования по умолчанию для usb-носителей? Python linux нужно написать программу для монтирования и размонтирования usb Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |