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

CreateFile для чтения HID клавиатуры?

24.12.2015, 18:11. Показов 4273. Ответов 13

Студворк — интернет-сервис помощи студентам
Пытаюсь с помощью библиотеки "setupapi" открыть для чтения устройство HID определяемое системой как HID клавиатура.
По vid и pid благополучно нахожу свое усройство (вернее имя файла) и пытаюсь с помощью CreateFile получить хэндл, для дальнейшего чтения HID функцией из библиотеки "setupapi". Тут начинаются проблемы...

C++
1
2
HANDLE h = CreateFile(path.c_str(),GENERIC_READ,FILE_SHARE_READ,0,
                                             OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
хэндл не получен!!!
Если вместо GENERIC_READ ставим 0 (получить только атрибуты файла), хэндл - получен. Но что самое странное, если ставлю GENERIC_WRITE, опять получаю хэндл... Как то не понимаю, т.е. на запись можно, а чтение нельзя???
Причем так себя ведет и реальная клава которая подключена у меня ...
Что я не догоняю? Вразумите...
Win 7 стоит.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.12.2015, 18:11
Ответы с готовыми решениями:

Функции CreateFile и для ReadFileEx для чтения несколькими процессами из текстового файла
Привет, просьба подсказать одну вещь. Чтобы было ясно где используется, кратко опишу: мне необходимо в одной программе взять путь к...

Чтения результатов ввода со сканера RS-232(com-port) через ReadFile/CreateFile WinAPI
Доброго времени суток. Есть задача, считать информацию со сканера RS-232 (com-port). Как правильно это делать через ReadFile? ...

Хук для чтения с клавиатуры. Добавление по кодам клавиатуры
Есть вот такой хук для считывания клавиш globalKeyboardHook gkh = new globalKeyboardHook(); gkh.HookedKeys.Add(Keys.Q); ...

13
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
25.12.2015, 10:27
Windows не даст открыть клавиатуру или мышь на чтение, т.к. она уже
открыта в эксклюзивном режиме потоком, который обрабатывает ввод.
1
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 9
25.12.2015, 10:39  [ТС]
Вот-вот, мысль у меня была такая, что хэндл захвачен на чтение, причем стоит возможность на открытие для записи. Но нигде не мог найти информацию по этому поводу.
Тогда вопрос: Вы до сих пор придерживаетесь мнения, что такую задачу легче решить прослойкой в драйверах? Или все таки есть какой-нибудь вариант? С помощью глобального хука я сделал, но мне не нравиться такой подход.
т.е. можно ли как-то отловить данные с этого устройства?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
25.12.2015, 11:44
Цитата Сообщение от AndrewGuz Посмотреть сообщение
Вот-вот, мысль у меня была такая, что хэндл захвачен на чтение, причем стоит возможность на открытие для записи. Но нигде не мог найти информацию по этому поводу.
Эта информация не для широкого доступа, но она открыта.
Например:

IRP_MJ_CREATE (Kbdclass)
https://msdn.microsoft.com/en-... s.85).aspx
The Microsoft Win32 subsystem opens all keyboard devices for its exclusive use.
Цитата Сообщение от AndrewGuz Посмотреть сообщение
Тогда вопрос: Вы до сих пор придерживаетесь мнения, что такую задачу легче решить прослойкой в драйверах? Или все таки есть какой-нибудь вариант?
"Такую задачу" - это какую?

Цитата Сообщение от AndrewGuz Посмотреть сообщение
С помощью глобального хука я сделал, но мне не нравиться такой подход.
т.е. можно ли как-то отловить данные с этого устройства?
Можно, но придется спускаться на уровень ядра.
1
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 9
25.12.2015, 12:05  [ТС]
"..."Такую задачу" - это какую?..", это я с Вами заочный разговор продолжил))) Читал тут пару дней Ваш ответ, кто то спрашивал про сканер ШК, определяемый как HID клавиатура. Дословно не помню, но по моему Вы ответили, что прокладка-драйвер для такого дела займет 700-800 строк.
Ну у меня задача один в один. Надо отловить данные от определенной HID клавиатуры.
С помощью хука я конечно отловил, но там шаманство не гарантирующее 100%. Т.к. определение идет по комбинации символов (префикса), нет гарантии, что случайно пользователь не введет такую комбинацию. Тогда начнется цирк.
С помощью raw input, хотел было, но почитал и смутило необходимость наличия окна (пусть даже и скрытого), но я не совсем понимаю как это окно держать в фокусе, если надо предоставить нормальную работу пользователям.
Подумываю вроде о руткит... Но как бы не владею этой темой, я бы изучил, но скорее всего там куча своих проблем. Если бы кто сказал, что да это позволит решить твой вопрос, я бы пошел...
Ну и последний это написать драйвер-прокладку, но помимо того, что надо освоить это в принципе. что совсем непросто. Так еще вы же и "пугаете")), что теперь без подписи свои драйверы можно засовывать в ...
Как быть-то, что то я на распутье.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
25.12.2015, 12:58
Лучший ответ Сообщение было отмечено AndrewGuz как решение

Решение

Цитата Сообщение от AndrewGuz Посмотреть сообщение
С помощью raw input, хотел было, но почитал и смутило необходимость наличия окна (пусть даже и скрытого)
И напрасно.
В скрытом окне, которое создано только для обработки сообщений, нет
никакого "криминала", система сама так делает для многих вещей.
Есть даже специальный тип окна - message only.

Цитата Сообщение от AndrewGuz Посмотреть сообщение
Если бы кто сказал, что да это позволит решить твой вопрос
С помощью драйвера точно можно ловить все, что нужно.
Вопрос лишь в том, нет ли более простого решения.

Цитата Сообщение от AndrewGuz Посмотреть сообщение
Так еще вы же и "пугаете")), что теперь без подписи свои драйверы можно засовывать в
Так это не я, это Microsoft.
1
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 9
25.12.2015, 13:12  [ТС]
За это время почитал про raw input подробнее в первоисточнике msdn. Действительно, обрывки в постах создали у меня не совсем верное представление. Из документации я понял, что окно "message only" регистрируем для сообщений от девайсов использую дескриптор. Ну дальше обрабатываем и т.д. Т.е. в принципе выглядит прямо "как доктор прописал". Но вот не совсем понятен один момент. Этот дескриптор будет меняться, если устройство переткнут в другой порт USB? Т.е. надо ли будет постоянно проводить настройку?Но это уже вопросы по ходу дела.
Олег, Вам огромное спасибо!!! Потрачу выходные на новую идею))

ЗЫ: И всетаки, никак из головы не выходит, вот есть снифер USB Lyser, он с полтычка выдаст всю инфу по HID клаве(которую можно получить только в атрибутах CreateFile) и считывают все скан коды с этой клавиатуры. Ну не драйвер же они мне суют... Что они курят????
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
25.12.2015, 14:32
Цитата Сообщение от AndrewGuz Посмотреть сообщение
Но вот не совсем понятен один момент. Этот дескриптор будет меняться, если устройство переткнут в другой порт USB? Т.е. надо ли будет постоянно проводить настройку?
Не ясно, о каком дескрипторе речь.

Цитата Сообщение от AndrewGuz Посмотреть сообщение
ЗЫ: И всетаки, никак из головы не выходит, вот есть снифер USB Lyser, он с полтычка выдаст всю инфу по HID клаве(которую можно получить только в атрибутах CreateFile) и считывают все скан коды с этой клавиатуры. Ну не драйвер же они мне суют... Что они курят?
99%, что драйвер и суют.
А как еще можно прослушивать USB-трафик на низком уровне?
Там по-любому либо libusb, либо WinUSB, либо что-то еще.
1
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 9
28.12.2015, 05:24  [ТС]
Решил я продолжить/закончить эту тему в одном месте. Т.к. сам с толкнулся с трудностями в поиске инфы по вопросу снятия данных с HID клавиатуры (ну или устряства, которое так определяется ОС). Разобрался я с Raw Input - технология очень неплохая... Все четко:
1. Возможность подписаться на сообщения в режиме "RIDEV_INPUTSINK", когда окно будет получать сообщения, даже если оно не активно. Что позволяет использовать "скрытое окно". Это гут...
2. Возможность подписаться на определенный вид/тип девайса. Ну допустим только на HID клаву. За это этветственна струтура "RAWINPUTDEVICE". Но нет возможности подписаться на конретное устройство из семейства. Но это уже детали. В дальнейшем можно фильтровать вплоть до pid и vid HID девайса. Это очень и очень зер гут...
3. Я перекопал всю MSDN, все что смог обГуглил, но технологии, или хотябы зацепки о том, как "не пустить" дальше данные не нашел... В принципе, немного поразмышляв становится понятно(с моего уровня познаний, может я и ошибаюсь), что это в принципе невозможно. Если в глобальном хуке идет цепочкаПОСЛЕДОВАТЕЛЬНЫХ вызовов и там ее(цепочку) можно прервать, то в данном случае это просто информирование заинтересованных подписчиков. И это очень и очень не гут...

