次の方法で共有


IRP の完了

Note

最適な信頼性とパフォーマンスを実現するには、レガシ ファイル システム フィルター ドライバーではなく、フィルター マネージャーのサポートがあるファイル システム ミニフィルター ドライバーを使用します。 レガシ ドライバーをミニフィルター ドライバーに移植するには、「レガシ フィルター ドライバーの移植ガイドライン」を参照してください。

すべてのディスパッチ ルーチンは、その DeviceObject パラメーターで、IRP のターゲット デバイス オブジェクトへのポインターを受け取ります。 レガシ フィルター ドライバーにコントロール デバイス オブジェクト (CDO) がある場合、ディスパッチ ルーチンでは、IRP に対する処理を実行する前に、DeviceObject がフィルター ドライバーの CDO を指しているかどうかをチェックする必要があります。

ファイル システム フィルター ドライバーは、CDO を特に指定して送信された I/O 操作をサポートする必要はありません。 (一般的にサポートされる操作について詳しくは、「フィルター ドライバーのコントロール デバイス オブジェクト」をご覧ください。) ただし、CDO は、それに送信されたすべての IRP を完了する必要があります。

IRP を完了するには、ディスパッチ ルーチンは次の手順をすべて実行する必要があります。

  1. Irp->IoStatus.Status を適切な NTSTATUS 値に設定します。

  2. IoCompleteRequest を呼び出して、IRP を I/O マネージャーに返します。

  3. ステップ 1 と同じ状態値を呼び出し元に返します。

IRP の完了は、IRP の "成功" または "失敗" と呼ぶことがあります。

  • IRP を成功させるということは、STATUS_SUCCESS のような成功または情報の NTSTATUS 値で完了することを意味します。

  • IRP を失敗させるということは、STATUS_INVALID_DEVICE_REQUEST や STATUS_BUFFER_OVERFLOW のようなエラーまたは警告の NTSTATUS 値で完了することを意味します。

NTSTATUS の値は ntstatus.h で定義されています。 これらの値は、成功、情報、警告、エラーの 4 つのカテゴリに分類されます。 詳しくは、「NTSTATUS 値の使用」をご覧ください。

STATUS_PENDING は成功の NTSTATUS 値ですが、STATUS_PENDINGで IRP を完了するとプログラミング エラーになります。