Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Вниз

Прямая работа с портами   Найти похожие ветки 

 
Sergant   (2004-01-12 16:40) [0]

Как можно заставить ХР напрямую обращаться к портам ввода вывода (принтера например)? Очень нужно! Если кто знает скинте на мыло плиз! ur4uip@btsau.kiev.ua


 
N169   (2004-01-12 17:51) [1]

Порт принтера - это не порт ввода-вывода, а логический порт спулера печати, который работает с аппаратным устройством Параллельный порт, которое, в свою очередь, имеет набор портов ввода-вывода.

Так что если нужен принтер, то можно к нему обращаться через функции:
a) OpenPrinter - WritePrinter - ClosePrinter
b) CreateFile на alias-имя логического устройства, созданного спулером печати для обмена в формате raw ("LPT1", например; -  это имя соответствует имени логического порта спулера) - дальше WriteFile - CloseFile

Если же нужно управлять аппаратным устройством Параллельный порт на уровне регистров, то надо использовать сторонний компонент-посредник, который включает драйвер режима ядра для доступа к функциям HAL, через который осуществляется ввод-вывод на уровне отдельных аппаратных портов. Это может быть, напр., giveio, unio, zlportio и т.п. Ссылки для дальнейшего поиска можно посмотреть тут:
http://www.lvr.com/parport.htm


 
tesseract ©   (2004-01-13 09:45) [2]

А не проще как все нормальные люди которым нужна просто запись в порт, а не управление регистрами ieee1284, использовать CreateFile("LPT1",......) ?


 
N169   (2004-01-13 10:14) [3]

Если CreateFile("LPT1",......), то это и будет ieee1284 или более простой (Spp, etc.), но СТАНДАРТНЫЙ ПРОТОКОЛ, т.к. оно будет работать через СТАНДАРТНЫЙ драйвер устройства Параллельный порт. Этот драйвер ориентирован на работу с внешними устройствами, эти протоколы поддерживающими.

Кстати ссылку "LPT1" даёт нам не драйвер, а монитор печати.

А если требуется управление регистрами параллельного порта с целью формирования СВОЕГО ПРОТОКОЛА, то см.:  http://www.lvr.com/parport.htm

Ещё раз: не путайте аппаратный порт устройства Параллельный порт (в пространстве ввода-вывода процессора) с логическим устройством Порт спулера печати.


 
MAXHO ©   (2004-01-13 18:37) [4]

Я сам недавно боролся с этим :)) Нашёл для работы с параллельным портом хорошую компоненту LPTWDMIO. Работает без проблем под любой виндой. Так что если ещё не нашел - могу выслать вместе с документацией. Возможно ты мне поможешь "победить" компорт? :)


 
sos   (2004-01-13 19:26) [5]

Удалено модератором


 
serj   (2004-01-14 09:27) [6]

Удалено модератором


 
NightAngel ©   (2004-01-14 16:08) [7]

В Intel процессорах проверка на доступность порта ввода-вывода при CPL>IOPL (устанавливается в поле IOPL в регистре EFLAGS)строится на проверки битовой маски в TSS, если там 0, в бите соответствующем номеру этого порта - тогда можно работать с портом, если 1, или вобще нет отображения для этого порта, то тогда нельзя и процессор генерит GPF. В NT системах указатель на карту просто указывает за пределы TSS, поэтому и не один поток из юзер мода не может напрямую работать с портами, так как карты как таковой нет. Только у меня есть подозрение, что на платформе NT TSS на каждый процесс одна, там по моему только указатель на стек нулевого кольца при переключении меняют. Так что если ее изменить, есть подозрение, что все потоки в системе смогут использовать порты напрямую. Указатель на TSS текущего потока по определению хранится в GDT, у Win2k она в GDT по смещению 28 (как в WinXP не знаю, нужно смотреть). Также указатель на TSS хранится в структуре Kernel Processor Control Region (KPCR), которая находится по адресу fs:0h при ring==0, указатель на TSS находится в этой структуре по адресу fs:40h. Попробуте создать свой TSS и переписать указатели. И для этого не обязательно менять TSS можно сделать так, как указано в статье Context в IFSDK. Да, там есть еще пара TSS, но насколько я понял они предназначены для аппартного переключения задач при крахе машины, чтобы сделать дамп памяти и т.д. Если он один на всю систему, а по моему это так, там достаточно только указатель на стек ядра менять при переключении потоков, то Вы разрешите всем юзать регистры ввода вывода напрямую. Теперь как это сделать. Можно написАть user mode драйвер, он очень простой, и к нему обратиться, далее драйвер может быть выгружен, а приложение будет работать с портами - тут смысл в том как в IA-32 запрещают доступ к портам из колец большего нулевого - там есть сегмент состояния задачи(TSS) в нем и указано к каким портам можно получить доступ не из нулевых колец. О чем я выше уже объяснял. По умолчанию в NT системах доступ к портам прикрыт, а приведенные ниже ф-ции изменяют маску разрешения в TSS и она такой и останется в независимости от присутствия драйвера. Ну а номера портов глобальны в системе независимо от кольца, в котором работает процессор. Используют ф-ции Ke386QueryIoAccessMap, Ke386SetIoAccessMap, Ke386IoSetAccessProcess, а потом можно уже из юзер мода писАть в порты, так как в TSS карта разрешения портов станет такой, какой
нужно. В сети где-то уже есть реализация подобной идеи.
Читайте также статью в IFSDK \src\filesys\OSR_docs\Context.pdf.


 
sos   (2004-01-14 19:24) [8]

Все оказалось намного проще, по реализации. Нашел в сети уже готовый драйвер giveio.sys. Через него можно напрямую работать с портами. Задача решена, но очень уж интересно как это работает. Попробую поковырять этот драйвер.
Кстати для модератора... serj и sos из одной конторы, и сообщения посылали независимо друг от друга, не обязательно их сразу гасить :-(((


 
tesseract ©   (2004-01-16 09:20) [9]

Лучше smport - там исходники vxd прилагаются. Такие девайсы просто создают вирт. устройство для прямого доступа к портам. В smport реализован PAScalевский PORT[]. Так для доступа к LPT1 можно записать PORT[378]. Можно кстати и по BIOS полазить.



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.049 c
3-1078282640
ИМХО
2004-03-03 05:57
2004.04.04
Чтение dbf файлов посредством ADO


6-1074951629
Looo
2004-01-24 16:40
2004.04.04
Отчёты и Интернет


1-1079105642
Strelka
2004-03-12 18:34
2004.04.04
кодировки


14-1078781219
Soft
2004-03-09 00:26
2004.04.04
Смысл человеческого существования?


4-1074626809
DNS
2004-01-20 22:26
2004.04.04
GetVolumeInformation





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский