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 つのルーチンを登録できます。 これらのコールバック ルーチンを登録するために、ミニフィルター ドライバーは、ミニフィルター ドライバーが FltRegisterFilter の Registration パラメーターとして渡すFLT_REGISTRATION構造体の InstanceTeardownStartCallback メンバーと InstanceTeardownCompleteCallback メンバーに、PFLT_INSTANCE_TEARDOWN_CALLBACK型の 2 つのルーチンのアドレスを格納します。
InstanceTeardownStartCallback ルーチンと InstanceTeardownCompleteCallback ルーチンは省略可能であり、NULL にすることができます。 ミニフィルター ドライバーで InstanceTeardownStartCallback ルーチンまたは InstanceTeardownCompleteCallback ルーチンに NULL が指定されている場合、インスタンスは引き続き破棄されます。
フィルター マネージャーがミニフィルター ドライバー インスタンスの破棄を開始すると、 InstanceTeardownStartCallback ルーチンが呼び出され、ミニフィルター ドライバーがペン付きの I/O 操作を完了し、状態情報を保存できるようになります。
InstanceTeardownStartCallback ルーチンは次の操作を行う必要があります。
- ミニフィルター ドライバーの事前操作コールバック ルーチンにペンディングされた各 I/O 操作に対して FltCompletePendedPreOperation を呼び出して、操作を完了するか、操作の制御をフィルター マネージャーに返します。
- 新しい I/O 操作は実行されません。 ミニフィルター ドライバーがコールバック データ キューを使用する場合は、 FltCbdqDisable を呼び出して無効にする必要があります。
- フィルター マネージャーに操作の制御を返すために、ミニフィルター ドライバーの postoperation コールバック ルーチンにペンドされた各 I/O 操作に対して FltCompletePendedPostOperation を呼び出します。
InstanceTeardownStartCallback ルーチンでは、必要に応じて次の操作を実行して、ミニフィルター ドライバーをできるだけ早くアンロードできます。
- 開いているファイルをすべて閉じます。
- ワーカー スレッドが、未処理の作業項目の処理を完了するために必要な最小限の処理のみを実行するようにします。
- FltCancelIo を呼び出して、ミニフィルター ドライバーによって開始されたすべての I/O 操作を取り消します。
- 新しい作業項目のキューを停止します。
ミニフィルター ドライバーの InstanceTeardownStartCallback ルーチンが呼び出されると、ミニフィルター ドライバーの事前操作と操作後のコールバック ルーチンは、新しい I/O 操作に対して呼び出されません。 ただし、インスタンスの破棄が開始される前に開始された I/O 操作に対して呼び出される場合があります。
InstanceTeardownCompleteCallback ルーチンは、ミニフィルター ドライバーが開いているファイルを閉じ、その他の必要なクリーンアップ処理を実行できるように、ティアダウン プロセスが完了したときに呼び出されます。
InstanceTeardownCompleteCallback ルーチンは、ミニフィルター ドライバーによって開かれたすべてのファイルを閉じる必要があります。
フィルター マネージャーは、未処理のすべての I/O 操作が完了またはドレインされた後にのみ、ミニフィルター ドライバーの InstanceTeardownCompleteCallback ルーチンを呼び出します。
警告
次のいずれかの条件に該当する場合、 InstanceTeardownCompleteCallback ルーチンは呼び出されません。
- 未処理のペンド I/O 操作があります。
- ミニフィルター ドライバーによって開始された未処理の I/O 操作があります。
ミニフィルター ドライバーがアンロードされているためにミニフィルター ドライバー インスタンスが切断されている場合は、 InstanceTeardownCompleteCallback ルーチンが戻るまでアンロード操作がハングしているように見えます。 このような問題をデバッグするには、ミニフィルター ドライバーでドライバー検証ツール を有効にする必要があります。 フィルター検証ツール の I/O 検証 オプションは、未リリースの参照など、ミニフィルター ドライバーのアンロードを妨げる可能性のある原因を特定するのに役立ちます。 詳細については、「 検証ツールのフィルター処理」を参照してください。
( FltObjectReference を呼び出して) インスタンスを参照しても 、InstanceTeardownCompleteCallback ルーチンが呼び出されないことに注意してください。
フィルター マネージャーは、IRQL PASSIVE_LEVELで InstanceTeardownStartCallback ルーチンと InstanceTeardownCompleteCallback ルーチンを呼び出します。
要件
要件 | 値 |
---|---|
対象プラットフォーム | デスクトップ |
Header | fltkernel.h (Fltkernel.h を含む) |
IRQL | 「解説」を参照してください。 |
こちらもご覧ください
FltCompletePendedPostOperation