Проект LPTVAMPIR

 LPTVAMPIR - это очередной компонент для работы с портами LPT. В отличие от многочисленных DlPortIo, giveio, UnIo, LPTwdmIO и многих-многих-многих других, он позволяет решить две важные задачи управления портом LPT, а именно: даёт возможность МОНОПОЛЬНОЙ БЛОКИРОВКИ порта, чтобы система не имела доступа к нему, пока мы им управляем, а также позволяет использовать ПРЕРЫВАНИЕ параллельного порта. Вампирчик работает только на платформах Windows 2000 и Windows XP

Проект LPTVAMPIR

1. Что такое LPTVAMPIR и какие задачи он решает

2. Как оно работает

3. Драйвер

4. Тестовая программа

5. Использование класса CLptVamp

6. Состояние проекта на текущий момент

7. Freeware

1. Что такое LPTVAMPIR и какие задачи он решает

LPTVAMPIR - это очередной компонент для работы с портами LPT. В отличие от многочисленных DlPortIo, giveio, UnIo, LPTwdmIO и многих-многих-многих других, он позволяет решить две важные задачи управления портом LPT, а именно: даёт возможность МОНОПОЛЬНОЙ БЛОКИРОВКИ порта, чтобы система не имела доступа к нему, пока мы им управляем, а также позволяет использовать ПРЕРЫВАНИЕ параллельного порта. Вампирчик работает только на платформах Windows 2000 и Windows XP.

2. Как оно работает

Основная функциональность сосредоточена в драйвере LPTVAMPIR.sys. Этот драйвер работает непосредственно с kernel mode менеджером конфигурации и драйвером параллельного порта parport.sys (кстати, отсюда столь странное название). Клиентская часть выполнена в виде 'модуля' на языке C++. Вы просто вставляете его в свою программу и используете.

3. Драйвер

В подкаталоге SYS прилагаемого архива находится драйвер LPTVAMPIR.sys и информационный файл LPTVAMPIR.inf Драйвер устанавливается вручную через Панель управления. 

4. Тестовая программа

Исходники тестовой программы расположены в подкаталоге BCB5\TEST Перед использованием её необходимо откомпилировать. Для этого используйте Borland C++ Builder. Главное окно выглядит следующим образом:  

 Состояние подключения к драйверу LPTVAMPIR.sys отображается зелёным цветом в панели CONNECTED. Имя порта выбирается в списке Порт в верхней части окна. В центральной части расположена область сообщений. Внизу находятся группы для управления портом.

Группа Блокировка порта позволяет блокировать или деблокировать выбранный порт. Если у вас к порту подключён принтер, попробуйте блокировать порт, а потом  что-нибудь напечатать. Вы убедитесь в том, что система не сможет использовать заблокированный порт. Впечатляет, правда?

Группа Слежение отображает состояние трёх основных регистров порта. Галочка Включить включает или отключает режим слежения.

Группа Вывод предназначена для вывода данных в регистры параллельного порта. Сначала надо указать смещение регистра относительно базы, затем - значение для вывода, после чего нажать кнопку Вывод!

Группа LPT для RAW позволяет тестировать операцию открытия порта в raw-режиме. Эта операция аналогична вызову CreateFile("LPTx",....).

Наконец, группа Прерывание предназначена для включения/отключения режима отслеживания прерываний. Чтобы протестировать прерывания, вам необходимо будет разрешить их вручную, добавив в подразделы реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI\PNP040?\*\ Device Parameters параметр EnableConnectInterruptIoctl типа DWORD со значением 1, после чего компьютер нужно перезагрузить. В следующих версиях продукта эта операция будет автоматизирована.

Далее запускаем тестовую программу, блокируем порт, выводим в регистр управления значение 0xDC и разрешаем прерывания установкой флажка в группе Прерывание. Если всё прошло благополучно, то при нажатии кнопки SB1 программа будет получать  уведомление и панель INTERRUPT! в группе Прерывание будет мигать жёлтым цветом. И напоследок - программу следует запускать от имени пользователя, обладающего

административными полномочиями.

5. Использование класса CLptVamp

 Всё необходимое для использования "вампира" находится в модуле VampLpt.cpp. Заголовки - в файле VampLpt.h Вы просто можете добавить модуль в проект Borland C++ Builder. Чтобы использовать функции LPTVAMPIR, необходимо создать объект класса CVampLpt:

