Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 9

Получение пути монтирования по FILE_OBJECT

21.05.2014, 13:31. Показов 2280. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Описание: Есть существующий FILE_OBJECT указывающий на файл, находящийся на USB флешке. Необходимо получить путь монтирования usb флешки. Пример пути монтирования - \\?\USB\VID_13FE&PID_4100\201212SP001407 0F2C7822AC9A13\{a5dcbf10-6530-11d2-901f-00c04fb951ed}

Нахожусь на уровне ядра.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.05.2014, 13:31
Ответы с готовыми решениями:

Чтение данных файла (FILE_OBJECT)
Добрый день, В msdn наткнулся на структуру FILE_OBJECT, можно как нибудь получить данные этого файла? Я пробовал использовать...

Получение пути к файлу процесса
Путь некоторых файлов отображается непонятными символами: function GetProcess(): TStringList; const PROCESS_TERMINATE=$0001; var...

Получение пути к файлу из ODBC
Есть маленькая проблема, я не знаю как вытянуть с ODBC путь к БД (файлу). Это наверно какое-то свойство Database?

9
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.05.2014, 22:49
Цитата Сообщение от Wisstik Посмотреть сообщение
Необходимо получить путь монтирования usb флешки.
Первый вопрос - для чего ?
Второй вопрос - откуда Вы получили данный путь монтирования ?
0
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 9
22.05.2014, 09:49  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Первый вопрос - для чего ?
Второй вопрос - откуда Вы получили данный путь монтирования ?
Мне нужно получить GUID (не класс) usb устройства, т.е. необходимо получить 201212SP0014070F2C7822AC9A13. знаю только единственный способ его получить, это вырезать из пути монтирования. Если у Вас есть другие соображения на этот счёт, то пожалуйста огласите.
А есть ли разница откуда я получил я получил данный путь? Хотя я ничего не скрываю, так, что я его получил с уровня пользователя перехватив подключения usb устройства, фильтруя подключения данного класса устройств {a5dc bf10-6530-11d2-901f-00c04fb951ed} . Хотя я могу заблуждаться, что такой же путь монтирования присутствует на уровне ядра.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.05.2014, 21:13
Цитата Сообщение от Wisstik Посмотреть сообщение
Мне нужно получить GUID (не класс) usb устройства, т.е. необходимо получить 201212SP0014070F2C7822AC9A13.
Мой вопрос был в том, какова конечная цель всего этого ?
Какую задачу Вы пытаетесь решить ?

Если у Вас есть другие соображения на этот счёт, то пожалуйста огласите.
Я не понял, что за путь монтирования, который Вы привели выше.
На символьную ссылку это не похоже, она бы выглядела так:
"\\?\USBSTOR#disk&ven..." или так: "\\?\USB#VID_XXXX&PID_XXXX&...".
Hardware id или device instance path начинались бы с "USBSTOR\...",
поэтому тоже нет. И mount points, которые создаются mount manager-ом,
тоже выглядят иначе: "Volume{GUID}". Так что же это за путь и каким
конкретно способом он получен ?

я его получил с уровня пользователя перехватив подключения usb устройства, фильтруя подключения данного класса устройств {a5dc bf10-6530-11d2-901f-00c04fb951ed} . Хотя я могу заблуждаться, что такой же путь монтирования присутствует на уровне ядра.
Ну в драйвере ведь очень многое можно сделать.
IoGetRelatedDeviceObject получает DEVICE_OBJECT по FILE_OBJECT.
IoGetDeviceInterfaces и IoRegisterPlugPlayNotification позволяют
получить символьные ссылки для нужного device interface.
PDO можно узнать либо в AddDevice, либо отправив в стек IRP_MJ_PNP с
соответствующим подкодом, на OSR этот вопрос как-то обсуждался.
У mount manager-а есть IOCTL_MOUNTMGR_QUERY_POINTS, выдающий по
запросу список точек монтирования.
Символьные ссылки разрешаются через ZwQuerySymbolicLinkObject.
Найти объект драйвера можно через ObReferenceObjectByName.
Ну и так далее. Вы только скажите, что за путь такой таинственный и
для каких конкретно сверхзадач он потребовался.
0
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 9
23.05.2014, 16:16  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Мой вопрос был в том, какова конечная цель всего этого ?
Какую задачу Вы пытаетесь решить ?
Конечная цель: Разрешить или запретить информационный поток на чтение или запись, для usb устройств. Для идентификации устройства хотел бы пользоваться его GUID.

Цитата Сообщение от Убежденный Посмотреть сообщение
Я не понял, что за путь монтирования, который Вы привели выше.
На символьную ссылку это не похоже, она бы выглядела так:
"\\?\USBSTOR#disk&ven..." или так: "\\?\USB#VID_XXXX&PID_XXXX&...".
Hardware id или device instance path начинались бы с "USBSTOR\...",
поэтому тоже нет. И mount points, которые создаются mount manager-ом,
тоже выглядят иначе: "Volume{GUID}". Так что же это за путь и каким
конкретно способом он получен ?
Очень извиняюсь, за то, что дезинформировал Вас. Это есть символическая ссылка. Получена с уровня пользователя, путём регистрации приёма сообщений от устройств при помощи функции RegisterDeviceNotification c классом usb устройств - { 0xA5DCBF10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED }. Надеюсь понятно.

