データ バッファーにアクセスする方法

ドライバー スタックの主な役割のひとつとして、ユーザー モード アプリケーションとシステムのデバイス間でのデータ転送があります。 オペレーティング システムには、データ バッファーへのアクセス方法として以下の 3 種類が用意されています。

バッファー I/O
オペレーティング システムは、アプリケーションのバッファーと同じサイズの非ページ システム バッファーを作成します。 書き込み操作の場合、I/O マネージャーは、ドライバー スタックを呼び出す前にシステム バッファーにユーザー データをコピーします。 読み取り操作の場合、ドライバー スタックが要求された操作を完了すると、I/O マネージャーがシステム バッファーからアプリケーションのバッファーにデータをコピーします。

詳細については「バッファー付き I/O の使用」を参照してください。

ダイレクト I/O
オペレーティング システムは、メモリの中でアプリケーションのバッファーをロックします。 つづいて、ロック済みのメモリ ページを特定したメモリ記述子リスト (MDL) を作成してドライバー スタックに渡します。 ドライバーは、MDL を使用してロック済みページにアクセスします。

詳細については「ダイレクト I/O の使用」を参照してください。

バッファー I/O もダイレクト I/O も使用しない場合
オペレーティング システムは、アプリケーション バッファーの仮想開始アドレスとサイズをドライバー スタックに渡します。 アプリケーションのスレッド コンテキストで実行しているドライバーからのみ、このバッファーにアクセスできます。

詳細については「バッファー付き I/O とダイレクト I/O のどちらも使用しない」を参照してください。

IRP_MJ_READ 要求と IRP_MJ_WRITE 要求の場合、ドライバーは各 DEVICE_OBJECT 構造体のフラグを使用して I/O メソッドを指定します。 詳細については「デバイス オブジェクトの初期化」を参照してください。

IRP_MJ_DEVICE_CONTROL 要求と IRP_MJ_INTERNAL_DEVICE_CONTROL 要求の場合は、各 IOCTL 値に記述された TransferType 値によって I/O メソッドが決まります。 詳細については「I/O 制御コードの定義」参照してください。

ドライバー スタックにあるすべてのドライバーでは、各要求に同じバッファー アクセス メソッドを使用する必要があります。ただし、最上位レベルのドライバーは例外で、下位ドライバーで使用されるメソッドに関係なく、「どちらでもない」メソッドを使用できます。