Как открыть USB устройство, Windows
От: andrey_nado  
Дата: 19.04.13 10:25
Оценка:
Имеется некоторое устройство, подключаемое через USB. В Диспетчере устройств оно располагается в разделе "Контроллеры USB" под названием что-то вроде "CyPress Generic USB Device".

Драйвер к устройству примитивный и практически без документации. Общение по сути только через DeviceIoControl.

Вопрос: как мне получить HANDLE устройства? Что нужно подставить в CreateFile в качестве пути и какие флаги при этом нужно использовать?

Я пробовал подставить "Путь к экземпляру устройства", взятый из Диспетчера устройств, но CreateFile вернуло INVALID_HANDLE_VALUE.

Спасибо.

19.04.13 18:00: Перенесено модератором из 'Железо' — AndrewVK
Re: Как открыть USB устройство, Windows
От: BlackEric http://black-eric.lj.ru
Дата: 19.04.13 10:31
Оценка:
Здравствуйте, andrey_nado, Вы писали:

_>Имеется некоторое устройство, подключаемое через USB. В Диспетчере устройств оно располагается в разделе "Контроллеры USB" под названием что-то вроде "CyPress Generic USB Device".


_>Драйвер к устройству примитивный и практически без документации. Общение по сути только через DeviceIoControl.


_>Вопрос: как мне получить HANDLE устройства? Что нужно подставить в CreateFile в качестве пути и какие флаги при этом нужно использовать?


_>Я пробовал подставить "Путь к экземпляру устройства", взятый из Диспетчера устройств, но CreateFile вернуло INVALID_HANDLE_VALUE.


_>Спасибо.


Вы можете перебрать устройства используя SetupDiGetClassDevs, после этого вызываете SetupDiGetDeviceInterfaceDetail, который вернет путь устройства и этот путь будете скармливать в CreateFile.
https://github.com/BlackEric001
Re[2]: Как открыть USB устройство, Windows
От: BlackEric http://black-eric.lj.ru
Дата: 19.04.13 10:33
Оценка: 10 (1)
Здравствуйте, BlackEric, Вы писали:

BE>Вы можете перебрать устройства используя SetupDiGetClassDevs, после этого вызываете SetupDiGetDeviceInterfaceDetail, который вернет путь устройства и этот путь будете скармливать в CreateFile.


Пример How to enumerate hardware devices by using SetupDi calls
https://github.com/BlackEric001
Re[2]: Как открыть USB устройство, Windows
От: andrey_nado  
Дата: 19.04.13 10:59
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Вы можете перебрать устройства используя SetupDiGetClassDevs, после этого вызываете SetupDiGetDeviceInterfaceDetail, который вернет путь устройства и этот путь будете скармливать в CreateFile.


Я пробовал, с наскоку не получилось. Возможно, GUID неверный отправляю, а где взять верный — документация к драйверу умалчивает. Есть ли другие способы узнать путь к устройству?
Re[3]: Как открыть USB устройство, Windows
От: BlackEric http://black-eric.lj.ru
Дата: 19.04.13 11:05
Оценка:
Здравствуйте, andrey_nado, Вы писали:

_>Я пробовал, с наскоку не получилось. Возможно, GUID неверный отправляю, а где взять верный — документация к драйверу умалчивает. Есть ли другие способы узнать путь к устройству?


Хз. Вообще это лучше в низкоуровневое.
Код покажите?
Что за ошибка?
А заюзать какой-нибудь libusb&?
https://github.com/BlackEric001
Re[4]: Как открыть USB устройство, Windows
От: andrey_nado  
Дата: 19.04.13 11:17
Оценка:
Здравствуйте, BlackEric, Вы писали:
BE>Код покажите?

Примерно так (пишу по памяти):

// Retrieve a list of all present devices
GUID guid = ...; // взял из INF файла
HDEVINFO deviceInfoList = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoList, i, &deviceInfoData); i++) {
  // выводим параметры устройства на экран
}


