Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 3. Работа с LPT под Win 2000, XP: драйвер GiveIO.sys

Дмитрий Иванов, 2005-2006
Статья доработана и обновлена 21 Января 2012

Итак, рассмотрим следующий вариант работы с портами ввода/вывода в ОС Windows NT. Этим "вариантом" будет специальный драйвер GiveIO.sys, который позволяет приложению, запустившему его, свободно работать с любыми портами. Этот драйвер написал Dale Roberts черт знает когда, но актуальности от не потерял до сих пор.


Главным достоинством этого драйвера, является то, что обращения к порту могут быть сделаны и с помощью функций, работающих только в Windows 9x!


В кратце расскажу как он работает: в начале работы нашей программы для общения с портами необходимо обратиться к драйверу GiveIO.sys. При этом он установит такие значения системного битового массива карты разрешения (I/O Permission Map) для нашего приложения, что для него будет разрешен прямой доступ к любым портам. I/O Permission Map - это составная часть системы защиты ввода-вывода Windows NT. Он представляет собой битовый массив, каждый бит которого соответствует порту ввода-вывода. Если бит = 1, то доступ к порту закрыт, если 0, то открыт. Для любого пользовательского приложения все биты установлены в 1, и соответственно мы не можем напрямую вмешаться в работу порта. GiveIO.sys внаглую "влезает" в этом массив и везде устанавливает 0 - т.е. мы получаем возможность обращаться к любому порту из приложения.


Итак, рассмотрим пример использования драйвера GiveIO.sys на практике.


Для начала скачиваем архив с драйвером и файлом установки:

Файлы к статье скачать
Имя: giveio.zip (ZIP архив)
Размер: 2.12 КБ

Теперь нам необходимо зарегистрировать и установить драйвер в системе. Для этого необходимо сделать ряд операций. Во-первых, копируем файл драйвера GIVEIO.sys в папку C:\Windows\system32\drivers\ если, конечно, система у Вас установлена на диск С:\ и вы не меняли пути установки Windows.

Далее запускаем файл install.reg При этом вы увидете примерно следующее сообщение:

Нажимаем Да. При этом вы получите сообщение об успешном внесении информации в реестр. Можно убедиться в этом. В программе редактора реестра regedit.exe в ветви HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\giveio можно увидеть следующее:

Для того что бы сделанные нами изменения вступили в силу в обязательном порядке нужна ПЕРЕЗАГРУЗКА КОМПЬЮТЕРА.


Настало время взяться за программирование. В код нашей программы Port.exe (см. статью 1) внесем некоторые изменения, которые позволят ей обращаться к портам не только в Windows 9x как было раньше, но и в Windows NT. Итоговый код примет вид:

#include "iostream.h"
#include "conio.h"
#include "stdlib.h"
#include "windows.h"

int main()
{
  int Address = 888;
  cout<<"Test LPT port with GiveIO.sys"<<endl;
  HANDLE h=CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL,
                              OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if( h == INVALID_HANDLE_VALUE )
  {
    cout<<"Error! Can't open driver! Press any key to exit... "<<endl;
    getch();
    return(0);
  }
	
  cout<<"Press '1' to activate and '0' to disactivate lightdiod."<<endl;
  cout<<"To exit press 'e'."<<endl;
  cout<<" "<<endl;

  while( 1 )
  {		
    switch( getch() )
    {
      case '0':	cout<<"Disactivate...."<<endl;
		_outp(Address, 0);
		break;	 		
      case '1': cout<<"Activate...."<<endl;
		_outp(Address, 1);
		break;
       case 'e': exit(1);
    }
  }
  getch();
}

Все. Компилируем, запускаем. Щелкаем 1-0: все должно работать. Если выскочило сообщение Error! Can't open driver! Press any key to exit... , значит установка драйвера прошла неудачно, и его надо переустановить заново.

Благодаря giveio.sys успешно отработают и такие ассемблерные письмена:

_asm
{
  mov dx, 378h
  mov al, 1
  out dx, al
}

© Дмитрий Иванов
2005-2006
http://www.kernelchip.ru



© KERNELCHIP 2006 - 2017