IRP_MJ_CLOSE (FS およびフィルター ドライバー)
送信時
I/O マネージャーは、ファイル オブジェクトの参照カウントがゼロに達したことを示す IRP_MJ_CLOSE リクエストを送信します。これは通常、ファイル システム ドライバーまたは他のカーネル モード コンポーネントがファイルオブジェクト上で ObDereferenceObject を呼び出したことが原因です。 通常、この要求はクリーンアップ要求の後に続きます。 ただし、クローズ要求はクリーンアップ要求の直後に受信されない場合があります。
操作: ファイル システム ドライバー
ターゲット デバイス オブジェクトがファイル システムの制御デバイス オブジェクトである場合、ファイル システム ドライバーは必要な処理を実行した後に IRP を完了する必要があります。
それ以外の場合、ファイル システム ドライバーは閉じる要求を処理する必要があります。
操作: レガシー ファイル システム フィルター ドライバー
ターゲット デバイス オブジェクトがフィルター ドライバーの制御デバイス オブジェクトである場合、フィルター ドライバーは、制御デバイス オブジェクトとの通信を終了するために必要な操作を行ってから、IRP を完了する必要があります。
それ以外の場合、フィルター ドライバーは必要な処理を実行してから、スタック上の次に下位のドライバーに IRP を渡す必要があります。 処理には、フィルターが保持するファイルごとおよびファイルごとのオブジェクト コンテキスト情報の削除などの操作が含まれる場合があります。
ファイル システム フィルター ドライバーの作成者は、IoCreateStreamFileObject によって IRP_MJ_CLEANUP 要求がボリュームのファイル システム ドライバー スタックに送信されることに注意する必要があります。 ファイル システムは IRP_MJ_CREATE 以外の操作の副作用としてストリーム ファイル オブジェクトを作成することが多いため、フィルター ドライバーがストリーム ファイル オブジェクトの作成を確実に検出することは困難です。 したがって、フィルター ドライバーは、以前に表示されていないファイル オブジェクトに対して IRP_MJ_CLEANUP および IRP_MJ_CLOSE 要求を受信することを想定する必要があります。
IoCreateStreamFileObjectとは異なり、IoCreateStreamFileObjectLite は IRP_MJ_CLEANUP リクエストをファイル システム ドライバ スタックに送信しないことにも注意する必要があります。 このため、また、ファイル システムは IRP_MJ_CREATE 以外の操作の副作用としてストリーム ファイル オブジェクトを作成することが多いため、フィルター ドライバーがストリーム ファイル オブジェクトの作成を確実に検出することは困難です。 したがって、フィルター ドライバーは、以前に見たことのないファイル オブジェクトに対する IRP_MJ_CLOSEリクエストを受け取ることを予期する必要があります。
パラメーター
ファイル システムまたはフィルター ドライバーは、指定された IRP を使用して IoGetCurrentIrpStackLocation を呼び出し、IRP 内の独自のスタック ロケーションへのポインターを取得します (図を参照)。次のリストでは IrpSp として示されます。 (IRP は Irp ように表示されます) ドライバーは、クローズ要求を処理する際に、IRP の次のメンバーと IRP スタックの場所に設定されている情報を使用できます。
デバイスオブジェクト
ターゲットデバイスオブジェクトへのポインタ。
Irp->フラグ
このリクエストには次のフラグが設定されます。
- IRP クローズ操作
- IRP_SYNCHRONOUS_API
Irp->Ioステータス
ポインタIO_STATUS_BLOCK 最終的な完了ステータスと要求された操作に関する情報を受け取る構造体。
Irp->ファイルオブジェクト
関連付けられているファイル オブジェクトへのポインタデバイスオブジェクト.
その Irp->ファイルオブジェクト パラメータには、関連ファイルオブジェクト フィールド。これも FILE_OBJECT 構造体です。 その 関連ファイルオブジェクト FILE_OBJECT 構造体のフィールドは、IRP_MJ_CLEANUP の処理中は無効であるため、使用しないでください。
Irp->主要機能
IRP_MJ_CLOSEを指定します。