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 操作
バッファー処理された I/O を常に使用する IRP ベースの I/O 操作