Код выше не выводит ни одного устройства, хотя deviceInfoList открыт успешно. Вызов GetLastError после SetupDiEnumDeviceInfo возвращает ошибку 0x0103.

BE>А заюзать какой-нибудь libusb&?


Избыточно. Мне все-лишь нужно получить хэндл устройства.
Re[5]: Как открыть USB устройство, Windows
От: BlackEric http://black-eric.lj.ru
Дата: 19.04.13 11:37
Оценка:
Здравствуйте, andrey_nado, Вы писали:

_>Здравствуйте, BlackEric, Вы писали:

BE>>Код покажите?

_>Примерно так (пишу по памяти):


_>
_>// Retrieve a list of all present devices
_>GUID guid = ...; // взял из INF файла
_>HDEVINFO deviceInfoList = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

_>for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoList, i, &deviceInfoData); i++) {
_>  // выводим параметры устройства на экран
_>}
_>


_>Код выше не выводит ни одного устройства, хотя deviceInfoList открыт успешно. Вызов GetLastError после SetupDiEnumDeviceInfo возвращает ошибку 0x0103.

ERROR_NO_MORE_ITEMS

259 (0x103)

No more data is available.


Я бы попробовал запустить пример с msdn, а так
https://github.com/BlackEric001
Re[3]: Как открыть USB устройство, Windows
От: _stun_ Россия  
Дата: 19.04.13 17:43
Оценка: 12 (1)
Здравствуйте, andrey_nado, Вы писали:



_>Возможно, GUID неверный отправляю, а где взять верный — документация к драйверу умалчивает.

_>Есть ли другие способы узнать путь к устройству?

Начать стоит с этого: http://www.bustrace.com/products/guid_explorer.htm
Приложение старое, но работает даже под восьмеркой ( по крайней мере, осенью работало ) Единственно, новые Device interface GUID'ы по именам не знает, но значения их и путь к устройству показывает верно.
Re: Как открыть USB устройство, Windows
От: boris_ Германия  
Дата: 20.04.13 05:30
Оценка:
Здравствуйте, andrey_nado, Вы писали:

Попробуйте RegisterDeviceNotification и повтыкать/повытыкать устройство — ловитe сообщения в оконной функции и вытаскивайте путь.
Re: Как открыть USB устройство, Windows
От: Аноним  
Дата: 20.04.13 23:26
Оценка:
Здравствуйте, andrey_nado, Вы писали:

_>Я пробовал подставить "Путь к экземпляру устройства", взятый из Диспетчера устройств, но CreateFile вернуло INVALID_HANDLE_VALUE.


Устройство может и не регистрировать интерфейс (выше рекомендовали поискать его). Как вариант, можно просто открыть драйвер устройства в hex редакторе и поискать в нем строки (unicode) типа \DosDevices или \Device -- это создание символьной ссылки и DEVICE_OBJECT'а. По символьной ссылке устройство можно открыть из user mode, если передать в CreateFile параметер в виде \\.\SymbolicLinkName. Или как вариант -- посмотреть в дизассемблере ф-ию AddDevice -- там это все должно создаваться. Устройство с помощью ф-ии IoCreateDevice, ссылка с помощью IoCreateSymbolicLink, интерфейс регистрируется с помощью IoRegisterDeviceInterface. Найти эти ф-ии (и аргументы к ним) довольно легко. Ну или выложите драйвер сюда, если не секретный, кто-нибудь (например, я) посмотрит и скажет.
Re[2]: Как открыть USB устройство, Windows
От: andrey_nado  
Дата: 25.04.13 12:40
Оценка:
Здравствуйте, boris_, Вы писали:

_>Попробуйте RegisterDeviceNotification и повтыкать/повытыкать устройство — ловитe сообщения в оконной функции и вытаскивайте путь.


Получилось узнать GUID устройства, а из него посредством SetupDiGetClassDevs и SetupDiEnumDeviceInterfaces получить информацию об устройстве, а затем и хэндл. Поисследую этот способ внимательнее.

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.