CVampLpt *vamp = new CVampLpt();

Дальше можно проверить готовность объекта, выполнив вызов

BOOL ready = vamp->Ready();

Если ф-я Ready() возвратит FALSE, объект не готов и мы не сможем через него работать. Причину можно узнать, вызвав GetLastError().

После того, как объект создан, мы можем читать конфигурационную информацию портов с помощью ф-и GetPortMode(). Например, вот так:

PORT_DATA pd;

vamp->GetPortMode(PortIndex,&pd);

Функция GetPortMode() возвратит информацию о порте с индексом PortIndex в структуре типа PORT_DATA.

Подробно члены данной структуры расписаны в VampLpt.h

Порт можно блокировать вызовом функции LockPort() и деблокировать вызовом UnlockPort().  

Доступ к регистрам порта реализован с помощью функций ReadWrite(), ReadRegister() и WriteRegister().

Первые две функции не нуждаются в комментариях. Функция WriteRegister() "заточена" для формирования сложных протоколов обмена. С её помощью можно одним вызовом читать данные в регистры порта, записывать и вызывать паузы. Поясню кратко, как это можно сделать. Допустим, нам надо записать в регистр управления (смещениe 2) значение 0xA2, затем  подождать 10 мкс, прочитать регистр данных (смещение 0) и записать в регистр управления значение 0x5F. Делаем так:

// Формируем командный пакет

ADS ads[4] = {

{ 0x02,0xA2 }, // вывод значения 0xA2 в регистр со смещением 2 - регистр управления

{ ADS_PAUSE, 10 }, // Пауза 10 мкс

{ ADS_READ | 0x0, 0xFF }, // будем читать регистр 0x0

{ 0x02, 0x5F }, // вывод значения 0xA2 в регистр со смещением 2 - регистр управления

};

// Передаём пакет на обработку

vamp->ReadWrite(PortIndex,&ads[0],&ads[0],4);

После этого кода в структуре ads[2] окажется значение, прочитанное из регистра данных. Функция OpenParPort() выполняет деблокирование указанного порта и открывает его для операций записи/чтения, вызывая CreateFile("LPTx",.....) Чтобы использовать прерывания, необходимо сначала проверить,

есть ли у нас связь с драйвером по каналу прерываний, выполнив вызов InterruptChReady(). Если связь есть, можно разрешить их функцией EnableInterrupt() :

vamp->EnableInterrupt(PortIndex,TRUE)

При успешном завершении операции эта ф-я возвратит TRUE. Затем надо создать поток опроса, который будет в цикле вызывать ф-ю WaitForInterrupt().

DWORD WINAPI PollThreadProc(PVOID Context)

{

while (TRUE)

{

if (vamp->WaitForInterrupt(PortIndex,200))

{ // Произошло прерывание!

// <...>

};

return 0;

};

Следует отметить, что для одиночных прерываний скорость транспортировки весьма велика - время, прошедшее с момента выставления уровня на линии запроса прерывания до выхода из ф-и aitForInterrupt(), составляет в среднем примерно 150-300 мкс. Это значит, что импульсы прерывания можно давать с частотой не более 2 кГц. Помните об этой особенности при проектировании своих устройств. После завершения работы с объектом CVampLpt его нужно разрушить вызовом delete vamp;

6. Состояние проекта на текущий момент

Сейчас (2003 год) доступна альфа-версия продукта, т.е. он ещё находится в стадии разработки и не закончен.  Полностью работают функции чтения информации о порте, вывода в регистры (кроме расширений ECP). Стабильно работает блокировка. С прерываниями ситуация сложнее. Они отрабатываются в тестовом режиме. Но стабильность пока оставляет желать лучшего. Однако, со временем эта проблема разрешиться.  Пока нет функций управления режимом чипа.

7. Freeware

Проект LPTVAMPIR является свободным. Это значит, что вы можете использовать материалы проекта  по своему усмотрению. Однако, автор снимает с себя ответственность за возможные негативные результаты использования LPTVAMPIR (если они будут). Исходники доступны только для клиентской части.

Twitter
Нравится

Дополнительная информация



ZZZZZZZZZ