Цитата Сообщение от Убежденный Посмотреть сообщение
Ну в драйвере ведь очень многое можно сделать.
IoGetRelatedDeviceObject получает DEVICE_OBJECT по FILE_OBJECT.
IoGetDeviceInterfaces и IoRegisterPlugPlayNotification позволяют
получить символьные ссылки для нужного device interface.
PDO можно узнать либо в AddDevice, либо отправив в стек IRP_MJ_PNP с
соответствующим подкодом, на OSR этот вопрос как-то обсуждался.
У mount manager-а есть IOCTL_MOUNTMGR_QUERY_POINTS, выдающий по
запросу список точек монтирования.
Символьные ссылки разрешаются через ZwQuerySymbolicLinkObject.
Найти объект драйвера можно через ObReferenceObjectByName.
Ну и так далее. Вы только скажите, что за путь такой таинственный и
для каких конкретно сверхзадач он потребовался.
Хм...отчасти я это уже пробовал, но Вы подами мне несколько идей. По результатам тестов отпишусь. Благодарю.
0
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 9
28.05.2014, 11:56  [ТС]
Пробую получить PDO, по полученному DEVICE_OBJECT функцией IoGetRelatedDeviceObject, но при IoCallDriver вылетает BSOD. Я что-то делаю неправильно?
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
// fileObject входной PFILE_OBJECT
 
PDEVICE_OBJECT deviceObject;
KEVENT kEvent;
PIRP irp;
IO_STATUS_BLOCK ioStatusBlock;
PIO_STACK_LOCATION ioStackLocation;
NTSTATUS ntStanus;
PDEVICE_RELATIONS deviceRelations;
PDEVICE_OBJECT physicalDeviceObject;
 
if (!(deviceObject = IoGetRelatedDeviceObject(fileObject)))
{
    DbgPrint("IoGetRelatedDeviceObject failed");
 
    return false;
}
else
    DbgPrint("IoGetRelatedDeviceObject ok");
 
KeInitializeEvent(&kEvent, NotificationEvent, FALSE);
 
if (!(irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP, deviceObject, 
    NULL, 0, NULL, &kEvent, &ioStatusBlock)))
{
    DbgPrint("IoBuildSynchronousFsdRequest failed");
 
    return false;
}
else
    DbgPrint("IoBuildSynchronousFsdRequest ok");
    
ioStackLocation = IoGetNextIrpStackLocation(irp);
ioStackLocation->MajorFunction = IRP_MN_QUERY_DEVICE_RELATIONS;
ioStackLocation->Parameters.QueryDeviceRelations.Type 
    = BusRelations;
 
irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
 
ntStanus = IoCallDriver(deviceObject, irp);
 
if (ntStanus == STATUS_PENDING)
{
    KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, 
        NULL);
    ntStanus = ioStatusBlock.Status;
}
 
if (NT_SUCCESS(ntStanus))
{
    deviceRelations = (PDEVICE_RELATIONS)ioStatusBlock.Information;
 
    physicalDeviceObject = deviceRelations->Objects[0];
    ExFreePool(deviceRelations);
    
    DbgPrint("TEST PDO ok");
}
else
{
    DbgPrint("TEST PDO failed %X", ntStanus);
    return false;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.05.2014, 20:39
Цитата Сообщение от Wisstik Посмотреть сообщение
при IoCallDriver вылетает BSOD
А где код BSOD-ошибки, где стек падения ?..

Кстати, Microsoft не рекомендует слать BusRelations.
Вместо этого можете попробовать какой-нибудь IoGetDeviceAttachmentBaseRef.
Функция возвращает указатель на нижний объект в стеке (обычно PDO).

И еще я вижу, что Вы тут забываете кое-где ObDereferenceObject делать.
Так нельзя, можно повесить стек устройства, а то и всю систему.
0
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 9
09.06.2014, 09:50  [ТС]
Если Вам не сложно, не могли бы Вы предоставить код функции, которая бы возвращала GUID подключённого устройства по PFILE_OBJECT. А то я чувствую, что эта эпопея на уровне ядра может затянуться ещё на неопределённое время. Буду очень Вам благодарен за это.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
10.06.2014, 01:04
Цитата Сообщение от Wisstik Посмотреть сообщение
Конечная цель: Разрешить или запретить информационный поток на чтение или запись, для usb устройств.
А чем не устроил вариант написать какой-нибудь минифильтр ?
По документации, начинающейся здесь:

File System Minifilter Drivers
http://msdn.microsoft.com/en-u... 85%29.aspx

?
0
0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 9
29.07.2014, 14:43  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
А чем не устроил вариант написать какой-нибудь минифильтр ?
По документации, начинающейся здесь:

File System Minifilter Drivers
http://msdn.microsoft.com/en-u... 85%29.aspx

?
Минифилтр не подходит, потому что я фильтрую не содержимое запросов. Но в общем-то я разобрался, я использую File System Filter Driver (http://www.codeproject.com/Art... r-Tutorial), в Windows XP всё прекрасно работает, но у меня проблема с Windows 7. А именно как мне из DO, который указывает на \Device\HarddiskVolumeX получить связанный с ним DO \Device\HarddiskY.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.07.2014, 14:43
Помогаю со студенческими работами здесь

Openfilefialog, получение пути к файлу!!
Вопрос такой, как из openfiledialog, получить путь к файлу без имени самого файла, т.е. OpenFileDialog делает путь такой...

Получение пути к исполняемому файлу
Здравствуйте, Позвольте вопрос: 1)Как получить путь к исполняемому файлу ? То есть вот такая конструкция работает: ...

Получение пути к выбранной картинки
Доброго времени суток, форумчане! Пытаюсь сделать систему, чтобы пользователь при нажатии на кнопку (именно кнопку, не инпут) смог...

Получение пути к папке Windows
есть код: for /f "eol=# delims== tokens=1,2" %%i in (ini.ini) do set /a "%%i=%%j" все хорошо работает НО если в файл ini.ini...

Получение пути к пользовательской директории
Злосчастная GetUserDirectory, которую нашел в мсдне, работает лишь под C#. Начал искать дальше, нашел вот такие кренделя: GetFolderPath -...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru