次の方法で共有


ミニフィルターの読み込みとアンロード

この記事では、Windows 環境でファイル システムのミニフィルター ドライバー (ミニフィルター) を動的に読み込んだり、アンロードしたりする方法について説明します。 初期化と登録のプロセス、インスタンス管理、およびドライバーのアンロード操作中に適切なクリーンアップとリソース管理を確実に行うためのティアダウン手順について説明します。

ミニフィルターの読み込み

ミニフィルターの INF ファイルで、SERVICE_BOOT_START、SERVICE_SYSTEM_START、または SERVICE_AUTO_START のドライバーの開始の種類が指定されている場合、既存の読み込み順序グループ定義に従ってミニフィルターは読み込まれます。 この読み込み順序では、レガシ フィルター ドライバーとの相互運用性がサポートされます。

ミニフィルターは、システムの実行中にいつでも読み込むことができます。 これは、次の方法で読み込むことができます。

  • サービス開始要求 (sc startnet start、またはサービス API) を介して。

  • 明示的な読み込み要求(fltmc loadFltLoadFilter、または FilterLoad)により。

フィルター マネージャー (FltMgr) は、ドライバーが読み込まれると、ミニフィルターの DriverEntry ルーチンを呼び出します。 現時点では、ミニフィルターはすべてのインスタンスに適用される初期化を実行できます。 DriverEntry ルーチン内で、ミニフィルターは次の FltMgr ルーチンを呼び出します。

  • FltRegisterFilter: FltMgr にコールバック ルーチンを登録します。
  • FltStartFiltering: FltMgr にボリュームへの接続と I/O 要求のフィルタリングを開始する準備ができたことを通知します。

ミニフィルター ドライバー インスタンスは、ミニフィルターのインストールに使用される INF ファイルに定義されます。 ミニフィルターの INF ファイルでは、既定のインスタンスを定義する必要があります。 また、既定を超えてさらに多くのインスタンスを定義することもできます。 これらのインスタンス定義はすべてのボリュームに適用され、次の情報が含まれます。

  • インスタンス名
  • 高度
  • インスタンスを自動的、手動、またはその両方にアタッチできるかどうかを示すフラグ。

既定のインスタンスが使用されます。

  • FltMgr がミニフィルターのマウントおよびインスタンス セットアップ コールバック ルーチンを正しい順序で呼び出すように、ミニフィルターを並べ替えるために使用されます。
  • 呼び出し元がインスタンス名を指定しない場合の明示的な添付ファイル要求。

FltMgr は、ボリュームがマウントされた後の最初の作成操作で、InstanceSetupCallback ルーチン呼び出すことで、利用可能なボリュームについて自動的にミニフィルター ドライバーに通知します。 この呼び出しは、次のタイミングで発生する可能性があります。

  • FltStartFiltering が返される前 (FltMgr がシステム起動時に既存のボリュームを列挙するとき)。

  • 実行時、ボリュームがマウントされたとき、または明示的な添付ファイル要求の結果として (、fltAttachVolume、または FilterAttach)。

ミニフィルターのアンロード

ミニフィルター インスタンスは、次の場合に切断されます。

  • ミニフィルター ドライバーがアンロードされる。

  • ミニフィルター インスタンスがアタッチされているボリュームがマウント解除される。

  • 明示的なデタッチ要求が行われます (FltDetachVolume、または FilterDetach)。 ミニフィルター ドライバーが InstanceQueryTeardownCallback ルーチンを登録する場合に、FilterDetach または FltDetachVolume を呼び出すと、明示的なデタッチ要求が失敗する可能性があります。

破棄は次のように進められます。

  • ミニフィルタードライバーが InstanceTeardownStartCallback コールバック ルーチンを登録した場合、FltMgr はティアダウン プロセスの開始時にそれを呼び出します。 このルーチンでは、ミニフィルターは次を行う必要があります。

    • 保留中のすべての操作を完了する。
    • ミニフィルターによって生成された入出力要求などの他の作業を取り消すか完了する。
    • 新しい作業項目のキューを停止する。
  • インスタンスのディアダウン時:

    • 現在実行中の操作前または操作後のコールバック ルーチンは、通常の処理を続行します。
    • 操作後コールバックを待機している入出力要求は、"ドレイン" または取り消すことができます。
    • ミニフィルターによって生成されたすべての入出力要求は、完了するまで通常の処理を続行します。
  • ミニフィルターがInstanceTeardownCompleteCallback ルーチンを登録した場合、未処理の入出力操作がすべて完了した後に、FltMgr がこのルーチンを呼び出します。 このルーチンでは、ミニフィルターは開いているファイルをすべて閉じます。

  • インスタンスへの未処理の参照がすべて解放されると、FltMgr は残りのコンテキストを削除し、インスタンスは完全に破棄されます。

ミニフィルターは、システムの実行中に次の方法でアンロードできます。

  • サービス停止要求 (sc stop、net stop、またはサービス API) を介して。

  • 明示的なアンロード要求 (fltmc unloadFltUnloadFilter、または FilterUnload) を介して。 ミニフィルターは、サービス コントロール マネージャー (SCM) に登録されている依存関係に関係なくアンロードされます。

ミニフィルターの FilterUnloadCallback ルーチンは、ミニフィルターがアンロードされたときに呼び出されます。 このルーチンは、開いている通信サーバー ポートをすべて閉じ、FltUnregisterFilter を呼び出し、必要なクリーンアップを実行します。 このルーチンの登録はオプションです。 ただし、ミニフィルターが FilterUnloadCallback ルーチンを登録しない場合、ミニフィルターをアンロードできません。 このルーチンの詳細については、「FilterUnloadCallback ルーチンの作成」を参照してください。

ミニフィルターの読み込みとアンロードのためのフィルター マネージャー ルーチン

FltMgr には、ユーザー モードまたはカーネル モードから発行できる明示的な読み込み要求とアンロード要求に対して、次のサポート ルーチンが用意されています。

ミニフィルター インスタンスのセットアップと破棄のコールバック ルーチンを登録および登録解除するには、次のルーチンを使用します。

インスタンスのセットアップ、ティアダウン、アンロード用のミニフィルター ドライバー コールバック ルーチン

次のミニフィルター ドライバー コールバック ルーチンは、FltRegisterFilter にパラメーターとして渡される FLT_REGISTRATION 構造体のメンバーとして格納されます。

コールバック ルーチンのメンバー名 コールバック ルーチンの種類
InstanceSetupCallback PFLT_INSTANCE_SETUP_CALLBACK
InstanceQueryTeardownCallback PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK
InstanceTeardownStartCallback PFLT_INSTANCE_TEARDOWN_CALLBACK
InstanceTeardownCompleteCallback PFLT_INSTANCE_TEARDOWN_CALLBACK
FilterUnloadCallback PFLT_FILTER_UNLOAD_CALLBACK