プリンタポート

プリンタポート制御

パラレルポートのアドレスを調べる。
アドレスを調べるには、OSがWINDOWSならシステムのデバイスマネージャのプロパティからでも
値をみることができる。また、BIOS上からでも値を調べることができる。

通常のPC/AT互換機であるなら、パラレルポートのアドレス値は、0x378 

Windows9x系
OSが9xであるなら、Cを使って簡単にパラレルポートを制御することができる。
使う命令は、_inp() _outp() 等
\#include<stdio.h>
\#include<conio.h>
int main(){
  int i;
  scanf("%d",&i);
  _outp(0x378,1);
  _getch();
  return 0;
}

WindowsNT系
9xでは、簡単にパラレルポートを制御することができるが、NT系ではそうはいかない。NT系はそ
のOSの構造上プログラムからIOportを制御することができなくなっている。そのため上記のプログ
ラムをそのままNT系のマシンで走らせようとすると、エラーメッセージが表示され強制終了される。

NT系で、通常のプロセスを経てIOportにアクセスするためには、専用のドライバを導入しそれを用
いてポートを制御することが必要となる。

ここでは、裏技的に上記の_inp、_outpの命令をNT系においても行使できるようになるドライバを書
いておく。「giveio.sys」といい単一プロセスにおいてポートを制御できるようになるドライバである。

ドライバの入手先

インストーラー入手先

GIVEIO.SYSを用いてのプログラムは、
\#include <stdio.h>
\#include <windows.h>
\#include <math.h>
\#include <conio.h>
int main()
{
  HANDLE h;
  h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL,
  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if(h == INVALID_HANDLE_VALUE) {
    printf("Couldn't access giveio device\n");
    return -1;
  }
  CloseHandle(h);
  _outp(0x378, 255);
  return 0;
}

プログラム前半に、GIVEIO.SYSのサービスをスタートするための手続きの後は、従来どおりの命令でポート制御を行うことができる。

 自分のPCを用いる場合は問題ないが、他のPCや不特定多数の人のNT系マシンにおいてポート制御を行おうとすると、当然GIVEIO.SYSが入っていることが前提となってしまう。なるべくドライバの存在を隠しながら自動的にインスト・アンインストを行うための手法としてはフリーソフトのLOADDRV.EXEが挙げられる。ドライバをインストールするためのプログラムで、ソースが公開されているので、それを用いることで、自動化することもできる。


最終更新:2011年12月05日 12:13
添付ファイル