Создание Драйверов Usb На C#

Создание Драйверов Usb На C#

IC818042.png' alt='Создание Драйверов Usb На C#' title='Создание Драйверов Usb На C#' />Пишем драйвер для самодельного USB устройства Geektimes. Целью этой статьи является пошаговая демонстрация процесса разработки всего набора программного обеспечения необходимого для организации связи самодельного устройства с компьютером посредством USB. На данный момент, большинство радиолюбителей реализуют такой тип подключения используя чипы переходники USB в RS2. COM порта поставляемого с чипом переходником. Минусы такого подхода думаю понятны. Это как минимум лишний чип на плате и ограничения накладываемые этим чипом и его драйвером. Мне же хочется осветить весь процесс организации такого взаимодействия так как оно и должно быть сделано, и как делается во всех серьезных устройствах. В конце концов, сейчас 2. Благодаря библиотеке VUSB для создания устройства USB HID подойдет. Самый большой плюс теперь не нужен драйвер фильтра. Запустите Microsoft Visual C 2010 Express и создайте новый проект на. Так как для демонстрации процесса написания драйвера USB. Адаптация готового примера USB устройства под нашу плату с целью. USB есть почти во всех микроконтроллерах. Именно о том, как наиболее быстро воспользоваться этим модулем и будет эта статья. Так как для демонстрации процесса написания драйвера USB устройства нам необходимо собственно само устройство, то выберем одну из распространенных отладочных плат доступных в России. У меня это плата производства компании OLIMEX модель LPC P2. Основой платы является микроконтроллер LPC2. Калибровка Принтера Epson Cx4300 далее. ARM7. TDMI производства компании NXP. Всю информацию по плате можно получить на сайте производителя по следующей ссылке. Вот как она выглядит. Выбор контроллера и отладочной платы абсолютно не принципиален т. Среду разработки прошивки микроконтроллера будем использовать KEIL версии 4. В итоге, планируется реализовать только BULK тип передачи. Например, для AALchemy есть драйвер для Windows XP. C бывает полезен для расширения возможностей самой Visual. После создания файла main. Это устройство для обучения OSR USBFX2, описываемое в книге Windows Driver Foundation. Итак, после моей предыдущей статьи я понял что тема про программирование драйверов Windows интересна хабровчанам, поэтому. Из него наиболее существенным является ограничение числа строк кода, равное 800, а для создания простых драйверов этого может. Будем считывать массив данных из устройства в компьютер, а передавать на устройство будем состояние светодиодов, чтобы было видно, что плата реагирует на наши команды. Для удобства понимания разделим дальнейшие действия на стадии и будем проходить их по порядку. Адаптация готового примера USB устройства под нашу плату с целью убедиться, что плата работает и USB канал так же работоспособен. Это будет как бы наша стартовая точка. Изменение прошивки платы, чтобы она стала для Windows неизвестным устройством, требующее драйвер производителя. Адаптация базового шаблона, пустого драйвера, чтобы Windows могла его корректно установить, для обслуживания нашего устройства. Реализация взаимодействия драйвера с пользовательским приложением. Написание консольного приложения Windows для работы с нашим драйвером, а следовательно и подключенным USB устройством. Наполнение всей системы необходимыми функциями. Чего в этой статье не будет. Я не буду расписывать механизмы работы ОС, позволяющие находить и устанавливать нужный драйвер. Не будет описания, как собирать прошивку в среде KEIL. Не будет описания параметров дескрипторов USB и вообще практически не будет ничего сказано про то, как работает прошивка. В конце я предоставлю ссылки на все источники информации, мои исходные коды и собранные бинарные файлы. Таким образом, описание любого момента не охваченного данной статьей, можно будет легко найти по указанным источникам. Поймите правильно, нереально вместить в одну статью подробную информацию по всем этим темам. Тем более, что есть более компетентные источники. Адаптация примера RTX. Данный пример, когда успешно заработает, позволит нашу плату подключать к компьютеру и она будет там видна как обычная USB флешка. Таким образом мы получим прошивку, которая заведомо корректно настраивает USB модуль и всю необходимую процессору периферию. Проект находится в папке ARMBoardsKeilMCB2. RLUSB. Пути здесь и далее я буду указывать относительно основной папки, куда установлена среда KEIL. Скопируем проект в отдельное место, загрузим его в KEIL и соберем. Собраться должен без ошибок. В итоге мы получили HEX файл, который можем прошить с помощью утилиты Flash. Magic. Правда можно пока его не прошивать так как очевидно, что он работать на нашей плате не будет. Если сравнить схему нашей платы и платы для которой написан пример, а это модель MCB2. KEIL, то видно различия в подключении подтяжки линии D. На плате MCB2. 14. В, а на LPC P2. 14. Схемы обеих плат доступны на сайтах www. Для простоты, мы немного изменим код инициализации, чтобы наша плата всегда при включении включала подтяжку линии D, о чем будет сообщать светодиод USB. А так как на этом же транзисторе есть еще и светодиод USB. По этому их назначение так же нужно переопределить. На данном этапе я их переназначил просто для индикации процессов чтениязаписи. Так как у нас нет индикаторов LED. Подключив плату к компьютеру, видно, что он ее распознает как внешний накопитель и в системе появляется еще один диск размером всего около 2. КБайт и с файлом readme. На этом первый этап можно считать законченным. Переход от USB накопителя к уникальному устройству. Но нам требуется, чтобы Windows не знала, ким образом работать с нашим устройством и требовала драйвер. О том, что подключенное устройство относится ко классу накопителей, говорит параметр Interface class находящийся в дескрипторе интерфейса. Если открыть файл usbdesc. USB. Дело в том, что Windows запомнив VID и PID нашего устройства в предыдущий раз, как относящиеся к устройству внешнего хранения, может продолжать ставить на него свой драйвер не обращая внимание на то, что класс устройства поменялся. Решение простое. Если плата по прежнему определяется как накопитель, найдите ее в ветке USB диспетчера устройств и удалите драйвер вручную. После этого ОС должна начать просить драйвер. Создаем базовый драйвер. Драйвер будет иметь минимальный код, чтобы только корректно загрузиться и выгрузиться системой. Писать драйвер мы будем самым минималистическим методом. Сам код будет редактироваться в блокноте, а собираться будет в командной строке. Для начала, нужно скачать с сайта Microsoft набор для разработки драйвером. Называется он Windows Driver Kit. Я использую версию WDK 7. После установки, мы получим много примеров, окружение для сборки и документацию. В меню пуск, нужно найти раздел WDK и там Build Environments. Это так называемые окружения для сборки. Фактически они предоставляют нам консоль, которая уже настроина так, чтобы собирать драйверы для нужной системы. Вы видите, что там для каждой ОС отдельная папке, где находится пара окружений Checked и Free. Первое для так называемых Checked систем, собирает драйвер с дополнительной информацией полезной при отладке. Второе собирает релиз драйвера, который потом и используется. Я буду использовать далее окружение x. Checked Build Environment от windows XP. Это даст мне универсальный драйвер корректно работающий на системах от Windows XP и новее. Теперь займемся поиском шаблона, с которого было бы удобней всего начать. Самым подходящим кандидатом оказался пример к некой плате OSR USB FX2 learning kit. Что это за плата я абсолютно не имею понятия, но нужный нам пример находится в WDK по пути srcusbosrusbfx. Самое интересное, что это не просто пример, а пошаговое обучение, как сделать драйвер к этой плате. Как раз то, что нам и нужно. Зайдем глубже в директорию kmdfsys и видим, что там все шаги и лежат по папочкам. Подробнее о них можно почитать в описании примера, находящемся в файле osrusbfx. Тут я сделаю небольшое отступление, чтобы немножко сделать более понятней следующие действия. Дело в том, что с момента появления Windows NT кое что изменилось в процессе написания драйвера. В те времена нам приходилось напрямую использовать функции ядра ОС и часто, просто чтобы сделать пустышку способную правильно загружаться, выгружаться, отвечать на события PNP и т. Потом Microsoft сделала модель, которую назвала Windows Driver Model и которая внесла некоторого рода стандарт что ли, как должен выглядеть драйвер. Драйвер это просто Хабрахабр. Многие считают что самому создать драйвер для Windows это что то на грани фантастики. Но на самом деле это не так. Конечно, разработка драйвера для какого то навороченного девайса бывает не простой задачей. Но ведь тоже самое можно сказать про создание сложных программ или игр. В разработке простого драйвера нет ничего сложного и я попытаюсь на примерах это показать. Сперва нам нужно определится в чем мы же будем создавать наш первый драйвер. Поскольку материал ориентирован на новичков, то язык программирования был выбран один из простых, и это не Си или ассемблер, а бейсик. Будем использовать один из диалектов бейсика Pure. Basic. Из коробки он не обучен создавать драйверы, но у него удачный набор файлов, используемых для компиляции и небольшое шаманство позволяет добавить эту возможность. Процесс компиляции состоит из нескольких этапов. Если кратко, то он происходит следующим образом Сначала транслятор перегоняет basic код в ассемблер, который отдается FASMу компилятор ассемблера, который создает объектный файл. Далее в дело вступает линкер polink, создающий исполняемый файл. Как компилятор ассемблера, так и линкер могут создавать драйверы и если немного изменить опции компиляции, то получим не исполняемый файл, типа EXE или DLL, а драйвер режима ядра SYS. Скачать немного модифицированную бесплатную демо версию Pure. Basic 4. 6. 1 x. 86 можно на файлопомойке, зеркало. Если нужно создать драйвер для x. Дистрибутивы имеют небольшие размеры, около 3 МБ каждый. С помощью этой версии можно создавать только драйвера. Скачиваем, распаковываем и запускаем, кликнув по файлу Pure. Basic Portable. При этом запустится IDE и вылезет окошко с сообщением что это демо версия и списком ограничений. Из него наиболее существенным является ограничение числа строк кода, равное 8. Остальные ограничения в нашем случае, не существенны. Окно IDE с загруженным кодом драйвера показано на скрине. Компиляция драйвера выполняется через меню Компилятор это если кто не понял. Теперь определимся что будет делать наш первый драйвер. Обычно при изучении программирования начинают с простых вещей, скажем, выполнения математических операций и вывода результата. Вот пусть наш драйвер делает тоже самое, ведь банальная математика производимая в режиме ядра это очень круто Код драйвера Declare Driver. EntryDriver. Object, egistry. Path. public Pure. Basic. Start. section. Pure. Basic. Start. ADriver. Entry. Win. API функцию Device. Io. Control. In. Buff. Size tackParametersDevice. Io. ControlInput. Buffer. Length. Out. Buff. Size tackParametersDevice. Io. ControlOutput. Buffer. Length. If In. Buff. Size Size. OfInteger And Out. Buff. Size 4. Select tackParametersDevice. Io. ControlIo. Control. Code. Case IOCTL. Вызывается при завершении работы драйвера. Вызывается однократно при его запуске. Как видите, в этом драйвере есть такая процедура. Если посмотрите на начало кода, то в первых строках увидите как ей передается управление. В этой процедуре происходит инициализация драйвера. Там же назначается процедура завершения работы драйвера, которая в нашем случае имеет имя Unload. Driver. Процедуры Create. Dispatch и Close. Dispatch назначаются обработчиками соединения и отсоединения проги из юзермода. Процедура Device. Io. Control будет обрабатывать запросы Win. API функции Device. Io. Control, являющейся в данном драйвере связью с юзермодом. В конце кода расположена так называемая Дата. Секция Data. Section, в которой находятся имена драйвера, сохраненные в формате юникода для этого использована одна из фишек ассемблера FASM. Теперь рассмотрим как драйвер будет взаимодействовать с внешним миром. Это происходит в процедуре Device. Io. Control. В ней отслеживается одно сообщение, а именно IOCTL. Когда такое сообщение получено, то считываем из системного буфера, адрес указателя на структуру со слагаемыми, производим сложение и результат помещаем в системный буфер. Собственно это основная задача нашего первого драйвера. Видите сколько понадобилось кода для выполнения простейшей математической операции сложения двух чисел А теперь рассмотрим программу, работающую с этим драйвером. Она написана на том же Pure. Basic. Для упрощения, имя драйвера, имя службы и описание службы заданы одинаковыми pb. Dr. Plus. Если загрузка неудачная, то выводится соответствующее сообщение и программа завершает свою работу. Процедура Plus осуществляет связь с драйвером. Ей передаются хэндл, доступа к драйверу и слагаемые числа, которые помещаются в структуру и указатель на указатель которой, передается драйверу. Результат сложения чисел будет в переменной Result. Далее следует код простейшего GUI калькулятора, скопированного из википедии. Когда закроют окно, то перед завершением работы программы, закрывается связь с драйвером и производится его деинсталляция из системы. Результат сложения чисел 8 и 2 на скриншоте. Исходные коды драйвера и программы, можно найти в папке Examples, Pure. Basic на файлопомойке, ссылку на который давал в начале статьи. Там так же найдете примеры драйвера прямого доступа к порам компа и пример работы с памятью ядра. PS. Помните, работа в ядре чревата мелкими неожиданностями аля, BSOD синий экран смерти, поэтому экспериментируйте осторожно и обязательно вс сохраняйте перед запуском драйвера.

Архив

Создание Драйверов Usb На C#
© 2017