ドライバ開発情報
開発02 ドライバとアプリケーションの通信
デバイスドライバをはじめ、デバイスにかかわるお困りごとの際はお気軽にお問い合わせください。
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 ( |
このAPIは新たなオブジェクトを作成します。ファイルが既に存在する場合はdwCreationDipositionの値によって処理が異なります。デバイスのハンドルを開く際には常に”OPEN_EXISTING”を指定することで、既存のデバイスのハンドルを開くことができます。関数が成功すると、指定されたオブジェクトに対するハンドルが戻り値となって返ってきます。
https://learn.microsoft.com/ja-jp/windows/win32/api/fileapi/nf-fileapi-createfilea
3-2.CloseHandle:ファイルを閉じる
BOOL CloseHandle ( |
開いているファイルハンドルを閉じます。戻り値は成功するとTRUE、失敗するとFALSEが返ります。
https://learn.microsoft.com/ja-jp/windows/win32/api/handleapi/nf-handleapi-closehandle
3-3.ReadFile:ファイルの情報を読み取る
BOOL ReadFile ( |
ファイルからデータを読み取ります。データを読み込むにはCreateFile関数のdwDesiredAccessがGENERIC_READでなければなりません。LpNumberOfBytesReadには実際に読み取られたデータのバイト数が格納されます。関数が成功するとTRUE、失敗するとFALSEが戻り値として返ります。
https://learn.microsoft.com/ja-jp/windows/win32/api/fileapi/nf-fileapi-readfile
3-4.WriteFile:ファイルに情報を書く
BOOL WriteFile ( |
ファイルにデータを書き込みます。データを書き込むにはCreateFile関数のdwDesiredAccessがGENERIC_WRITEでなければなりません。戻り値は関数が成功したときにはTURE、失敗したときにはFALSEが返ります。
https://learn.microsoft.com/ja-jp/windows/win32/api/fileapi/nf-fileapi-writefile
3-5.DeviceIoControl:制御操作をファイルに送信する
BOOL DeviceIoControl ( |
DeviceIoControlはデバイスに制御を送り、対応するデバイスに対応する動作を実行させます。DeviceIoControlはデバイスからのデータの読み込み、またデータの書き込みの両方を実行することができます。実際、ReadFileとWriteFileに比べ、DeviceIoControlは使用される頻度が高いです。DeviceIoControlの戻り値は関数が成功した際にはTURE、失敗した際はFALSEが返ります。
https://learn.microsoft.com/ja-jp/windows/win32/api/ioapiset/nf-ioapiset-deviceiocontrol
参考資料
- 「WDMデバイスドライバプログラミング完全ガイド」上
- Edward N. Dekker, Joseph M. Newcomer著 株式会社クイック訳>
- IT用語辞典「インターフェース」
- https://e-words.jp/w/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9.html