サイエンスパーク株式会社

サイト内検索
お問い合わせ
デバドラ講座

レポート04 ドライバとアプリケーションの通信

デバイスドライバをはじめ、デバイスにかかわるお困りごとの際はお気軽にお問い合わせください。

【 デバドラ講座4 : ドライバとアプリケーションの関係 】

1.アプリケーション

アプリケーションとは、「アプリケーションソフトウェア」の略で、PCの利用者が実行したい機能を持つソフトウェアのことです。これと対になるのは「システムソフトウェア」というもので、PCの稼働自体に必要となるソフトウェアです。ドライバもシステムソフトウェアの一つです。

ドライバのようなシステムソフトウェアは、アプリケーションや周辺機器を動かすための情報を取ってきて、それを適切なアプリケーションに渡すという働きがあります。つまり、ドライバのようなシステムソフトウェアがなくてはアプリケーションは動かないのです。

2.インターフェース

上記で述べたように、ドライバとアプリケーションは互いに通信します。その時に必要となってくるのが「インターフェース」です。インターフェースは2つのものが情報をやりとりする際の手順や規約を定めたものです。「ハードウェアインターフェース」「ソフトウェアインターフェース」「ユーザインターフェース」の3つに分類することができ、ドライバとアプリケーション間のやりとりに使われるのは、通常”API”と呼ばれるソフトウェアインターフェースです。

3.API (Application Programming Interface)

APIはOSやミドルウェア向けのソフトウェアを開発する際に使用可能な命令、関数の集合体です。APIはユーザーモードのアプリケーションから呼ばれ、アプリケーションはその指示をドライバに渡します。アプリケーションからデバイスを操作する際、ドライバに命令を渡すAPIは欠かすことができません。このAPI関数を理解し、正しく使用することはとても重要です。まず、API関数の引数が出力か入力かをきちんと理解する必要があります。また、APIが正常に実行されたかを確認するために、アプリケーションではAPIの戻り値をチェックする必要があります。アプリケーションがドライバに命令を送る際に使用する、主要5つのAPIの概要を下に記します。詳細については同時に掲載しているリンク先を参考にしてください。

3-1.CreateFile:ファイルを作る

HANDLE CreateFile (
LPCTSTR lpFileName, //ファイル名のポインタ
DWORD dwDesiredAccess, //アクセスモード
DWORD dwShareMode, //共有モード
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //セキュリティ属性のポインタ
DWORD dwCreationDisposition, //生成方法
DWORD dwFlagsAndAttributes, //ファイル属性
HANDLE hTemplateFile //テンプレートファイルのハンドル
);

このAPIは新たなオブジェクトを作成します。ファイルが既に存在する場合はdwCreationDipositionの値によって処理が異なります。デバイスのハンドルを開く際には常に”OPEN_EXISTING”を指定することで、既存のデバイスのハンドルを開くことができます。関数が成功すると、指定されたオブジェクトに対するハンドルが戻り値となって返ってきます。

http://msdn.microsoft.com/ja-jp/library/cc429198.aspx

3-2.CloseHandle:ファイルを閉じる

BOOL CloseHandle (
HANDLE hObject //閉じるオブジェクトのハンドル
);

開いているファイルハンドルを閉じます。戻り値は成功するとTRUE、失敗するとFALSEが返ります。

http://msdn.microsoft.com/ja-jp/library/cc429605.aspx

3-3.ReadFile:ファイルの情報を読み取る

BOOL ReadFile (
HANDE  hFile, //読み取るファイルのハンドル
LPVOID  lpBuffer, //データバッファのポインタ
DWORD  nNumberOfBytesToRead, //読み取り対象のバイト数
LPDWORD  lpNumberOfBytesRead, //読み取ったバイト数の変数のアドレス
LPOVERLAPPED lpOverlapped //オーバーラップ構造体のポインタ
);

ファイルからデータを読み取ります。データを読み込むにはCreateFile関数のdwDesiredAccessがGENERIC_READでなければなりません。LpNumberOfBytesReadには実際に読み取られたデータのバイト数が格納されます。関数が成功するとTRUE、失敗するとFALSEが戻り値として返ります。

http://msdn.microsoft.com/ja-jp/library/cc429679.aspx

3-4.WriteFile:ファイルに情報を書く

BOOL WriteFile (
HANDLE hFile, //書き込むファイルのハンドル
LPCVOID lpBuffer, //データバッファのポインタ
DWORD nNumberOfBytesToWrite, //書き込むバイト数
LPDWORD lpNumberOfBytesWritten, //書き込んだバイト数の変数のアドレス
LPOVVERLAPPED lpOverlapped //オーバーラップ構造体のポインタ
);

ファイルにデータを書き込みます。データを書き込むにはCreateFile関数のdwDesiredAccessがGENERIC_WRITEでなければなりません。戻り値は関数が成功したときにはTURE、失敗したときにはFALSEが返ります。

http://msdn.microsoft.com/ja-jp/library/cc429856.aspx

3-5.DeviceIoControl:制御操作をファイルに送信する

BOOL DeviceIoControl (
HANDLE hDevice, //対象デバイスのハンドル
DWORD dIoControlCode, //実行する操作の制御コード(readやwriteを指示する)
LPVOID lpInBuffer, //入力データを供給するバッファのポインタ
DWORD dInBufferSize, //入力バッファのバイト単位のサイズ
LPVOID OutBuffer, //出力データを供給するバッファのポインタ
DWORD OutBufferSize, //出力バッファのバイト単位のサイズ
LPDWORD BytesRetruned, //バイト数を受け取る変数へのポインタ
LPOVERLAPPED lpOverlapped //オーバーラップ構造体のポインタ
);

DeviceIoControlはデバイスに制御を送り、対応するデバイスに対応する動作を実行させます。DeviceIoControlはデバイスからのデータの読み込み、またデータの書き込みの両方を実行することができます。実際、ReadFileとWriteFileに比べ、DeviceIoControlは使用される頻度が高いです。DeviceIoControlの戻り値は関数が成功した際にはTURE、失敗した際はFALSEが返ります。

http://msdn.microsoft.com/ja-jp/library/cc429164.aspx

参考資料

「WDMデバイスドライバプログラミング完全ガイド」上
Edword N. Dekker, Jpseph M. Newcomer著 株式会社クイック訳>
IT用語辞典「インターフェース」
http://e-words.jp/w/E382A4E383B3E382BFE383BCE38395E382A7E383BCE382B9.html