操作後コールバック ルーチン内で I/O 操作を失敗とする
ミニフィルター ドライバーの操作後コールバック ルーチンは、正常な I/O 操作に失敗する場合がありますが、I/O 操作に失敗しただけでは操作の効果は取り消されません。 ミニフィルター ドライバーが、操作を元に戻すために必要な処理を実行する必要があります。
たとえば、ミニフィルター ドライバーの作成後コールバック ルーチンは、次の手順を実行した場合に正常な IRP_MJ_CREATE 操作に失敗することがあります。
FltCancelFileOpen を呼び出して、作成操作によって作成されたまたは開かれたファイルを閉じる。 FltCancelFileOpen によって、ファイルに対する変更が元に戻されることはないことに注意してください。 たとえば、FltCancelFileOpen によって、新規作成されたファイルが削除されたり、切り詰められたファイルが元のサイズに戻されたりすることはありません。
コールバック データ構造体の IoStatus.Status フィールドを操作の最終 NTSTATUS 値に設定する。 この値は、STATUS_ACCESS_DENIED などの有効なエラー NTSTATUS 値である必要があります。
コールバック データ構造体の IoStatus.Information フィールドをゼロに設定する。
FLT_POSTOP_FINISHED_PROCESSING を返す。
コールバック データ構造体の IoStatus.Status フィールドを操作の最終 NTSTATUS 値に設定する場合、ミニフィルター ドライバーでは有効なエラー NTSTATUS 値を指定する必要があります。 ミニフィルター ドライバーでは、STATUS_FLT_DISALLOW_FAST_IO を指定できないことに注意してください。この NTSTATUS 値を使用できるのは、フィルター マネージャーだけです。
FltCancelFileOpen の呼び出し元は、IRQL <= APC_LEVEL で実行されている必要があります。 ただし、ミニフィルター ドライバーは作成後コールバック ルーチンからこのルーチンを安全に呼び出すことができます。これは、IRP_MJ_CREATE 操作の場合、操作後コールバックルーチンは、作成操作を開始したスレッドのコンテキスト内で、IRQL = PASSIVE_LEVEL で呼び出されるためです。