Как написать драйвер для принтера
Написание драйверов всегда являет собой достаточно сложный трудоемкий процесс, требующий от вас не только определенных знаний и навыков, но и большое количество времени. В основном это необходимо для обеспечения работы устройств в альтернативных операционных системах.
Вам понадобится
- — программа-компилятор;
- — эмулятор;
- — блокнот для написания кода.
Инструкция
Изучите специфику драйверов принтера для операционной системы, в которой будете работать в дальнейшем. Также стоит учитывать вид самого печатающего устройства, поскольку принцип работы струйных, лазерных и матричных принтеров может различаться. Обратите внимание, что данный процесс достаточно трудоемкий и требует от вас наличие навыков программирования на достаточно высоком уровне.
Изучив программную часть аспектов работы выбранного вами принтера, выберите язык и средство программирования. В случае если ваш драйвер рассчитан не на одну, а несколько платформ, воспользуйтесь также загрузкой дополнительных программ-эмуляторов. Также вы можете использовать билдеры, которые имеют в себе сразу все необходимые инструменты для написания программного обеспечения – редактор, компилятор, эмулятор. Также, очень редко, встречаются программы и с регистраторами.
В случае возникновения у вас проблем с написанием программного обеспечения обратитесь за помощью в специальные тематические форумы. Скорее всего, проблемы возникнут уже на начальном этапе. После написания кода программы перейдите к его проверке.
Запустите программу-эмулятор и выберите рабочую среду, запустив драйвер. В случае неисправностей в работе внимательно просмотрите весь код от начала до конца для выявления ошибок.
Если проверка драйвера прошла успешно, выполните компиляцию программы. Для этого скачайте отдельную утилиту или, если это возможно, скомпилируйте драйвер при помощи встроенного в билдер программного обеспечения. Данный процесс может занять достаточно долгое время, в ходе его выполнения не выполняйте никаких операций с программой-компилятором, не перезагружайте компьютер и предварительно сохраняйте рабочую конфигурацию.
Видео по теме
Полезный совет
Выполните поиск драйверов нужных устройств по тематическим форумам.
Источники:
- написанию драйверов
Войти на сайт
или
Забыли пароль?
Еще не зарегистрированы?
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Опубликовано 27.11.2021
Итак, для начала приведем текст этой несложной программы.
Итак, теперь сначала разберемся, что делает каждая инструкция. Перво-наперво мы подключаем заголовочный файл ntddk.h. Это один из базовых подключаемых файлов во всех драйверах: в нем содержатся объявления типов NTSTATUS, PDRIVER_OBJECT, PUNICODE_STRING, а также функции DbgPrint.
Структура DriverObject содержит множество полей, которые определяют поведение будущего драйвера. Наиболее ключевые из них — это указатели на так называемые вызываемые (или callback) функции, то есть функции, которые будут вызываться при наступлении определенного события. Одну из таких функций мы определяем: это функция UnloadRoutine. Указатель на данную функцию помещается в поле DriverUnload. Таким образом при выгрузке драйвера сначала будет вызвана функция UnloadRoutine. Это очень удобно, когда драйвер имеет какие-то временные данные, которые следует очистить перед завершением работы. В нашем примере эта функция нужна только чтобы отследить сам факт завершения работы драйвера.
Вы можете задуматься, мол ну с первой-то директивой понятно, типа оптимизация и все такое, но зачем мы используем вторую директиву, зачем помечать код как возможный к выгрузке в файл подкачки? Поясню этот вопрос: каждый процесс в системе имеет такой параметр, как IRQL (подробнее читаем по ссылке Interrupt request level ибо это материал отдельной статьи), то есть некоторый параметр, отвечающий за возможность прерывания процесса: чем выше IRQL тем меньше шансов прервать выполнение процесса. Возможности процесса так же зависят от IRQL: чем выше IRQL тем меньше возможности процесса, это вполне логично, т.е. такой подход побуждает разработчиков выполнять только самые необходимые операции при высоком IRQL, а все остальные действия делать при низком. Вернемся к основной теме, о том, почему мы делаем для функции UnloadRoutine возможность выгрузки в файл подкачки: все опять же сводится к оптимизации: работа с файлом подкачки недоступна при высоком IRQL, а процедура выгрузки драйвера гарантированно выполняется при низком IRQL, поэтому мы специально указываем руками что код функции выгрузки драйвера можно поместить в своп.
Ух, вроде как с обсуждением кода этой, казалось бы небольшой программки закончено, теперь разберемся как скомпилировать и запустить наш драйвер.
Теперь последовательность действий: сначала мы пишем два файла, один называется MAKEFILE, с таким содержимым
а второй называется sources и содержит в себе следующее:
Эти файлы нужны для сборки драйвера. Да, забыл сказать, что в WDK нет встроенной среды разработки, поэтому и нужен текстовый редактор, чтобы набирать текст драйверов. Для этой цели можно использовать и Visual Studio (некоторые даже интегрируют возможность сборки драйверов из VS), и любой другой текстовый редактор.
Сохраняем код драйвера в файл TestDriver.c и кладем его в ту же директорию, что и файлы MAKEFILE и souces. После этого запускаем установленный build environment (это командная строка с заданными переменными окружения для компиляции драйвера; она входит в WDK, и запустить ее можно как-то так: «Пуск->Программы->Windows Driver Kits->. ->Build Environments->WindowsXP->Windows XP x86 Checked Build Environment»). Переходим в директорию, куда мы положили файл с драйвером (у меня это C:DriversTestDriver) с помощью команды cd (у меня команда выглядит следующим образом: cd C:DriversTestDriver) и набираем команду build.
Данная команда соберет нам драйвер TestDriver.sys и положит его в папку «objchk_wxp_x86i386».
Итак, чего же мы достигли: мы написали, скомпилировали и запустили свой первый Windows-драйвер! Добавлю только, что при написании сложный драйверов для отладки используется двухмашинная конфигурация, когда на одном компьтере ведется написание драйвера, а на другом — запуск и тестирование. Это делается из-за того, что неправильно написанный драйвер может обрушить всю систему, а на ней может быть очень много ценных данных. Часто в качестве второго компьютера используется виртуальная машина.
Многие считают что самому создать драйвер для Windows это что-то на грани фантастики. Но на самом деле это не так. Конечно, разработка драйвера для какого-то навороченного девайса бывает не простой задачей. Но ведь тоже самое можно сказать про создание сложных программ или игр. В разработке простого драйвера нет ничего сложного и я попытаюсь на примерах это показать.
Сперва нам нужно определится в чем мы же будем создавать наш первый драйвер. Поскольку материал ориентирован на новичков, то язык программирования был выбран один из простых, и это не Си или ассемблер, а бейсик. Будем использовать один из диалектов бейсика — PureBasic. Из коробки он не обучен создавать драйверы, но у него удачный набор файлов, используемых для компиляции и небольшое шаманство позволяет добавить эту возможность. Процесс компиляции состоит из нескольких этапов. Если кратко, то он происходит следующим образом: Сначала транслятор «перегоняет» basic-код в ассемблер, который отдается FASM’у (компилятор ассемблера), который создает объектный файл. Далее в дело вступает линкер polink, создающий исполняемый файл. Как компилятор ассемблера, так и линкер могут создавать драйверы и если немного изменить опции компиляции, то получим не исполняемый файл, типа EXE или DLL, а драйвер режима ядра (SYS).
Окно IDE с загруженным кодом драйвера показано на скрине.
Компиляция драйвера выполняется через меню «Компилятор» (это если кто не понял).
Теперь определимся что будет делать наш первый драйвер. Обычно при изучении программирования начинают с простых вещей, скажем, выполнения математических операций и вывода результата. Вот пусть наш драйвер делает тоже самое, ведь банальная математика производимая в режиме ядра это очень круто!
Может показаться что это куча бессмысленного кода, но это не так.
У каждого драйвера должна быть точка входа, обычно у нее имя DriverEntry() и выполнена она в виде процедуры или функции. Как видите, в этом драйвере есть такая процедура. Если посмотрите на начало кода, то в первых строках увидите как ей передается управление. В этой процедуре происходит инициализация драйвера. Там же назначается процедура завершения работы драйвера, которая в нашем случае имеет имя UnloadDriver(). Процедуры CreateDispatch() и CloseDispatch() назначаются обработчиками соединения и отсоединения проги из юзермода.
Процедура DeviceIoControl() будет обрабатывать запросы WinAPI функции DeviceIoControl(), являющейся в данном драйвере связью с юзермодом. В конце кода расположена так называемая ДатаСекция (DataSection), в которой находятся имена драйвера, сохраненные в формате юникода (для этого использована одна из фишек ассемблера FASM).
Видите сколько понадобилось кода для выполнения простейшей математической операции — сложения двух чисел?
А теперь рассмотрим программу, работающую с этим драйвером. Она написана на том же PureBasic.
Процедура Plus() осуществляет связь с драйвером. Ей передаются хэндл, доступа к драйверу и слагаемые числа, которые помещаются в структуру и указатель на указатель которой, передается драйверу. Результат сложения чисел будет в переменной «Result».
Далее следует код простейшего GUI калькулятора, скопированного из википедии.
Когда закроют окно, то перед завершением работы программы, закрывается связь с драйвером и производится его деинсталляция из системы.
Результат сложения чисел 8 и 2 на скриншоте.
Исходные коды драйвера и программы, можно найти в папке «Examples», PureBasic на файлопомойке, ссылку на который давал в начале статьи. Там так же найдете примеры драйвера прямого доступа к порам компа и пример работы с памятью ядра.
PS.
Помните, работа в ядре чревата мелкими неожиданностями аля, BSOD (синий экран смерти), поэтому экспериментируйте осторожно и обязательно всё сохраняйте перед запуском драйвера.
Написание драйверов всегда являет собой достаточно сложный трудоемкий процесс, требующий от вас не только определенных знаний и навыков, но и большое количество времени. В основном это необходимо для обеспечения работы устройств в альтернативных операционных системах.
- Как написать драйвер для принтера
- Как обновить драйвер принтера
- Как собрать драйвер
- — программа-компилятор;
- — эмулятор;
- — блокнот для написания кода.
Изучите специфику драйверов принтера для операционной системы, в которой будете работать в дальнейшем. Также стоит учитывать вид самого печатающего устройства, поскольку принцип работы струйных, лазерных и матричных принтеров может различаться. Обратите внимание, что данный процесс достаточно трудоемкий и требует от вас наличие навыков программирования на достаточно высоком уровне.
Изучив программную часть аспектов работы выбранного вами принтера, выберите язык и средство программирования. В случае если ваш драйвер рассчитан не на одну, а несколько платформ, воспользуйтесь также загрузкой дополнительных программ-эмуляторов. Также вы можете использовать билдеры, которые имеют в себе сразу все необходимые инструменты для написания программного обеспечения – редактор, компилятор, эмулятор. Также, очень редко, встречаются программы и с регистраторами.
В случае возникновения у вас проблем с написанием программного обеспечения обратитесь за помощью в специальные тематические форумы. Скорее всего, проблемы возникнут уже на начальном этапе. После написания кода программы перейдите к его проверке.
Запустите программу-эмулятор и выберите рабочую среду, запустив драйвер. В случае неисправностей в работе внимательно просмотрите весь код от начала до конца для выявления ошибок.
Если проверка драйвера прошла успешно, выполните компиляцию программы. Для этого скачайте отдельную утилиту или, если это возможно, скомпилируйте драйвер при помощи встроенного в билдер программного обеспечения. Данный процесс может занять достаточно долгое время, в ходе его выполнения не выполняйте никаких операций с программой-компилятором, не перезагружайте компьютер и предварительно сохраняйте рабочую конфигурацию.
Драйвер – программное обеспечение для корректной работы устройства, связывающее его с операционной системой. Этот полезный софт поможет вашему принтеру работать согласованно с компьютером, печатая быстро и качественно.
- Как найти драйвера ко всем принтерам Canon
- Где скачать драйвера к принтеру Canon
- Как обновить драйвер принтера
- — принтер Canon;
- — диск с драйверами для принтера;
- — ПК с выходом в интернет.
Устанавливая драйвера для принтера Canon, определите его модель, прочитав название на корпусе аппарата. Узнать марку печатающего устройства можно и из прилагающейся к нему документации.
Помните, что в комплекте с высокотехнологичной техникой требующей активации дополнительного программного обеспечения, всегда прилагается компакт-диск с соответствующими драйверами. Если носитель был вами утерян, приобретите его в компьютерном салоне.
Найти необходимое вам программное обеспечение можно в сборнике драйверов, предварительно проверив его наличии в списке. Если ваши знакомые используют аналогичное печатающее устройств, попросите у них установочный диск.
Посетите официальный веб-сайт Canon, перейдя по ссылке в конце статьи. На титульной странице производителя откройте раздел «Поддержка» и пункт «Каталог драйверов». В появившемся окне внесите данные в подходящую колонку, одна из которых предназначена программному обеспечению для домашнего компьютера, а другая заполняется теми, кто планирует использовать его в коммерческих целях.
Выберите свою страну из выпадающего списка в первом поле, а во втором укажите тип оборудования, нажав на кнопку Printers. Выделите модель вашего печатающего устройства и подтвердите свое действие, кликнув на пункт Go. Дождитесь обработки запроса и, следуя пошаговым указаниям, заполните все поля формы. Активируйте параметр Download, укажите директорию на компьютере и загрузите драйвер для вашего принтера Canon.
Убедитесь, что печатающий аппарат соединен с компьютером и подключен к электрической сети. Запустите сохраненный на жестком диске установочный файл и следуйте пошаговым инструкциям. Установив драйвер, распечатайте пробную страницу и проверьте качество полученного изображения.
Обычно оптический диск с необходимыми драйверами, дополнительными программами и справочными материалами приобретается вместе с принтером. Но если печатное устройство попало к вам не из магазина и без такого диска, получить все, что на нем содержится, включая и драйверы, можно через интернет. Практически все производители имеют свои серверы в сети и распространяют такое программное обеспечение бесплатно.
- Где скачать драйвера к принтеру Canon
- Как установить драйвер на принтер Canon lbp 2900
- Как обновить драйвер принтера
Очень удобно иметь в своем компьютере программу-всезнайку, которая способна в одном месте собрать всю информацию обо всем используемом «железе» и «софте» — внутренних и подключенных к компьютеру устройствах, операционной системе и т.д. Современные программы этого рода кроме параметров устройств выдают и ссылки на страницы сайтов их производителей, которые содержат описания, драйверы и прикладные программы для их обслуживания. Одна из таких полезных программ называется AIDA 64.
Чтобы с использованием этого приложения получить ссылку на загрузку драйвера Canon, включите принтер, запустите AIDA 64, в списке разделов выберите сначала «Устройства», а затем «Принтеры». Если к компьютеру подключено больше одного устройства печати, в правом фрейме выберите Canon в списке «Имя принтера». Последним разделом в таблице с информацией об устройстве будет «Производитель принтера» — дважды щелкните по ссылке в поле «Информация о продукте» этого раздела. В браузер будет загружена страница сайта Canon, относящаяся именно к вашей модели устройства печати. Это страница англоязычной версии сайта, поэтому для перехода к странице со ссылками на загрузку драйвера кликните Drivers & Software.
Русский сайт откроет англоязычную страницу загрузки драйверов, помещенную на относящемся к европейскому подразделению Canon сервере. В колонке For you выберите страну в выпадающем списке Country, затем установите Printers в поле Product, а потом в перечне Model найдите нужную модель принтера и кликните Go. После этого вновь будет загружена русскоязычная страница, на которой нужно поставить отметку в поле «Программное обеспечение (драйвера и приложения)». Затем в списке «Доступное программное обеспечение» выберите нужный драйвер, поставьте галочку в чекбоксе «Я принимаю условия соглашения» и нажмите кнопку «Загрузить».
Читайте также:
- Как удалить имя ячейки в excel
- Установка дополнительного по directx visual c что это
- Как смазать janome my excel 23xe
- Браузер это программа для просмотра web страниц выберите один
- 2 добавить в настройках браузера в надежные сайты адрес https fzs roskazna ru
В один прекрасный день меня попросили написать Драйвер. На тот день мои познания в C/C++ ограничивались программой Hellow Word, и поэтому на вопрос: «Напишешь?» я самоуверенно ответил: «Конечно». На следующий день я узнал, что на свете существуют MSDN и DDK. Вскоре я понял, что не все Windows одинаковые, оказалось, что мой драйвер должен работать под Win2000/NT. У меня ушло больше месяца на то, чтобы скомпилировать и запустить свой первый Драйвер. По правде сказать, это был не совсем мой Драйвер, а точнее — это был genport из NTDDK. Но радовался я так, как будто минимум написал свою ОС.
Недавно мне пришлось опять вернуться к Драйверу. И вот вчера я, наконец-то, сдал работающий драйвер и решил написать эту небольшую статью, для того, чтобы как-то систематизировать то, что я узнал, и, чтобы когда мне снова придется взяться за драйвер, было от чего отталкиваться.
Люди, знающие что такое IOCTL, DEVICE_EXTENSION, MajorFunction и DriverEntry не найдут здесь ничего нового. Эта статья для тех, кто, возможно, никогда не слышал слово ДДК, и кто до сего дня никогда не заглядывал в исходники драйверов. И еще, я буду довольно-таки подробно описывать многие, даже очевидные вещи, поэтому напомню о том, что данная статья рассчитана на людей с очень малым опытом программирования, какой был у меня, когда я занялся написанием драйверов.
Первое, с чем сталкивается программист, решивший заняться драйверами, это почти полное отсутствие русскоязычной литературы по данной теме. За год поисков мне удалось найти всего три книги на русском, в которых хотя бы немного говорится о драйверах:
————————
1. Свен Шрайбер «Недокументированные возможности Windows 2000». Издательство «Питер» 2002 год.
Здесь очень хорошо описан механизм динамической загрузки драйвера.
——————
2. П. И. Рудаков, К. Г. Финогенов «Язык ассемблера: уроки программирования» Диалог МИФИ 2001 год.
Очень полезная книга для того, что бы понять, как писать драйвера без всякий Wizard-ов.
——————————
3. Светлана Сорокина, Андрей Тихонов, Андрей Щербаков «Программирование драйверов и систем безопасности». Издательство «БХВ-Петербург» 2002 год.
Здесь хорошо описывается многоуровневая модель драйверов.
Я ни в коей мере не претендую как на полноту освещения темы написания драйверов, так и на 100% правильность и достоверность того, что здесь написано (но все приведенные здесь исходники проверены и являются работоспособными). Буду благодарен всем, приславшим мне (01_artem@mail.ru) или высказавшим в форуме свои замечания.
Итак, я обращаюсь к человеку, решившему написать Драйвер уровня ядра под Win2000/NT. Надеюсь, эти заметки помогут сэкономить кучу времени и сил.
Прежде всего, я бы не рекомендовал (исходя из собственного опыта) пользоваться различными библиотеками (типа NuMega и всякими другими визардами). В основном из-за того, что даже для написания простейшего драйвера необходимо хотя бы поверхностное представление о том, как он функционирует. И самый простой способ получить представление об этом — написать драйвер самому. Мне, например, не хватило терпения разобраться с NuMega, и даже оболочки функций динамической загрузки/выгрузки драйвера, предложенные Свен Шрайбером в своей книге, я предпочел переписать.
Итак, начнем. Для начала надо установить на компьютер Visul C++ 6.0, MSDN и NTDDK установку проводить желательно именно в этом порядке. Лично я пользуюсь редактором UltraEdit для работы с текстами драйверов, но, в принципе, исходный код драйвера можно набирать в любом текстовом редакторе, хоть в NotePad.
Создадим папку, в которой мы будем работать с драйвером (пусть это будет C:myDriver). В этой папке создадим 5 файлов:
1. myDrv.c
2. myDrv.h
3. myDrv.rc
4. MAKEFILE
5. SOURCES
Начнем с последнего файла. В SOURCES скопируйте следующее:
TARGETNAME=myDrv
TARGETPATH=obj
TARGETTYPE=DRIVER
SOURCES=myDrv.c MyDrv.rc
В MAKEFILE скопируйте следующее:
!INCLUDE $(NTMAKEENV)makefile.def
В myDrv.rc скопируйте следующее:
#include <windows.h>
#include <ntverp.h>
#define VER_FILETYPE VFT_DRV
#define VER_FILESUBTYPE VFT2_DRV_SYSTEM
#define VER_FILEDESCRIPTION_STR «Generic Port I/O»
#define VER_INTERNALNAME_STR «myDrv.sys»
#include «common.ver»
А вот так должен выглядеть myDrv.h:
#define FIRST_IOCTL_INDEX 0x800
#define FILE_DEVICE_myDRV 0x00008000
#define TEST_SMTH CTL_CODE(FILE_DEVICE_myDRV,
FIRST_IOCTL_INDEX + 101,
METHOD_BUFFERED,
FILE_ANY_ACCESS)
Теперь обратимся к тексту самого драйвера myDrv.c:
#include «ntddk.h»
#include «myDrv.h»
#include «parallel.h»
#define NT_DEVICE_NAME L»\Device\myDrv»
#define DOS_DEVICE_NAME L»\DosDevices\myDrv»
//структура расширения устройства
typedef struct _DEVICE_EXTENSION
{
PDRIVER_OBJECT DriverObject;
PDEVICE_OBJECT DeviceObject;
PFILE_OBJECT FileObject;
HANDLE Handle;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
//прототипы функций
NTSTATUS
DriverDeviceControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
VOID
DriverUnload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS
DriverOpen(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
NTSTATUS
DriverClose(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
/////////////////////////////////////////////////////////////////////////////////реализация функций
NTSTATUS
DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
PDEVICE_OBJECT deviceObject;
UNICODE_STRING deviceNameUnicodeString;
UNICODE_STRING deviceLinkUnicodeString;
PDEVICE_EXTENSION extension;
NTSTATUS ntStatus;
RtlInitUnicodeString(&deviceNameUnicodeString, NT_DEVICE_NAME);
ntStatus = IoCreateDevice(DriverObject,
sizeof (DEVICE_EXTENSION),
&deviceNameUnicodeString,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&deviceObject);
if (!NT_SUCCESS(ntStatus)) return ntStatus;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverDeviceControl;
DriverObject->DriverUnload = DriverUnload;
DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverOpen;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverClose;
extension = (PDEVICE_EXTENSION) deviceObject->DeviceExtension;
extension->DeviceObject = deviceObject;
extension->DriverObject = DriverObject;
// Create counted string version of our Win32 device name.
RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);
// Create a link from our device name to a name in the Win32 namespace.
ntStatus = IoCreateSymbolicLink(&deviceLinkUnicodeString, &deviceNameUnicodeString);
if (!NT_SUCCESS(ntStatus))
{
IoDeleteDevice(deviceObject);
return ntStatus;
}
return STATUS_SUCCESS;
}
//———————————————————————————————-
VOID
DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING deviceLinkUnicodeString;
PDEVICE_EXTENSION extension;
PIRP pNewIrp = NULL;
ULONG m_size;
NTSTATUS ntStatus;
extension = DriverObject->DeviceObject->DeviceExtension;
// Create counted string version of our Win32 device name.
RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);
// Delete the link from our device name to a name in the Win32 namespace.
IoDeleteSymbolicLink(&deviceLinkUnicodeString);
// Finally delete our device object
IoDeleteDevice(DriverObject->DeviceObject);
}
//————————————————————————————————
NTSTATUS
DriverOpen(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
//————————————————————————————————
NTSTATUS
DriverClose(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
//————————————————————————————————
NTSTATUS
DriverDeviceControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
NTSTATUS ntStatus;
PIO_STACK_LOCATION irpStack;
PDEVICE_EXTENSION extension;
PULONG ioBuffer;
ULONG ioControlCode;
ULONG port = 0;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
irpStack = IoGetCurrentIrpStackLocation(Irp);
extension = DeviceObject->DeviceExtension;
ioBuffer = Irp->AssociatedIrp.SystemBuffer;
ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
switch (ioControlCode)
{
case TEST_SMTH:
ioBuffer[0] =(ULONG)DriverEntry;//В буфер обмена адрес функции DriverEntry
Irp->IoStatus.Information = 4;
break;
default:
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
break;
}
ntStatus = Irp->IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return ntStatus;
}
Немного поясню содержимое файла myDrv.c. Итак, по порядку:
#define NT_DEVICE_NAME L»DevicemyDrv»
#define DOS_DEVICE_NAME L»DosDevicesmyDrv»- Эти строки служат для задания символических имен текстовыми строками с именами объекта устройства, который будет создан нашим драйвером.
Далее приведены прототипы используемых функций. Этим функциям можно дать произвольные имена, НО их сигнатура (состав параметров с типом возвращаемого значения) жестко заданы системой. [2]:Программная часть драйвера начинается с обязательной функции с именем DriverEntry(), которая автоматически вызывается системой на этапе загрузки драйвера. Эта функция должна содержать все действия по его инициализации. В качестве первого параметра наша функция получает указатель на объект драйвера типа PDRIVER_OBJECT.
При загрузке драйвера системы создается объект драйвера (driver object), олицетворяющий образ драйвера в памяти. С другой стороны, объект драйвера представляет собой структуру, содержащую необходимые для функционирования драйвера данные и адреса функций. В процессе инициализации драйвера (в DriverEntry()) создаются один или несколько объектов устройств (device object), олицетворяющие те устройства, с которыми будет работать драйвер. Этот самый device object необходим для правильного функционирования драйвера и создается (как и в нашем случае) даже тогда, когда драйвер не имеет отношения к какому-либо реальному устройству.
Далее, в первых строках DriverEntry мы определяем используемые в ней данные, в т.ч. указатель на device object, и две символьные строки UNICODE_STRING с именами устройств. Системные программы взаимодействуют с объектом устройства, созданным драйвером, посредством указателя на него. Однако для прикладных программ объект устройства представляется одним из файловых объектов, и обращение к нему осуществляется по имени (в приложении мы будем использовать функцию CreateFile()).
Надо иметь в виду, что объект устройства должен иметь два имени, одно — в пространстве имен NT, другое — в пространстве имен Win32. Эти имена должны представлять собой структуры UNICODE_STRING. Имена объектов устройств составляются по определенным правилам. NT-имя предваряется префиксом Device, а Win32-имя — префиксом ?? (или DosDevice). При указании имен в Си-программе знак обратной косой черты удваивается. Для того, чтобы указанное в программе драйвера имя можно было использовать в приложении для открытия устройства, следует создать символическую связь между обоими заданными именами устройств. Для этого используем функцию IoCreateSymbolicLink(). Следующая обязательная операция — создание объекта устройства — осуществляется вызовом функции IoCreateDevice(). Первый параметр этой функции — это указатель на объект драйвера, поступающий в DriverEntry(). Второй параметр определяет размер расширения устройства — структуры, которая служит для передачи данных между функциями драйвера (состав этой структуры произволен и полностью определяется разработчиком). Третий параметр — созданное ранее NT-имя устройства. Далее идут: тип устройства (FILE_DEVICE_UNKNOWN), специальные характеристики (0), FALSE означает, что у нас однопоточное устройство. Наконец, последний параметр является выходным — через него функция возвращает указатель на созданный объект устройства.
Далее необходимо занести в объект драйвера адреса основных функций, включенных программистом в текст драйвера. Массив MajorFunction является одним из элементов структурной переменной. В этот массив мы и заносим адреса основных функций (т.е. функций, которые вызываются системой автоматически в ответ на определенные действия приложения или устройства). Завершается функция оператором return с указанием кода успешного завершения.
Функция DriverUnload() вызывается при выгрузке драйвера. Здесь мы должны выполнить действия по удалению объекта устройства, созданного в DriverEntry().
Функции DriverOpen и DriverClose в нашем случае ничего не делают и возвращают просто STATUSS_SUCCESS. Кстати, все эти функции тоже могут иметь произвольные имена, но передаваемые им параметры строго фиксированы.
[2]:Вот мы и добрались до самой содержательной, с точки зрения прикладного программирования, функции DriverDeviceControl(). Эта функция вызывается каждый раз, когда драйверу приходит IRP-пакет с каким либо IOCTL_ кодом. Грубо говоря, IRP-пакет — это структура, передавая указатель на которую, приложение может общаться с драйвером (как, впрочем, и драйвер может общаться с другим драйвером). Более подробное описание того, что такое IRP-пакет, можно найти здесь http://www.lcard.ru/~gorinov/texts/irp99.html.
IRP-пакет содержит так называемый системный буфер, служащий для обмена информацией (переменная SystemBuffer). Таким образом, нам надо получить доступ к IRP-пакету, а через него к SystemBuffer. Для этого объявляем переменную irpStack типа указателя на стековую область ввода-вывода PIO_STACK_LOCATION, и, кроме того, переменная ioBuffer, в которую будет помещен адрес системного буфера обмена. В нашем случае тип этой переменной — PULONG, в действительности тип передаваемых данных может быть каким угодно. С помощью функции IoGetCurrentIrpStackLocation() в переменную irpStack помещается адрес стековой области ввода-вывода, а в переменную ioBuffer заносится адрес системного буфера из структуры IRP. Системный буфер входит в объединение (union) с именем AssociatedIrp, поэтому мы используем конструкцию Irp->AssociatedIrp.SystemBuffer. Конструкция switch-case анализирует содержимое ячейки IoControlCode и в зависимости от значения кода выполняет те или иные действия. В нашей программе только один код действия TEST_SMTH. Засылка в буфер обмена адреса функции DriverEntry() осуществляется через указатель на этот буфер. В переменную Irp->IoStatus.Information заносим количество (4) пересылаемых байт. Для завершения IRP-пакета вызываем IoCompleteRequest().
Итак, драйвер мы написали. Теперь надо его скомпилировать. Т.к. процесс компиляции идет из командной строки, то для этой цели гораздо удобнее пользоваться bat-файлом. Создадим небольшой bat-файл с именем, допустим, Crt.bat и со следующим содержанием:
%SystemRoot%system32cmd.exe /c «cd C:NTDDKbin&&setenv.bat C:NTDDK&&cd c:myDriver &&build -ceZ»
pause
NTDDK у меня установлено в корень С:, если у Вас по-другому, то вместо C:NTDDKbin и C:NTDDK пропишите полные пути к соответствующим папкам.
Итак, теперь запустим наш Crt.bat. После окончания компиляции в папке C:myDriverobjfrei386 находим готовый драйвер myDrv.sys. Наш драйвер пока умеет только лишь загружаться/выгружаться и по специальному запросу посылает приложению адрес одной из своих процедур.
Теперь займемся написанием приложения, работающего с нашим драйвером. Еще раз напоминаю, что мы работаем под Win2000. Эта ОС позволяет реализовать динамическую загрузку/выгрузку драйвера.
Точнее, динамическую загрузку/выгрузку служб (service), но т.к. в Win2000 в качестве службы можно рассматривать и драйвер, я буду использовать оба эти термина, подразумевая, в данной статье, наш драйвер.
Для загрузки и выгрузки драйверов используется диспетчер управления службами SC Manager (Service Control Manager). Прежде чем вы сможете работать с интерфейсом SC, вы должны получить дескриптор диспетчера служб. Для этого необходимо обратиться к функции OpenSCManager(). Дескриптор диспетчера служб необходимо использовать при обращении к функциям CreateServise() и OpenService(). Дескрипторы, возвращаемые этими функциями, необходимо использовать при обращении к вызовам, имеющим отношение к конкретной службе. К подобным вызовам относятся функции ControlService(), DeleteService() и StartService(). Для освобождения дескрипторов обоих типов используется вызов CloseServiceHandle().
Загрузка и запуск службы подразумевает выполнение следующих действий:
- Обращение к функции OpenSCManager() для получения дескриптора диспетчера
- Обращение к CreateServise() для того, чтобы добавить службу в систему. Если такой сервис уже существует, то CreateServise() выдаст ошибку с кодом 1073 (код ошибки можно прочитать GetLastError()) Данная ошибка означает, что сервис уже существует и надо вместо CreateServise() использовать OpenService().
- Обращение к StartService() для того, чтобы перевести службу в состояние функционирования.
- Если служба запустилась успешно, то можно вызвать CreateFile() для получения дескриптора, который мы будем использовать уже непосредственно при обращении к драйверу.
- И по окончании работы не забудьте дважды обратиться к CloseServiceHandle() для того, чтобы освободить дескрипторы диспетчера и службы.
Если на каком-то шаге этой последовательности возникла ошибка, нужно выполнить действия, обратные тем, которые вы успели выполнить до ошибки. Надо помнить о том, что при обращении к функциям, подобным CreateServise(), необходимо указывать полное имя исполняемого файла службы (в нашем случае полный путь и имя myDrv.sys).
Посмотрим на исходный текст простого консольного приложения, написанного на Visual C++ 6.0:
#include <conio.h>
#include «LoadDRV.h»
#include <string.h>
#include <stdio.h>
void main()
{
LPTSTR m_name = new char[20];
strcpy(m_name, «myDrv.sys»);
if (drvLoad(m_name)) TestSmth();
drvUnLoad(m_name);
delete m_name;
}
//——————————————————————————
//создаем и посылаем драйверу IRP-запрос
int TestSmth(void)//0x800 + 101
{
int test = 0;
DWORD ReturetLength = 0;
DeviceIoControl(hDevice, IOCTL_TEST_SMTH, NULL, 0,
&test, 4, &ReturetLength, NULL);
printf(«TestSmth= %in»,test);
return test;
}
///**************Функции динамической загрузки************************
bool drvLoad(char* name)
{
printf (name);
hSCManager=NULL;
hService=NULL;
bool status;
status=FALSE;
if(OpenManager())
{
if(drvCreateService(name))
{
if(drvStartService(name))
{
status=TRUE;
printf(«n Driver is now load…n»);
}
}
}
hDevice = CreateFile («//./myDrv», GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
return status;
}
//———————————————————————
bool OpenManager()
{
bool status;
status=FALSE;
if(hSCManager!=NULL)
{
CloseServiceHandle (hSCManager);
hSCManager=NULL;
}
hSCManager=OpenSCManager (NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (hSCManager == NULL)
{
error(_OpenSCManager);
} else status=TRUE;
return status;
}
//———————————————————————
bool drvCreateService(PCHAR pDrvName)
{
LPTSTR lpBuffer;
lpBuffer = new char[256];
bool status = FALSE;
LPTSTR awPath; // путь к драйверу с именем pDrvName
// формируем путь к pDrvName, драйвер должен лежать рядом с exe-шником
GetCurrentDirectory(256, lpBuffer);
strcat(lpBuffer,»»);
strcat(lpBuffer,pDrvName);
awPath = lpBuffer;
hService = CreateService(hSCManager,pDrvName,pDrvName,SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,awPath,NULL,NULL,NULL,NULL,NULL);
if(!hService)
{
error(_CreateService);
status = drvOpenService(pDrvName);//Пытаемся открыть службу
}
else status=TRUE;
delete lpBuffer;
return status;
}
//———————————————————————
bool drvOpenService(PCHAR name)
{
bool status;
status=FALSE;
if(hService!=NULL) CloseService();
hService=OpenService(hSCManager,name,SERVICE_ALL_ACCESS);
if (!hService) error(_OpenService);
else status=TRUE;
return status;
}
//———————————————————————
bool drvStartService(PCHAR name)
{
bool status;
status=FALSE;
if(!StartService(hService,0,NULL))
{
error(_StartService);
printf(«Deleting service…»);
drvDeleteService(name)
}
else status=TRUE;
return status;
}
//———————————————————————
bool drvDeleteService(PCHAR name)
{
bool status;
status=FALSE;
CloseService();
if(!DeleteService(hService)) error(_DeleteService);
else status=TRUE;
return status;
}
//——————————————————————-
void CloseService()
{
CloseServiceHandle (hService);
hService=NULL;
}
//——————————————————————-
int drvUnLoad(PCHAR name)
{
int status;
status=FALSE;
if (hDevice!=INVALID_HANDLE_VALUE)
{
if(!CloseHandle(hDevice)) error(_CloseHandle);
hDevice=INVALID_HANDLE_VALUE;
}
if (hService)
{
status = ControlService(hService,SERVICE_CONTROL_STOP,&ServiceStatus);
if(!status) error(_SERVICE_CONTROL_STOP);
status = DeleteService(hService);
if(!status) error(_DeleteService);
status = CloseServiceHandle(hService);
if(!status) error(_CloseServiceHandle);
}
if(!CloseServiceHandle(hSCManager)) error(_CloseServiceHandle);
if (status) printf(«Driver Unload… SUCCESSn»);
return status;
}
//———————————————————————
void error(error_index erIndex)
{
DWORD err;
err=GetLastError();
switch(erIndex)
{
case _OpenSCManager:
printf(«OpenSCManager failed with Error=%in»,err);
break;
case _GetFullPathName:
printf(«GetFullPathName failed with Error=%in»,err);
break;
case _CreateService:
switch (err)
{
case 1073:
printf(«The specified service already exists.n»);
printf(«opening this service…»);
break;
default:
printf(«CreateService failed with Error=%in»,err);
}
break;
case _OpenService:
printf(«OpenService failed with Error=%in»,err);
break;
case _StartService:
printf(«StartService failed with Error=%in»,err);
break;
case _DeleteService:
printf(«DeleteService failed with Error=%in»,err);
break;
case _SERVICE_CONTROL_STOP:
printf(«SERVICE_CONTROL_STOP failed with Error=%in»,err);
break;
case _CreateFile:
printf(«CreateFile failed with Error=%in»,err);
break;
case _CloseHandle:
printf(«CloseHandle failed with Error=%in»,err);
break;
case _CloseServiceHandle:
printf(«CloseServiceHandle failed with Error=%in»,err);
break;
}
}
И содержимое h-файла этого приложения:
#define FIRST_IOCTL_INDEX 0x800
#define FILE_DEVICE_myDrv 0x00008000
#define TEST_SMTH CTL_CODE(FILE_DEVICE_myDrv,
0x800 + 101,
METHOD_BUFFERED,
FILE_ANY_ACCESS)
Это приложение загружает драйвер, файл которого лежит в одной папке, что и exe-файл данного приложения.
Посмотрим на исходный текст:
В main() мы создаем переменную с именем драйвера (myDrv.sys) и передаем это имя в функцию динамической загрузки драйвера drvLoad(), которая выполняет все необходимые действия по работе с менеджером служб, и в конце вызывает CreateFile(), которая возвращает дескриптор, нужный для работы с драйвером как файловым объектом. Этот дескриптор, в частности, используется при вызове функции DeviceIoControl.
Если драйвер загружен успешно, то вызываем функцию TestSmth(), внутри которой мы создаем и посылаем драйверу IRP-пакет (с помощью вызова DeviceIoControl()). Приняв этот пакет, наш драйвер возвращает адрес своей процедуры DriverEntry. После этого выгружаем драйвер. Все.
Итак, мы написали простейший (дальше некуда) драйвер и приложение, работающее с ним. В этой статье я активно цитировал материалы из книги П. И. Рудаков, К. Г. Финогенов, по возможности делая ссылки на нее в виде: [2].
Через некоторое время напишу о том, как на базе этого драйвера написать драйвер-фильтр для LPT-порта.
Артем.
Обновлено: 03.03.2023
Многие считают что самому создать драйвер для Windows это что-то на грани фантастики. Но на самом деле это не так. Конечно, разработка драйвера для какого-то навороченного девайса бывает не простой задачей. Но ведь тоже самое можно сказать про создание сложных программ или игр. В разработке простого драйвера нет ничего сложного и я попытаюсь на примерах это показать.
Сперва нам нужно определится в чем мы же будем создавать наш первый драйвер. Поскольку материал ориентирован на новичков, то язык программирования был выбран один из простых, и это не Си или ассемблер, а бейсик. Будем использовать один из диалектов бейсика — PureBasic. Из коробки он не обучен создавать драйверы, но у него удачный набор файлов, используемых для компиляции и небольшое шаманство позволяет добавить эту возможность. Процесс компиляции состоит из нескольких этапов. Если кратко, то он происходит следующим образом: Сначала транслятор «перегоняет» basic-код в ассемблер, который отдается FASM’у (компилятор ассемблера), который создает объектный файл. Далее в дело вступает линкер polink, создающий исполняемый файл. Как компилятор ассемблера, так и линкер могут создавать драйверы и если немного изменить опции компиляции, то получим не исполняемый файл, типа EXE или DLL, а драйвер режима ядра (SYS).
Окно IDE с загруженным кодом драйвера показано на скрине.
Компиляция драйвера выполняется через меню «Компилятор» (это если кто не понял).
Теперь определимся что будет делать наш первый драйвер. Обычно при изучении программирования начинают с простых вещей, скажем, выполнения математических операций и вывода результата. Вот пусть наш драйвер делает тоже самое, ведь банальная математика производимая в режиме ядра это очень круто!
Может показаться что это куча бессмысленного кода, но это не так.
У каждого драйвера должна быть точка входа, обычно у нее имя DriverEntry() и выполнена она в виде процедуры или функции. Как видите, в этом драйвере есть такая процедура. Если посмотрите на начало кода, то в первых строках увидите как ей передается управление. В этой процедуре происходит инициализация драйвера. Там же назначается процедура завершения работы драйвера, которая в нашем случае имеет имя UnloadDriver(). Процедуры CreateDispatch() и CloseDispatch() назначаются обработчиками соединения и отсоединения проги из юзермода.
Процедура DeviceIoControl() будет обрабатывать запросы WinAPI функции DeviceIoControl(), являющейся в данном драйвере связью с юзермодом. В конце кода расположена так называемая ДатаСекция (DataSection), в которой находятся имена драйвера, сохраненные в формате юникода (для этого использована одна из фишек ассемблера FASM).
Видите сколько понадобилось кода для выполнения простейшей математической операции — сложения двух чисел?
А теперь рассмотрим программу, работающую с этим драйвером. Она написана на том же PureBasic.
Процедура Plus() осуществляет связь с драйвером. Ей передаются хэндл, доступа к драйверу и слагаемые числа, которые помещаются в структуру и указатель на указатель которой, передается драйверу. Результат сложения чисел будет в переменной «Result».
Далее следует код простейшего GUI калькулятора, скопированного из википедии.
Когда закроют окно, то перед завершением работы программы, закрывается связь с драйвером и производится его деинсталляция из системы.
Результат сложения чисел 8 и 2 на скриншоте.
Исходные коды драйвера и программы, можно найти в папке «Examples», PureBasic на файлопомойке, ссылку на который давал в начале статьи. Там так же найдете примеры драйвера прямого доступа к порам компа и пример работы с памятью ядра.
PS.
Помните, работа в ядре чревата мелкими неожиданностями аля, BSOD (синий экран смерти), поэтому экспериментируйте осторожно и обязательно всё сохраняйте перед запуском драйвера.
Компания Canon в числе прочего производит периферийные компьютерные устройства для обработки изображений — копиры, принтеры, сканеры, совмещенные устройства. Эта продукция очень широко используется с домашними компьютерами и офисными рабочими станциями. Как и большинство периферийного оборудования, такие устройства, включая принтеры, требуют для работы инсталляции драйверов.
- Как ставить драйвера для принтеров Canon
- Как установить драйвер на принтер
- Как установить драйвер на принтер Canon lbp 2900
Начните с самого простого варианта установки драйверов любых периферийных устройств — включите питание подсоединенного к сети и компьютеру принтера. В современные операционные системы интегрируются их собственные базы драйверов, которые включают тысячи наименований различных версий и производителей. При обнаружении каждого вновь подключаемого устройства ОС пытается опознать его и подобрать соответствующий драйвер среди имеющихся в интегрированном наборе. Если это удастся, вы увидите уведомление об успешном опознании и инсталляции принтера — оно появится в правом нижнем углу рабочего стола, в трее.
Если этот вариант не сработает, воспользуйтесь диском с программным обеспечением, который должен быть в коробке принтера. Установите его в устройство чтения оптических дисков и дождитесь появления на экране меню. Если ОС покажет запрос о том, можно ли разрешить программу автозапуска, ответьте утвердительно — появление этого запроса зависит от настроек ОС. В меню выберите пункт инсталляции драйвера, который может быть сформулирован по-разному для разных версий принтера. Затем начнет работу специальная программа — мастер инсталляции. Просто следуйте его указаниям, а вполне вероятно, что их не будет, и мастер все сделает самостоятельно.
При отсутствии оптического диска загрузите нужные инсталляционные файлы из интернета. Используйте для этого русскоязычный сайт Canon — ссылка на его главную страницу приведена ниже. В правой колонке на этой странице есть форма для поиска информации, относящейся к нужной вам модели принтера. Воспользуйтесь формой, загрузите установочный файл и запустите его. После этого начнет работать описанный в предыдущем шаге мастер инсталляции принтера — следуйте его указаниям до окончания процесса установки драйвера.
Драйвер – программное обеспечение для корректной работы устройства, связывающее его с операционной системой. Этот полезный софт поможет вашему принтеру работать согласованно с компьютером, печатая быстро и качественно.
- Как найти драйвера ко всем принтерам Canon
- Где скачать драйвера к принтеру Canon
- Как обновить драйвер принтера
- — принтер Canon;
- — диск с драйверами для принтера;
- — ПК с выходом в интернет.
Устанавливая драйвера для принтера Canon, определите его модель, прочитав название на корпусе аппарата. Узнать марку печатающего устройства можно и из прилагающейся к нему документации.
Помните, что в комплекте с высокотехнологичной техникой требующей активации дополнительного программного обеспечения, всегда прилагается компакт-диск с соответствующими драйверами. Если носитель был вами утерян, приобретите его в компьютерном салоне.
Найти необходимое вам программное обеспечение можно в сборнике драйверов, предварительно проверив его наличии в списке. Если ваши знакомые используют аналогичное печатающее устройств, попросите у них установочный диск.
Посетите официальный веб-сайт Canon, перейдя по ссылке в конце статьи. На титульной странице производителя откройте раздел «Поддержка» и пункт «Каталог драйверов». В появившемся окне внесите данные в подходящую колонку, одна из которых предназначена программному обеспечению для домашнего компьютера, а другая заполняется теми, кто планирует использовать его в коммерческих целях.
Выберите свою страну из выпадающего списка в первом поле, а во втором укажите тип оборудования, нажав на кнопку Printers. Выделите модель вашего печатающего устройства и подтвердите свое действие, кликнув на пункт Go. Дождитесь обработки запроса и, следуя пошаговым указаниям, заполните все поля формы. Активируйте параметр Download, укажите директорию на компьютере и загрузите драйвер для вашего принтера Canon.
Убедитесь, что печатающий аппарат соединен с компьютером и подключен к электрической сети. Запустите сохраненный на жестком диске установочный файл и следуйте пошаговым инструкциям. Установив драйвер, распечатайте пробную страницу и проверьте качество полученного изображения.
Не нашел драйвера принтера Canon LBP-810 для Mac OS X
Новый принтер покупать не хочется, очень полюбил lbp 810.
На виртуалке стоит windows 7 64 битная, но на 64 битную тоже нет дров.
Что можно придумать для Mac OS Х ? или на крайний случай windows 7 64 битной?
Заранее большое спасибо.
- Вопрос задан более трёх лет назад
- 10282 просмотра
1. Письмо в саппорт Canon.
2. Узнайте предыдущие модели и чипсет от Canon LBP-810. Пробуйте использовать от предыдущих моделей или же Generic. (возможно, придется подредактировать конфиги драйверов руками)
3. Используйте print-server.
а разве принтсервер не дает возможность использовать принтер по сети. но при этом требует оригинальные дрова?
Сергей: принтсерверы, как правило имеют собственную прошивку со встроенными драйверами, список совместимости в таком случае указан в расширенной документации.
странно. как минимум. мне принт-сервера попадались транзитные. выполняющие роль сеть — порт. Lex Fradski:
Вариант простой: виртуалка с XP проброс USB туда и печать по сети с основных систем.
Вариант удобный: выкинуть нафиг это старье и купить новый.
Вариант поебаться: подключить к миникомпу на Linux или к принтсерверу и печатать по сети.
На мак вообще много чего нет, это же не юзабельная Win.
Насчет 64х — возможно, на момент выхода Win 7 64x такая модель уже не поддерживалась. В противном случае, в теории, драйвер должен быть (тут могу посоветовать попробовать нативную программу поиска драйверов от производителя, вроде SW Update для самсунга).
Канон очень плохой в плане долговременной поддержки. Фу таким быть. Ксерокс или каицера на голову выше.
Драйверов под x64 для этого принтера нет и заменить их нечем. У HP вроде есть какой-то универсальный драйвер для такого случая, а вот у Canon ничего такого нет. Так что отправляйте принтер на заслуженный отдых. Подарите куда-нибудь, где такие же старые компы используют.
Про печать по сети забудьте. Потому что в этом случае всё равно нужен драйвер для той системы откуда будете печатать.
Не только для него. В дискуссионклабз у яббле полно подобных воплей со всем мира, но яббле хранит молчание.
Нам просто мягко намекают из Купертино, что пора бы и обновить железку. производитель очень кушать хочет.
Читайте также:
- История не показывается в браузере
- Как сделать мод на friday night funkin без фотошопа
- Как забрать дискорд нитро в эпик геймс без карты
- Microsoft open xml converter что это
- Регулярные выражения visual studio