delphi.gif (306 バイト) デバイスドライバの制御


Windowsではデバイスの制御には一般にデバイスドライバを必要とします。デバイスオブジェクトは、特殊なファイルとして扱います。

toach.gif (917 バイト) デバイスオブジェクトを作成するには

デバイスオブジェクトを作成するには、CreateFile関数を使います。ここでふつうのファイル名の代わりに特殊なファイル名を指定します。それは

  \\.\ドライバ名

のように書きます。この関数が正常終了すると、ファイルハンドルとしてドライバのハンドルを返すので、そのハンドルを使ってドライバとのコミュニケーションを行います。ハンドルが必要無くなったらCloseHandle関数でハンドルを解放します。

 

toach.gif (917 バイト) デバイスドライバとのコミュニケーション

デバイスドライバとアプリケーションとのコミュニケーションは、DeviceIoControl関数を使います。この関数は次の引数を取ります。

引数 意味
hDevice: LongWord CreateFileによって取得したファイルハンドル
dwIoControlCode: LongWord デバイスドライバへ送る制御コード
lpInBuffer: Pointer デバイスドライバへの入力パラメータに対するポインタ
nInBufferSize: LongWord lpInBufferのサイズ(バイト数)
lpOutBuffer: Pointer デバイスドライバ出力に対するポインタ
nOutBufferSize: LongWord lpOutBufferのサイズ(バイト数)
var BytesReturned: LongWord デバイスドライバから実際に返されたバイト数
var Overlapped: OVERLAPPED 非同期I/Oに使用するレコード

DeviceIoControlはLongBool型の値を関数値として返します。もし、正常終了ならTrueが返され、異常終了ならFalseが返ります。

 

delphi1.gif (322 バイト)
 次の例は、最近のPCの標準バスであるPCIバスをアクセスするための仮想デバイスドライバ('Pcibus.vxd')を制御するものです。(このVxDは自作の仮想デバイスドライバで標準のものではありません。)

    // VxDを開く
    hVxd := CreateFile(
        PChar('\\.\PCIBUS.VXD'),
        GENERIC_READ or GENERIC_WRITE,
        0,
        nil,
        0,
        FILE_FLAG_DELETE_ON_CLOSE,
        NULL);
    if hVxd = INVALID_HANDLE_VALUE then
    begin
         hVxd := NULL;
         raise Exception.Create('CreateFile returned INVALID_HANDLE_VALUE');
         Exit
    end;

    // ドライバのバージョンを得る
    r := DeviceIoControl(
            hVxd,
            GET_VERSION,
            pInBuff,
            BUFSIZE,
            pOutBuff,
            BUFSIZE,
            BytesReturned,
            nil);
    if r = True then
        Result := Word(pOutBuff^)
    else
        Result := $ffff;