Если бы проблема стояла только в надежном фильтре, по устройству, поступающих данных. Всё, проблема решена, но если необходимо еще и "убрать" их из общего потока - то...
Вот у меня, если очень схематично, задача стоит определить данные с нужного устройства, изъять их и направить в виртуальный COM порт, вернее не "В", а "Из".
Т.е. в итоге что я имею. HOOK глобальный - работает, но нет 100% гарантии. Все зависит от того, как сплясал с бубном... Raw Input - прекрасно.. Но данные продолжают "гулять" по пользовательскому уровню и куда они прилетят, вопрос..
Остается один путь, вниз к "морлокам"... Но там свои проблемы.
Неужели нет выхода???
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.12.2015, 10:45
Вниз к морлокам - это и есть выход.

Не по теме:

Кстати, забавная аналогия, раньше не встречал.

1
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 9
28.12.2015, 10:59  [ТС]
Ну да, ну да, насколько я понимаю это только еще вход. Вот не факт, что я еще и выход найду.))
А не могли бы Вы, с высоты своего опыта, подсказать. Для моей задачи с чего начать? Что бы по всему полю не рыть.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.12.2015, 11:08
Возможно два варианта:

1) написать классический фильтрующий драйвер клавиатуры.
Кода там немного совсем, пять стандартных обработчиков плюс функция-перехватчик
нажатий клавиш. Перехваченный ввод можно полностью контролировать, вплоть до
модификации или блокировки.

2) Поставить хук на обработчик IRP_MJ_READ драйвера kbdclass.sys.
В принципе, этот вариант еще более мощный, т.к. не нужно, например,
перестраивать стек устройств при установке своего драйвера.
Но здесь нужно уметь работать с некоторыми недокументированными
структурами и функциями Windows, так что вариант для продвинутых.

Я на wasm.ru (профиль okman) несколько раз описывал в общих чертах написание
таких фильтров и принципы их работы, ссылку ввиду правил форума дать не могу.

--------------------------

Правда, если ты драйверы до этого никогда не писал, то затея эта гиблая.


Как ни печально признавать, но все, кто берется за разработку драйверов,
обычно заваливают первые проекты с треском (точнее, с грохотом).
Потому что тема серьезная, даже для мелкого драйвера, с наскока не поднять.
1
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 9
28.12.2015, 11:22  [ТС]
Спасибо, понял... Ну я по Вашей "наводке", попробую нагрузить мозг на праздники, а там видно будет. Если пойму, что смогу, пойду дальше.
Всех с Новым Годом! Удачи!!!
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.12.2015, 11:24
Цитата Сообщение от AndrewGuz Посмотреть сообщение
Всех с Новым Годом! Удачи!!!
Спасибо, взаимно!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.12.2015, 11:24
Помогаю со студенческими работами здесь

STM32. HID профиль мыши и клавиатуры
Добрый день форумчане! Прошу вашей помощи! Есть камушек stm32f107, необходимо инициализировать usb hid, сама инициализация в принципе есть,...

Чтение из HID - клавиатуры (сканера штрих-кодов)
Уважаемые форумчане, требуется ваша помощь. Есть сканер штрих - кодов, который подключается к компьютеру как HID - клавиатура, нужно...

Эмуляция нажатия кнопки HID устройства (мыши или клавиатуры)
Доброго времени суток, совсем новичок в этой теме (буквально второй день), так что не пинайте сильно ЗАДАЧА: Необходимо сэмулировать...

Каким образом после чтения из файла, узнать позицию для чтения следующего куска байт
Здравствуйте, задача такова есть файл, размером 1000 байт, нужно открыть его считать 100 байт, после чтения закрыть. Потом опять открыть...

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru