Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Драйвер lpt-порта  (Прочитано 28814 раз)
0 Пользователей и 11 Гостей смотрят эту тему.
little
Помогающий

de
Offline Offline
Пол: Мужской

« : 12-12-2003 07:46 » 

Подскажите, как из пользовательского приложения общаться с драйвером параллельного порта?
с помощью
HANDLE hDevice = CreateFileW(L"LPT1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
получаю ссылку, вопрос - какие структуры использовать в дальнейшей работе? Нужны примеры использования DeviceIoControl() именно с этим портом.

Lex, RXL - у вас кажется есть эта информация?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 15-12-2003 11:04 » 

Эта инфа есть в архиве старого форума, качать здесь: http://club.shelek.ru/faq.php
Записан

А птичку нашу прошу не обижать!!!
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #2 : 16-12-2003 07:44 » 

Смотрел я там, там много про то как правильно делать CreateFile, а примеров для lpt с DeviceIoControl я не обнаружил. Покопаюсь еще. Просто методом тыка слишком долго получается. Жаль
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 16-12-2003 09:13 » 

little, а ты просто должен найти описание IO кодов и что они делают - я этого нигде не встречал пока.

Но ты работать по передаче данных так не сможешь.
Записан

А птичку нашу прошу не обижать!!!
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #4 : 16-12-2003 09:59 » 

little, описание IO кодов есть в DDK в файле ntddpar.h
Записан

Megabyte be with you!
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #5 : 16-12-2003 11:30 » 

А описание ошибок откуда брать? Из ntstatus.h?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #6 : 16-12-2003 12:21 » 

little, ага. Улыбаюсь
Записан

А птичку нашу прошу не обижать!!!
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #7 : 17-12-2003 08:32 » 

в DDK при описани функций используется параметр Status I/O Block, у которого есть члены Information и Status. Что это такое (status io block),  какого он формата, и где присутствует в DeviceIoControl ?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #8 : 17-12-2003 11:22 » 

Цитата

в DDK при описани функций используется параметр Status I/O Block, у которого есть члены Information и Status. Что это такое (status io block), какого он формата, и где присутствует в DeviceIoControl


В DeviceIoControl эту структуру не передают. Ее передают в ZwDeviceIoControlFile. Эта структура создается инициатором запроса, а после обработки запроса в ней содержится статус завершения запроса в поле Status и информация в поле Information, обычно в случае успешного завершения запроса там находится число байт, записанных в пользовательский буфер.
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #9 : 17-12-2003 11:42 » 

А можно ZwDeviceIoControlFile использовать в юзер-моде?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #10 : 17-12-2003 11:51 » 

Цитата

А можно ZwDeviceIoControlFile использовать в юзер-моде?


Можно.
Тут вопрос не так надо ставить. А так- а есть ли эта ф-ция в юзер моде? ZwDeviceIoControlFile есть в двух вариантах- одна экспортируется ядром и доступна только в режиме ядра, другая ntdll.dll и доступна в юзер мод. Причем единственное что делает ZwDeviceIoControlFile из ntdll.dll - это переводит систему в режим ядра и вызывает ZwDeviceIoControlFile(на самом деле NtDeviceIoControlFile) из ядра.
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #11 : 17-12-2003 13:30 » 

А как мне ее (их) подключить? И где посмотреть их описание?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #12 : 17-12-2003 13:38 » 

Цитата

А как мне ее (их) подключить? И где посмотреть их описание?


Скачай с этого сайта книжку G.Nebbet "Windosw NT/2000 Native API". Там ее описание. Подключают путем ее объявления как и любую другую ф-цию в WinAPI и линкованием с ntddl.lib. Можешь по инету поискать заголовочный файл ntdll.h в нем объявления Nt/Zw ф-ций. Щас я его Грому вышлю может он его на сайт выложит.

Только DeviceIoControl вызывает эту ф-цию, так что зачем она тебя - я не понимаю.
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #13 : 17-12-2003 14:02 » 

Я так понял, что, наверное, не нужна. Просто у меня была такая проблема - чтобы я не пытался делать через DeviceIoControl - ответ один - ошибка, а GetLastError выдает код ошибки 1. Кстати, я правильно делаю, что вызваю ее?

Наконец, стал пробовать IOCTL_PAR_IS_PORT_FREE - так и тут ошибка. А открывал я CreateFile-ом LPT3, на нем у меня принтер висит. Думал получится пообщаться с принтером на его родном языке Улыбаюсь - фигушки. Но на счет IOCTL_PDR_IS_PORT_FREE можно же было ответить, что порт занят?!
Стал пробовать открыть LPT1 (не занятый), ошибку не выдает. Буду смотреть результаты.
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #14 : 17-12-2003 14:32 » 

в догонку - попробовал сделать IOCTL_PAR_SET_INFORMATION  на пустой LPT1 в ответ ошибка 0x048f в ntstatus.h такой нет, а по списку GetLastError это ERROR_DEVICE_NOT_CONNECTED.
Т.е. получается, что это не ntstatus-овские ошибки? А как добраться до ntstatus-овских?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #15 : 18-12-2003 06:04 » 

Цитата

чтобы я не пытался делать через DeviceIoControl - ответ один - ошибка, а GetLastError выдает код ошибки 1. Кстати, я правильно делаю, что вызваю ее?


Перед использованием ф-ции иногда полезно почитать ее описание-
If the function fails, the return value is zero. To get extended error information, call GetLastError.


Цитата

Т.е. получается, что это не ntstatus-овские ошибки? А как добраться до ntstatus-овских?


DeviceIoControl не возвращает кодов ошибок, используемых в ядре- она их преобразует в стандартные Win32 ошибки. Самому это преобразование можно сделать при помощи RtlNtStatusToDosError , а вот как обратное сделать я не знаю. Если хочешь получать NT_STATUS_... ошибки - используй ZwDeviceIoControlFile.
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #16 : 18-12-2003 07:59 » 

Цитата: SlavaI
Перед использованием ф-ции иногда полезно почитать ее описание


ну тут с тобой не поспоришь :) просто читая описания кодов управления в DDK видишь одно, а получаешь другое. Это после твоих разъяснений становится понятно что к чему и какая разница с юзер модом
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #17 : 19-12-2003 12:37 » new

