Тепер розглянемо, як можна цей драйвер застосувати на практиці. Для початку скачайте архів з драйвером і бібліотекою функцій для роботи з ним.
Там Ви знайдете власне сам драйвер xDRV.sys, динамічну бібліотеку xDRV.dll, статичну бібліотеку xDRV.lib, яка може знадобитися при компіляції додатка зі статичним підключенням dll та заголовки з описами функцій, використовуючи які можна керувати драйвером. Розглянемо ці самі функції:
С ++: bool xDRV_OpenDriver ();
Delphi: function xDRV_OpenDriver (): Boolean;
Драйвер xDRV.sys є динамічно завантажуваних. Для його завантаження і ініціалізації і служить ця функція. Якщо драйвер завантажений успішно вона поверне true, інакше false. Викликатися вона повинна один раз на початку роботи програми. Якщо вона повернула false, спробуйте перезавантажити комп'ютер. Може бути xDRV.sys вже був завантажений в пам'ять і функція xDRV_StopDriver () для його коректної зупинки не використовувалася. Драйвер і бібліотека повинні знаходиться в одній директорії з виконуваною програмою.
С ++: void xDRV_StopDriver ();
Delphi: procedure xDRV_StopDriver ();
Як не здасться дивним ця функція досить важлива. Повинна бути обов'язково викликана в кінці роботи програми. Якщо так не зробити драйвер залишиться в пам'яті і буде перехоплювати переривання. Гірше того, при повторній спробі його завантаження може виникнути помилка.
С ++: void xDRV_Write (unsigned short PortAdr, unsigned char PortValue);
Delphi: procedure xDRV_Write (PortAdr: LongInt; PortValue: Byte);
Ця функція дозволяє записати байт даних (PortValue) в порт (PortAdr). Наприклад, щоб на всіх лініях регістра DATA LPT порту встановити одиницю потрібно викликати її з параметрами: xDRV_Write (0x378, 255)
С ++: unsigned char xDRV_Read (unsigned short PortAdr);
Delphi: function xDRV_Read (PortAdr: LongInt): Byte;
Призначення цієї функції я думаю, в полне зрозуміло. Вона прочитає і поверне значення в порту (PortAdr).
void імя_функциі (void * імя_перемнной);
Щоб остаточно роз'яснити принципи роботи з xDRV.sys пропоную Вашій увазі три готових проекту тестових додатків з вихідним кодом, що використовують всі функції цього драйвера. Два з них написані на мові програмування С \ C ++ в середовищі Microsoft Visual C ++ 6.0. Перше в WinAPI варіанті, друге - MFC. І нарешті, доданий тестовий проект на мові Delphi (середовище розробки: Borland Delphi 7). Бажано, додатки не запускати до тих пір, доки Ви не ознайомитеся з цією статтею до кінця.
Апаратна частина (залізо)
Тепер займемося "залізом". Тут є деякі спецефические особливості, без урахування яких регестріровать переривання НЕ удасться.Зайдете Пуск -> Налаштування -> Панель управління -> Система -> Устаткування -> Диспетчер пристроїв -> Порти (COM і LPT) -> Порт принтера (LPT1) -> властивості. На вкладці "Параметри порту" обов'язково повинна бути встановлен кнопка "Використовувати будь-яке переривання, призначений порту".
Далі, беремо роз'єм випробуваного LPT порту і обов'язково! встановлюємо 15-тий контакт (біт 3 регістра STATUS - ERROR) в нуль, злився його напрмер, з будь-яким з земляних висновків порту (18-25). Причина такого ходу буде пояснена нижче.
Тепер обіцяне пояснення з приводу лінії ERROR. Якби ми цю лінію на нуль не посадили б, то програма змогла б обробити тільки одне переривання. Повторні спроби посмикати лінію ACK ні до чого не приведуть. При цьому в регістрі DATA і CONTROL розпочнуться хаотичні помігіванія, які триватимуть приблизно хвилину. Причиною цього всього евляется рідний драйвер порту, що входить до складу ОС. Він також як і xDRV.sys отримує сигнал про переривання і не звертаючи никако-го уваги нахабно душить свого побратима - xDRV.sys (в області обробки переривань). Помігіванія в порту - це драйвер ОС намагається достукатися до "принтера", який як він вважає підключений до порту і послав сигнал про переривання. Оскільки там ніякого принтера немає, то все марно і приблизно через хвилину рідний драйвер приймає рішення що принтер "здох" і більше на його ніякої уваги не звертає. Так що тепер якщо закрити програму (обов'язково застосувавши функцію xDRV_StopDriver ()) і запустити знову, то ніяких проблем не буде можна перехоплювати всі переривання - Microsoft # 96овскій драйвер заважати не буде.
А ось для того щоб не чекати хвилину і не перезавантажувати додатки, треба відразу встановити лінію ERROR в нуль - це буде означати що наш "псевдо принтер" несправний і звертати увагу на його переривання не треба. Рідний драйвер так і надходить (на відміну від xDRV.sys) і більше в роботу xDRV.sys не лізе.
Звичайно ми втрачаємо одну з ліній для нашого управління і передачі даних, але я думаю така втрата компенсується можливістю обробки переривань.