Простейший пример драйвера USB-устройства Windows
От: Shmj Ниоткуда  
Дата: 04.01.22 09:54
Оценка:
Весьма впечатлила статья: https://codeby.net/threads/sozdanie-drajvera-pod-windows-chast-1-vvedenie.78018/
Вторая часть не так, почти бесполезная — видно что чел. выдохся.

Вот так круто написано — прямо для дебилов — все по шагам. А чем плохо писать как для дебилов, чтобы уж точно ни у кого не осталось вопросов?

Но статья не закончена. Все что делает драйвер — пишет в лог с помощью KdPrint.

Вопрос такой — есть ли что-то подобное, но чтобы было показано как что-то передать устройству, получить данные от устройства. А так же как потом приложению взаимодействовать с этим драйвером (как я понял — работа с ним как с файлом?).

При этом никаких легкий путей — нельзя использовать USB-COM и пр. готовые решения.

Мне важно понять как это работает. Код на девайсе сейчас не трогаем — только код драйвера.

Где можно посмотреть?
Re: Простейший пример драйвера USB-устройства Windows
От: okman Беларусь https://searchinform.ru/
Дата: 04.01.22 10:44
Оценка:
Здравствуйте, Shmj, Вы писали:

S>...

S>Вопрос такой — есть ли что-то подобное, но чтобы было показано как что-то передать устройству, получить данные от устройства.
S>А так же как потом приложению взаимодействовать с этим драйвером (как я понял — работа с ним как с файлом?).
S>При этом никаких легкий путей — нельзя использовать USB-COM и пр. готовые решения.
S>Мне важно понять как это работает. Код на девайсе сейчас не трогаем — только код драйвера.
S>Где можно посмотреть?

У Microsoft есть большая коллекция исходников в открытом доступе:

microsoft/Windows-driver-samples
https://github.com/microsoft/Windows-driver-samples
Re: Простейший пример драйвера USB-устройства Windows
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.01.22 11:04
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Вот так круто написано — прямо для дебилов


Вы действительно считаете, что "круто" и "прям для дебилов" может быть совмещено в одной работе?

S>А чем плохо писать как для дебилов


"Как для дебилов" имеет смысл писать о том, что само по себе предназначено для дебилов. А то, что для них предназначено, всегда предельно просто (по крайней мере, снаружи). Разработка вещей вроде драйверов никогда не была (и никогда не будет) ориентирована на дебилов — это по определению достаточно сложная и, мало того, ответственная работа. Подумайте, будет ли сохраняться Ваше одобрение, если в Ваших системах будет все больше драйверов, написанных дебилами с помощью пошаговых руководств.

S>чтобы уж точно ни у кого не осталось вопросов?


"Чтобы не осталось вопросов" не эквивалентно "для дебилов". Можно писать для новичков, подробно разбирая типичные сценарии и типичные же ошибки, вдаваться в тонкости и т.п., но литература по таким предметам всегда должна оставлять место для самостоятельной работы. В ней должны быть максимально четко и понятно описаны принципы, но готовых решений должно быть как можно меньше. Ибо любое готовое решение — кандидат на шаблон для "профессиональной версии". По миру гуляет огромное количество и софта, минимально переделанного из простейших примеров, и железа, минимально переделанного из референс-дизайнов.
Re[2]: Простейший пример драйвера USB-устройства Windows
От: Shmj Ниоткуда  
Дата: 04.01.22 12:06
Оценка: +1
Здравствуйте, okman, Вы писали:

O>У Microsoft есть большая коллекция исходников в открытом доступе:


O>microsoft/Windows-driver-samples

O>https://github.com/microsoft/Windows-driver-samples

Проблема вот в чем — для вхождения нужен минимальный функционал, а не реальный. Т.е. самый минимум, который делает минимум работы (ping-pong с девайсом, к примеру).
Re[2]: Простейший пример драйвера USB-устройства Windows
От: Shmj Ниоткуда  
Дата: 04.01.22 12:09
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Разработка вещей вроде драйверов никогда не была (и никогда не будет) ориентирована на дебилов — это по определению достаточно сложная и, мало того, ответственная работа.


