デバイスドライバの制御
Windowsではデバイスの制御には一般にデバイスドライバを必要とします。デバイスオブジェクトは、特殊なファイルとして扱います。
デバイスオブジェクトを作成するには
デバイスオブジェクトを作成するには、CreateFile関数を使います。ここでふつうのファイル名の代わりに特殊なファイル名を指定します。それは
\\.\ドライバ名
のように書きます。この関数が正常終了すると、ファイルハンドルとしてドライバのハンドルを返すので、そのハンドルを使ってドライバとのコミュニケーションを行います。ハンドルが必要無くなったらCloseHandle関数でハンドルを解放します。
デバイスドライバとのコミュニケーション
デバイスドライバとアプリケーションとのコミュニケーションは、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が返ります。
例
次の例は、最近の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;