продолжаем разговор Улыбаюсь (с) Карлсон

получилось у меня немножко поболтать с принтером, например по IOCTL_PAR_QUERY_DEVICE_ID он мне вернул строку со своим device_id, в которой было написано про систему команд, модель, класс устройства и т.д. Но теперь возник другой вопрос - а как мне заставить его что-то делать? соответствующих IOCTL-кодов для этого нет. Я не имею ввиду конкретно принтер, понятно, что для общения с ним нужно знать его систему команд, НО(!) , предположим, я ее знаю. Как мне отдавать эти команды на принтер?

Если для этого используется WriteFile, то мне опять же непонятно, каким образом отделяются в ECP режиме команды от данных? Или команды в ECP бывают лишь двух видов - либо номер устройства, либо RLE-сжатие?

Ладно, черт с ним, с принтером, я не с ним общаться собираюсь. Получается что у меня 3 вопроса:
1. Как писать/читать мое lpt-устройство (вопрос про WriteFile, например) ?
2. Режим команд/данных формируется самим ecp-интерфейсом?
3. Как я могу получить информацию от устройства, если оно, например, желает перевести интерфейс в reverse-mode для выгрузки данных?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #18 : 19-12-2003 12:40 » 

А у меня к тебе вопрос - ID бывает у всех принтеров? Я например от старого матричного его получить не мог. Или это был глюк.
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #19 : 19-12-2003 12:53 » 

Я так понимаю, что не обязательно. Я думаю это относится только к PNP устройствам. Причем, для этого устройство должно поддерживать nibble-mode, т.е. полубайтовый режим, получение id идет именно по этому протоколу. А старый матричник не обязан был его вообще знать, они в основной массе вообще только так называемый CENTRONIX поддерживали, т.е. одностороннюю связь.

А что можешь сказать по моим вопросам?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #20 : 19-12-2003 13:09 » 

Цитата

А что можешь сказать по моим вопросам?


1) WriteFile использовать можно- смотри драйвер lpt порта.
2,3) А фиг его знает.

У нас Artem много параллельным портом занимался, даже к его прерываниям коннектился.
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #21 : 19-12-2003 13:17 » 

А как до него (Артема) добраться? Улыбаюсь

Цитата
1) WriteFile использовать можно- смотри драйвер lpt порта.

А где и что именно смотреть?  Я шокирован!
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #22 : 19-12-2003 13:22 » 

Цитата

А где и что именно смотреть


В DDK смотри пример /src/kernel/parport . Это код настоящего драйвера, который в винде. Легкого просмотра не обещаю, но зато можно понять что можно, а что нельзя.

Цитата

А как до него (Артема) добраться?


Попробуй личное сообщение ему написать по моему ник у него Artem  .
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines