次の方法で共有


PFLT_INSTANCE_TEARDOWN_CALLBACK コールバック関数 (fltkernel.h)

ミニフィルター ドライバーは、ミニフィルター ドライバーの InstanceTeardownStartCallback と InstanceTeardownCompleteCallback ルーチンとして PFLT_INSTANCE_TEARDOWN_CALLBACK 型の 2 つのルーチン 登録できます。

構文

PFLT_INSTANCE_TEARDOWN_CALLBACK PfltInstanceTeardownCallback;

void PfltInstanceTeardownCallback(
  [in] PCFLT_RELATED_OBJECTS FltObjects,
  [in] FLT_INSTANCE_TEARDOWN_FLAGS Reason
)
{...}

パラメーター

[in] FltObjects

現在の I/O 操作に関連するオブジェクトの不透明なポインターを含む FLT_RELATED_OBJECTS 構造体へのポインター。

[in] Reason

ミニフィルター ドライバー インスタンスが破損している理由を示すフラグ。 次のいずれかの手順を実行します。

意味
FLTFL_INSTANCE_TEARDOWN_MANUAL (0x00000001) ユーザー モード アプリケーションが FilterDetach呼び出したか、カーネル モード コンポーネントが FltDetachVolume呼び出したため、インスタンスがデタッチされています。
FLTFL_INSTANCE_TEARDOWN_FILTER_UNLOAD (0x00000002) ミニフィルター ドライバーがアンロードされています。
FLTFL_INSTANCE_TEARDOWN_MANDATORY_FILTER_UNLOAD (0x00000004) ミニフィルター ドライバーがアンロードされています。
FLTFL_INSTANCE_TEARDOWN_VOLUME_DISMOUNT (0x00000008) 設定した場合、ボリュームはマウント解除されます。 (または、ボリュームは既にマウント解除されています。または、ボリュームのマウント操作に失敗しました。または、ミニフィルター ドライバー インスタンスまたはボリュームが切断されています。または、ファイル システム自体がアクティブなファイル システムとして登録解除されました)。
FLTFL_INSTANCE_TEARDOWN_INTERNAL_ERROR (0x00000010) システムで予期しない内部エラーが発生しました。

戻り値

何一つ

備考

ミニフィルター ドライバーは、DriverEntry ルーチンから FltRegisterFilterを呼び出して自分自身を登録する場合、ミニフィルター ドライバーの InstanceTeardownStartCallback と InstanceTeardownCompleteCallback ルーチンとしてPFLT_INSTANCE_TEARDOWN_CALLBACK型の 2 つのルーチン 登録できます。 これらのコールバック ルーチンを登録するために、ミニフィルター ドライバーは、InstanceTeardownStartCallback にPFLT_INSTANCE_TEARDOWN_CALLBACK型の 2 つのルーチンのアドレスを格納し、ミニフィルター ドライバーが渡す FLT_REGISTRATION 構造体の InstanceTeardownCompleteCallback メンバー FltRegisterFilterRegistration パラメーターとして格納します。

InstanceTeardownStartCallback および InstanceTeardownCompleteCallback ルーチン は省略可能であり、NULL できます。 ミニフィルター ドライバーで、InstanceTeardownStartCallback または InstanceTeardownCompleteCallback ルーチンに対して NULL 指定した場合、インスタンスは引き続き破棄されます。

InstanceTeardownStartCallback ルーチンは、フィルター マネージャーがミニフィルター ドライバー インスタンスの破棄を開始すると呼び出され、ミニフィルター ドライバーがペンドされた I/O 操作を完了し、状態情報を保存できるようになります。

InstanceTeardownStartCallback ルーチンは、次の手順を実行する必要があります。

InstanceTeardownStartCallback ルーチンは、必要に応じて、ミニフィルター ドライバーをできるだけ早くアンロードできるように、次の操作を行うことができます。

  • 開いているファイルをすべて閉じます。
  • ワーカー スレッドが、未処理の作業項目の処理を完了するために必要な最小限の処理のみを実行するようにします。
  • FltCancelIo呼び出して、ミニフィルター ドライバーによって開始されたすべての I/O 操作を取り消します。
  • 新しい作業項目のキューを停止します。

ミニフィルター ドライバーの InstanceTeardownStartCallback ルーチンが呼び出されると、新しい I/O 操作に対してミニフィルター ドライバーの事前操作および事後操作コールバック ルーチンは呼び出されません。 ただし、インスタンスの破棄が開始される前に開始された I/O 操作に対して呼び出される場合があります。

InstanceTeardownCompleteCallback ルーチンは、ミニフィルター ドライバーが開いているファイルを閉じ、その他の必要なクリーンアップ処理を実行できるように、破棄プロセスが完了したときに呼び出されます。

InstanceTeardownCompleteCallback ルーチンは、ミニフィルター ドライバーによって開かれたすべてのファイルを閉じる必要があります。

フィルター マネージャーは、未処理のすべての I/O 操作が完了またはドレインされた後にのみ、ミニフィルター ドライバーの InstanceTeardownCompleteCallback ルーチンを呼び出します。

警告

InstanceTeardownCompleteCallback ルーチンは、次のいずれかの条件に該当する場合は呼び出されません。

  • 未処理のペンド I/O 操作があります。
  • ミニフィルター ドライバーによって開始された未処理の I/O 操作があります。

ミニフィルター ドライバーがアンロードされているためにミニフィルター ドライバー インスタンスが切断されている場合は、InstanceTeardownCompleteCallback ルーチンが戻るまでアンロード操作がハングしているように見えます。 このような問題をデバッグするには、ミニフィルター ドライバーで ドライバー検証ツールの を有効にする必要があります。 フィルター検証ツール I/O 検証 オプションは、未リリースの参照など、ミニフィルター ドライバーのアンロードを妨げる原因を特定するのに役立ちます。 詳細については、「検証ツールのフィルター 」を参照してください。

(FltObjectReference呼び出して) インスタンスを参照しても、InstanceTeardownCompleteCallback ルーチンが呼び出されるのを防ぐことはありません。

フィルター マネージャーは、InstanceTeardownStartCallback を呼び出し、IRQL PASSIVE_LEVELで InstanceTeardownCompleteCallback ルーチンを します。

必要条件

要件 価値
ターゲット プラットフォーム デスクトップ
ヘッダー fltkernel.h (Fltkernel.h を含む)
IRQL 「解説」セクションを参照してください。

関連項目

FLT_REGISTRATION

FLT_RELATED_OBJECTS

FilterDetach

FltCancelIoする

FltCbdqDisable

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltDetachVolumeする

FltObjectReference

FltRegisterFilter

PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK

PFLT_INSTANCE_SETUP_CALLBACK