Ответственная — да, нужно тестировать. Сложная — почему же? По сути это просто передача данных из ОС в девайс — ВСЕ! Больше ничего.

Сложно — это когда нужно осознать некие математические абстракции, которые опираются на другие математические абстракции. Вот это сложно.
Re[3]: Простейший пример драйвера USB-устройства Windows
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.01.22 12:29
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>для вхождения нужен минимальный функционал, а не реальный. Т.е. самый минимум, который делает минимум работы (ping-pong с девайсом, к примеру).


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

Предлагаемый Вами метод обучения годится исключительно для разработчиков несложного конечного продукта, который легко заменить аналогичным. Нет оснований предельно облегчать труд разработчиков промежуточных программных слоев, на которых базируется оконечное ПО.
Re[3]: Простейший пример драйвера USB-устройства Windows
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.01.22 12:40
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Ответственная — да, нужно тестировать.


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

S>Сложная — почему же? По сути это просто передача данных из ОС в девайс — ВСЕ! Больше ничего.


Если это несложно, что ж Вам не нравится? Берите документацию и делайте драйвер, делов-то.

S>Сложно — это когда нужно осознать некие математические абстракции, которые опираются на другие математические абстракции. Вот это сложно.


Ну-ну. Давайте я Вам накидаю математических абстракций, описывающих передачу и обработку звуковых потоков в виндовом ядре (они несложны), а Вы по-быстрому сделаете драйвер, который будет все это делать в полном соответствии с системными соглашениями, в реальном времени, невзирая на баги системы, других драйверов и пользовательского софта, работать почти на любом железе, в системах от XP до Win11 и т.п.
Re[4]: Простейший пример драйвера USB-устройства Windows
От: Shmj Ниоткуда  
Дата: 04.01.22 12:42
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Он без труда отделит обязательные блоки от специфичных для устройства, и соберет этот минимальный функционал сам.


На это время уйдет, особенно если с языком плохо знаком. Есть же технические писатели — может они уже отделили и не нужно будет тратить время на это.

ЕМ>А вот "дебилу", привыкшему к копипасте, как раз нужен готовый минимальный функционал, чтобы по-быстрому набить его типовым кодом (методом той же самой копипасты), худо-бедно довести до рабочего состояния, после чего гордо выдать за собственное изделие.


Откуда вы знаете — может быть все что вы делаете — это тоже модифицированная копипаста, просто вы забыли об этом. Почему вы думаете, что в принципе способы породить что-то новое?
Re[4]: Простейший пример драйвера USB-устройства Windows
От: Shmj Ниоткуда  
Дата: 04.01.22 12:55
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Если это несложно, что ж Вам не нравится? Берите документацию и делайте драйвер, делов-то.


Нигде нет примера минимального драйвера, который просто передает hello на USB-девайс и принимает ответ. Почему нет? Видимо кто-то хочет оставаться в касте шибко вумных, которые думают что передавать байты — это сложное.

Барьер здесь — не сложность а страх сложности.

ЕМ>Ну-ну. Давайте я Вам накидаю математических абстракций, описывающих передачу и обработку звуковых потоков в виндовом ядре (они несложны),


А причем тут звук? Механизм драйвера не связан со звуком. Я не об этом.

Конкретный девайс — да, может быть завязан на математические абстракции. Но сам по себе механизм драйверов — это тупо передача данных и не более того.
Re[5]: Простейший пример драйвера USB-устройства Windows
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.01.22 13:05
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>На это время уйдет, особенно если с языком плохо знаком.


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

S>Есть же технические писатели — может они уже отделили и не нужно будет тратить время на это.


Ага, я уже прям вижу заголовки: "создай свой ракетный двигатель за неделю", "как спроектировать атомную станцию, не сдав школьного экзамена по физике" и т.п.

S>Откуда вы знаете — может быть все что вы делаете — это тоже модифицированная копипаста, просто вы забыли об этом.


А я вообще никогда не использую копипасту из чужих исходников. Я и свои-то стремаюсь копипастить, ибо выглядит коряво. Если приходится делать что-то новое, и поначалу не совсем понимаю, как использовать предлагаемые средства — смотрю на пример и пишу по нему свой код, в привычном мне стиле, сохраняя лишь общий вид алгоритма.

S>Почему вы думаете, что в принципе способы породить что-то новое?


Хотя бы потому, что мой код заметно отличается от подавляющего большинства кода, который приходилось видеть. В какую сторону (лучшую или худшую) — отдельный вопрос, но отличается.
Re[5]: Простейший пример драйвера USB-устройства Windows
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.01.22 13:29
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Нигде нет примера минимального драйвера, который просто передает hello на USB-девайс и принимает ответ. Почему нет?


Возможно, потому же, почему нет примеров минимального BIOS или кода UEFI, которые можно прошить в ПЗУ любой платы, включить и увидеть на экране "hello".

S>Видимо кто-то хочет оставаться в касте шибко вумных, которые думают что передавать байты — это сложное.


Или никто из профессиональных разработчиков не хочет, чтобы к очередному купленному устройству прилагался драйвер, слепленный "не шибко вумным", поленившимся толком разобраться в сфере своей новой деятельности.

S>А причем тут звук? Механизм драйвера не связан со звуком.


Механизм любого драйвера завязан на реальное время и строгое соблюдение системных соглашений. Если драйвер USB-устройства, работающего со звуком, будет допускать хотя бы миллисекундные задержки — звук будет щелкать и трещать. Для видео это уже не так критично — там можно терять даже отдельные кадры, и почти никто не заметит. Для большинства остальных устройств это еще менее критично — именно поэтому существует немало ужасных драйверов для принтеров, сканеров, токенов и прочих устройств. Но драйвер — не пользовательский процесс, который можно прервать в любой момент. Поэтому эти кривые драйверы нередко мешают работе звукового софта. В любом руководстве по избавлению от заиканий звука Вы найдете советы отключить USB-устройства и сеть. Именно потому, что драйверы этих устройств все чаще делают те, кто учился по методикам, которые Вы предлагаете. Хотите, чтобы таких "продуктов" и их разработчиков становилось больше?

S>Но сам по себе механизм драйверов — это тупо передача данных и не более того.


Прежде всего это точное соблюдение всех спецификаций, протоколов, ограничений, правил и т.п. Любое отступление, которое в обычном софте может быть незаметно десятилетиями, в драйвере нередко выливается в проблемы для всей системы.
Re[3]: Простейший пример драйвера USB-устройства Windows
От: okman Беларусь https://searchinform.ru/
Дата: 04.01.22 15:35
Оценка: 10 (1) +1
Здравствуйте, Shmj, Вы писали:

S>Проблема вот в чем — для вхождения нужен минимальный функционал, а не реальный. Т.е. самый минимум, который делает минимум работы (ping-pong с девайсом, к примеру).


Я бы тогда предложил начать с литературы по разработке драйверов. Например, "Programming the Microsoft® Windows® Driver Model"
(Walter Oney), а также "Developing Drivers with the Windows Driver Foundation" (Penny Orwick, Guy Smith), эти книги и на
русском есть.

Начинать именно с этого: что такое драйвер, как устроен, как система взаимодействует с ним, какие есть правила,
ограничения и т.п. А уже после этого переходить к USB или какой-то другой специфической области.
Re[6]: Простейший пример драйвера USB-устройства Windows
От: Shmj Ниоткуда  
Дата: 04.01.22 20:43
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Тому, у кого на это уйдет неприемлемо долгое время,


Мне для общего развития, чтобы понимать как работает. Если потребуется — то время выделю.

ЕМ>Многие специализации немыслимы без вложения изрядного труда и времени.


Сколько строк кода будет в минимально драйвере, который отправляет 4 байта USB-устройству и получает ответ?

S>>Почему вы думаете, что в принципе способы породить что-то новое?


ЕМ>Хотя бы потому, что мой код заметно отличается от подавляющего большинства кода, который приходилось видеть. В какую сторону (лучшую или худшую) — отдельный вопрос, но отличается.


Может ты уже забыл все что видел. Названия переменных поменял — а суть не изменилась.
Re[4]: Простейший пример драйвера USB-устройства Windows
От: Shmj Ниоткуда  
Дата: 04.01.22 21:26
Оценка:
Здравствуйте, okman, Вы писали:

O>Я бы тогда предложил начать с литературы по разработке драйверов.


Мне не для разработки а для общего понимания. Как раз подходит пример сабжевый. Просто интересно через какие функции происходит передача данных на девайс.
Re[7]: Простейший пример драйвера USB-устройства Windows
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.01.22 21:55
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Мне для общего развития, чтобы понимать как работает.


Вам уже объяснили, что "для общего развития" нужно начинать с общих же материалов — каково место драйвера в ОС, чем он отличается от обычного процесса, когда и в каком порядке вызываются его функции-обработчики и т.д. Без этого нет особого смысла разбираться в устройстве драйвера именно USB. Если нужны именно особенности работы USB-устройств, то начинать лучше с их стандартов и протоколов (конечные точки, функции, описатели, пакеты, DMA и т.д.).

S>Сколько строк кода будет в минимально драйвере, который отправляет 4 байта USB-устройству и получает ответ?


Навскидку не скажу. Но USB-драйвер значительно сложнее драйвера какого-нибудь традиционного последовательного или параллельного порта, поскольку USB — весьма навороченная шина. Там много работы выполняет драйвер шины, но и драйвер устройства должен выполнить все положенные приседания, чтобы договориться и с ним, и с устройством.

S>Может ты уже забыл все что видел. Названия переменных поменял — а суть не изменилась.


А еще может, что все мы — продукт симуляции. Как на следует изменить свою жизнь в этом предположении?
Re[8]: Простейший пример драйвера USB-устройства Windows
От: Shmj Ниоткуда  
Дата: 04.01.22 22:25
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

S>>Сколько строк кода будет в минимально драйвере, который отправляет 4 байта USB-устройству и получает ответ?


ЕМ>Навскидку не скажу. Но USB-драйвер значительно сложнее драйвера какого-нибудь традиционного последовательного или параллельного порта, поскольку USB — весьма навороченная шина. Там много работы выполняет драйвер шины, но и драйвер устройства должен выполнить все положенные приседания, чтобы договориться и с ним, и с устройством.


Через какие функции он "договаривается"? Не сами данные а именно как функции называются, через которые передаются данные?

S>>Может ты уже забыл все что видел. Названия переменных поменял — а суть не изменилась.

ЕМ>А еще может, что все мы — продукт симуляции. Как на следует изменить свою жизнь в этом предположении?

Думаю что наше мнение о себе преувеличено. Мы можем некие концепции перенести на другую плоскость — но это бывает весьма весьма редко, может раз в жизни кто-то на шаг продвинется, и то не каждый человек.

А так — впитываем тонны информации, читаем тонны кода, приемов. Сами забываем где прочли, но в каком-то виде оно отложилось и когда нужно — всплывает под видом собственной идеи.
Re[8]: Простейший пример драйвера USB-устройства Windows
От: CreatorCray  
Дата: 04.01.22 22:39
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>А еще может, что все мы — продукт симуляции. Как на следует изменить свою жизнь в этом предположении?

Ты эта, прежде чем кормить зелёного хоть бы сначала в профиль ему посмотрел
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[5]: Простейший пример драйвера USB-устройства Windows
От: okman Беларусь https://searchinform.ru/
Дата: 05.01.22 11:35
Оценка: 10 (1)
Здравствуйте, Shmj, Вы писали:

S>Мне не для разработки а для общего понимания. Как раз подходит пример сабжевый. Просто интересно через какие функции происходит передача данных на девайс.


Как правило, драйверы USB не работают с устройством напрямую. Вместо этого они используют специальные пакеты ввода вывода — "USB Requests Blocks" (URBs).
Вот тут есть инфа:

USB Request Blocks (URBs)
https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/communicating-with-a-usb-device

Пакеты идут вниз по стеку, достигая драйвера шины (bus driver), а он уже занимается непосредственно взаимодействием с устройством.
Как именно — это уже сильно зависит от аппаратных особенностей ПК, от набора драйверов, от версии Windows и других факторов.
Можно сказать, что этот уровень — детали реализации, в которые разработчику драйверов погружаться не нужно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.