I/O 操作用のバッファー処理メソッドの確認

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

  • バッファー I/O。I/O マネージャーが、非ページ プールから操作のためにシステム バッファーを割り当てます。 I/O マネージャーは、I/O 操作を開始したスレッドのコンテキストで、このシステム バッファーからアプリケーションのユーザー バッファーに、または逆方向にデータをコピーします。

  • ダイレクト I/O。I/O マネージャーが、ユーザー バッファーのプローブを行ってロックします。 次に、ロックしたバッファーをマップするためにメモリ記述子リスト (MDL) を作成します。 I/O マネージャーは、I/O 操作を開始したスレッドのコンテキストでバッファーにアクセスします。

  • バッファー I/O およびダイレクト I/O 以外。I/O マネージャーは、システム バッファーを割り当てず、ユーザー バッファーのロックやマップも行いません。 代わりに、バッファーの元のユーザー空間仮想アドレスをファイル システム スタックに渡すだけです。 ドライバーが開始スレッドのコンテキストで実行していること、およびバッファー アドレスが有効であることをドライバー自体が確認します。

    ミニフィルター ドライバーは、ユーザー空間内のアドレスを検証してから、使用を試行する必要があります。 I/O マネージャーおよびフィルター マネージャーが、このようなアドレスを検証したり、バッファーに埋め込まれているポインター (ミニフィルター ドライバーに渡される) を検証したりすることはありません。

すべての標準 Microsoft ファイル システムでは、ほとんどの I/O 処理でバッファー I/O もダイレクト I/O も使用されません。

バッファー処理方法の詳細については、「データ バッファーにアクセスする方法」を参照してください。

IRP ベースの I/O 操作の場合、使用されるバッファー処理方法は操作固有であり、次の要因によって決まります。

  • 実行されている I/O 操作の種類

  • ファイル システム ボリュームの DEVICE_OBJECT 構造体の Flags メンバーの値

  • IOCTL または FSCTL が定義されたときに CTL_CODE マクロに渡された TransferType パラメーターの値 (I/O 制御 (IOCTL) およびファイル システム制御 (FSCTL) 操作の場合)

バッファーを保持している高速 I/O 操作は、常にバッファー I/O もダイレクト I/O も使用しません。

ファイル システムのコールバック操作にはバッファーがありません。

このセクションには、次が含まれます。

IRP ベースまたは高速 I/O とすることが可能な操作

デバイス オブジェクト フラグに従う IRP ベースの I/O 操作

バッファー処理された I/O を常に使用する IRP ベースの I/O 操作

バッファー処理された I/O またはダイレクト I/O を常に使用しない IRP ベースの I/O 操作

IRP ベースの IOCTL と FSCTL 操作

バッファーが存在しない IRP ベースの I/O 操作