little
|
|
« : 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 - у вас кажется есть эта информация?
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #1 : 15-12-2003 11:04 » |
|
Эта инфа есть в архиве старого форума, качать здесь: http://club.shelek.ru/faq.php
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
little
|
|
« Ответ #2 : 16-12-2003 07:44 » |
|
Смотрел я там, там много про то как правильно делать CreateFile, а примеров для lpt с DeviceIoControl я не обнаружил. Покопаюсь еще. Просто методом тыка слишком долго получается.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #3 : 16-12-2003 09:13 » |
|
little, а ты просто должен найти описание IO кодов и что они делают - я этого нигде не встречал пока.
Но ты работать по передаче данных так не сможешь.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Lex
|
|
« Ответ #4 : 16-12-2003 09:59 » |
|
little, описание IO кодов есть в DDK в файле ntddpar.h
|
|
|
Записан
|
Megabyte be with you!
|
|
|
little
|
|
« Ответ #5 : 16-12-2003 11:30 » |
|
А описание ошибок откуда брать? Из ntstatus.h?
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #6 : 16-12-2003 12:21 » |
|
little, ага.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
little
|
|
« Ответ #7 : 17-12-2003 08:32 » |
|
в DDK при описани функций используется параметр Status I/O Block, у которого есть члены Information и Status. Что это такое (status io block), какого он формата, и где присутствует в DeviceIoControl ?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #8 : 17-12-2003 11:22 » |
|
в DDK при описани функций используется параметр Status I/O Block, у которого есть члены Information и Status. Что это такое (status io block), какого он формата, и где присутствует в DeviceIoControl
В DeviceIoControl эту структуру не передают. Ее передают в ZwDeviceIoControlFile. Эта структура создается инициатором запроса, а после обработки запроса в ней содержится статус завершения запроса в поле Status и информация в поле Information, обычно в случае успешного завершения запроса там находится число байт, записанных в пользовательский буфер.
|
|
|
Записан
|
|
|
|
little
|
|
« Ответ #9 : 17-12-2003 11:42 » |
|
А можно ZwDeviceIoControlFile использовать в юзер-моде?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #10 : 17-12-2003 11:51 » |
|
А можно ZwDeviceIoControlFile использовать в юзер-моде?
Можно. Тут вопрос не так надо ставить. А так- а есть ли эта ф-ция в юзер моде? ZwDeviceIoControlFile есть в двух вариантах- одна экспортируется ядром и доступна только в режиме ядра, другая ntdll.dll и доступна в юзер мод. Причем единственное что делает ZwDeviceIoControlFile из ntdll.dll - это переводит систему в режим ядра и вызывает ZwDeviceIoControlFile(на самом деле NtDeviceIoControlFile) из ядра.
|
|
|
Записан
|
|
|
|
little
|
|
« Ответ #11 : 17-12-2003 13:30 » |
|
А как мне ее (их) подключить? И где посмотреть их описание?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #12 : 17-12-2003 13:38 » |
|
А как мне ее (их) подключить? И где посмотреть их описание?
Скачай с этого сайта книжку G.Nebbet "Windosw NT/2000 Native API". Там ее описание. Подключают путем ее объявления как и любую другую ф-цию в WinAPI и линкованием с ntddl.lib. Можешь по инету поискать заголовочный файл ntdll.h в нем объявления Nt/Zw ф-ций. Щас я его Грому вышлю может он его на сайт выложит. Только DeviceIoControl вызывает эту ф-цию, так что зачем она тебя - я не понимаю.
|
|
|
Записан
|
|
|
|
little
|
|
« Ответ #13 : 17-12-2003 14:02 » |
|
Я так понял, что, наверное, не нужна. Просто у меня была такая проблема - чтобы я не пытался делать через DeviceIoControl - ответ один - ошибка, а GetLastError выдает код ошибки 1. Кстати, я правильно делаю, что вызваю ее? Наконец, стал пробовать IOCTL_PAR_IS_PORT_FREE - так и тут ошибка. А открывал я CreateFile-ом LPT3, на нем у меня принтер висит. Думал получится пообщаться с принтером на его родном языке - фигушки. Но на счет IOCTL_PDR_IS_PORT_FREE можно же было ответить, что порт занят?! Стал пробовать открыть LPT1 (не занятый), ошибку не выдает. Буду смотреть результаты.
|
|
|
Записан
|
|
|
|
little
|
|
« Ответ #14 : 17-12-2003 14:32 » |
|
в догонку - попробовал сделать IOCTL_PAR_SET_INFORMATION на пустой LPT1 в ответ ошибка 0x048f в ntstatus.h такой нет, а по списку GetLastError это ERROR_DEVICE_NOT_CONNECTED. Т.е. получается, что это не ntstatus-овские ошибки? А как добраться до ntstatus-овских?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
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
|
|
« Ответ #16 : 18-12-2003 07:59 » |
|
Перед использованием ф-ции иногда полезно почитать ее описание ну тут с тобой не поспоришь :) просто читая описания кодов управления в DDK видишь одно, а получаешь другое. Это после твоих разъяснений становится понятно что к чему и какая разница с юзер модом
|
|
|
Записан
|
|
|
|
little
|
|
« Ответ #17 : 19-12-2003 12:37 » |
|
продолжаем разговор (с) Карлсон получилось у меня немножко поболтать с принтером, например по IOCTL_PAR_QUERY_DEVICE_ID он мне вернул строку со своим device_id, в которой было написано про систему команд, модель, класс устройства и т.д. Но теперь возник другой вопрос - а как мне заставить его что-то делать? соответствующих IOCTL-кодов для этого нет. Я не имею ввиду конкретно принтер, понятно, что для общения с ним нужно знать его систему команд, НО(!) , предположим, я ее знаю. Как мне отдавать эти команды на принтер? Если для этого используется WriteFile, то мне опять же непонятно, каким образом отделяются в ECP режиме команды от данных? Или команды в ECP бывают лишь двух видов - либо номер устройства, либо RLE-сжатие? Ладно, черт с ним, с принтером, я не с ним общаться собираюсь. Получается что у меня 3 вопроса: 1. Как писать/читать мое lpt-устройство (вопрос про WriteFile, например) ? 2. Режим команд/данных формируется самим ecp-интерфейсом? 3. Как я могу получить информацию от устройства, если оно, например, желает перевести интерфейс в reverse-mode для выгрузки данных?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #18 : 19-12-2003 12:40 » |
|
А у меня к тебе вопрос - ID бывает у всех принтеров? Я например от старого матричного его получить не мог. Или это был глюк.
|
|
|
Записан
|
|
|
|
little
|
|
« Ответ #19 : 19-12-2003 12:53 » |
|
Я так понимаю, что не обязательно. Я думаю это относится только к PNP устройствам. Причем, для этого устройство должно поддерживать nibble-mode, т.е. полубайтовый режим, получение id идет именно по этому протоколу. А старый матричник не обязан был его вообще знать, они в основной массе вообще только так называемый CENTRONIX поддерживали, т.е. одностороннюю связь.
А что можешь сказать по моим вопросам?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #20 : 19-12-2003 13:09 » |
|
А что можешь сказать по моим вопросам?
1) WriteFile использовать можно- смотри драйвер lpt порта. 2,3) А фиг его знает. У нас Artem много параллельным портом занимался, даже к его прерываниям коннектился.
|
|
|
Записан
|
|
|
|
little
|
|
« Ответ #21 : 19-12-2003 13:17 » |
|
А как до него (Артема) добраться? 1) WriteFile использовать можно- смотри драйвер lpt порта. А где и что именно смотреть?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #22 : 19-12-2003 13:22 » |
|
А где и что именно смотреть
В DDK смотри пример /src/kernel/parport . Это код настоящего драйвера, который в винде. Легкого просмотра не обещаю, но зато можно понять что можно, а что нельзя. А как до него (Артема) добраться?
Попробуй личное сообщение ему написать по моему ник у него Artem .
|
|
|
Записан
|
|
|
|
|