Имеется некоторое устройство, подключаемое через USB. В Диспетчере устройств оно располагается в разделе "Контроллеры USB" под названием что-то вроде "CyPress Generic USB Device".
Драйвер к устройству примитивный и практически без документации. Общение по сути только через DeviceIoControl.
Вопрос: как мне получить HANDLE устройства? Что нужно подставить в CreateFile в качестве пути и какие флаги при этом нужно использовать?
Я пробовал подставить "Путь к экземпляру устройства", взятый из Диспетчера устройств, но CreateFile вернуло INVALID_HANDLE_VALUE.
Спасибо.
19.04.13 18:00: Перенесено модератором из 'Железо' — AndrewVK
Здравствуйте, andrey_nado, Вы писали:
_>Имеется некоторое устройство, подключаемое через USB. В Диспетчере устройств оно располагается в разделе "Контроллеры USB" под названием что-то вроде "CyPress Generic USB Device".
_>Драйвер к устройству примитивный и практически без документации. Общение по сути только через DeviceIoControl.
_>Вопрос: как мне получить HANDLE устройства? Что нужно подставить в CreateFile в качестве пути и какие флаги при этом нужно использовать?
_>Я пробовал подставить "Путь к экземпляру устройства", взятый из Диспетчера устройств, но CreateFile вернуло INVALID_HANDLE_VALUE.
_>Спасибо.
Вы можете перебрать устройства используя SetupDiGetClassDevs, после этого вызываете SetupDiGetDeviceInterfaceDetail, который вернет путь устройства и этот путь будете скармливать в CreateFile.
Здравствуйте, BlackEric, Вы писали:
BE>Вы можете перебрать устройства используя SetupDiGetClassDevs, после этого вызываете SetupDiGetDeviceInterfaceDetail, который вернет путь устройства и этот путь будете скармливать в CreateFile.
Здравствуйте, BlackEric, Вы писали:
BE>Вы можете перебрать устройства используя SetupDiGetClassDevs, после этого вызываете SetupDiGetDeviceInterfaceDetail, который вернет путь устройства и этот путь будете скармливать в CreateFile.
Я пробовал, с наскоку не получилось. Возможно, GUID неверный отправляю, а где взять верный — документация к драйверу умалчивает. Есть ли другие способы узнать путь к устройству?
Здравствуйте, andrey_nado, Вы писали:
_>Я пробовал, с наскоку не получилось. Возможно, GUID неверный отправляю, а где взять верный — документация к драйверу умалчивает. Есть ли другие способы узнать путь к устройству?
Хз. Вообще это лучше в низкоуровневое.
Код покажите?
Что за ошибка?
А заюзать какой-нибудь libusb&?
Здравствуйте, 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&?
Избыточно. Мне все-лишь нужно получить хэндл устройства.
Здравствуйте, 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.
_>Возможно, GUID неверный отправляю, а где взять верный — документация к драйверу умалчивает. _>Есть ли другие способы узнать путь к устройству?
Начать стоит с этого: http://www.bustrace.com/products/guid_explorer.htm
Приложение старое, но работает даже под восьмеркой ( по крайней мере, осенью работало ) Единственно, новые Device interface GUID'ы по именам не знает, но значения их и путь к устройству показывает верно.
Попробуйте 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. Найти эти ф-ии (и аргументы к ним) довольно легко. Ну или выложите драйвер сюда, если не секретный, кто-нибудь (например, я) посмотрит и скажет.
Здравствуйте, boris_, Вы писали:
_>Попробуйте RegisterDeviceNotification и повтыкать/повытыкать устройство — ловитe сообщения в оконной функции и вытаскивайте путь.
Получилось узнать GUID устройства, а из него посредством SetupDiGetClassDevs и SetupDiEnumDeviceInterfaces получить информацию об устройстве, а затем и хэндл. Поисследую этот способ внимательнее.