フィルタードライバーとミニフィルターの知識マップ(知識グラフ)
ミニフィルター
フィルターマネージャー(FltMgr)にpre/postコールバックを登録する方式で動く、現在の標準のファイルシステムフィルタードライバー実装方式。
ミニフィルタードライバー
フィルターマネージャー(FltMgr)
Windowsに付属するカーネルモードドライバーで、ミニフィルタードライバーの開発を簡素化する機能を公開する。自身がスタックに立ち、個々のミニフィルターはこれにコールバックを登録する。
レガシーフィルター
ファイルシステムのデバイススタックに自分のデバイスオブジェクトを直接積み重ねる、古い世代のファイルシステムフィルタードライバー実装方式。ロード順に依存し安全なアンロードができない。
ファイルシステムフィルタードライバー
ファイルシステム(またはその下のボリューム)に向かう要求を横取りできるオプションのドライバー。要求の記録・監視・データの変更・防止ができる。
フィルタードライバー
デバイススタック
積み重なった複数のデバイスオブジェクトの列。IRPはスタック最上位のデバイスオブジェクトへ送られ、各層で処理または下位への転送が行われる。
ロード順序の不安定さ
レガシーフィルターが抱えていた、フィルターの積まれる順序がロード順に依存して保証しにくく、安全にアンロードもできないという問題。
pre/postコールバック
ミニフィルターがFltMgrに登録する、I/O操作の前(pre)と後(post)に呼ばれる処理。素通し・拒否・肩代わり・書き換えができる。
preコールバック
postコールバック
アルティチュード
ボリュームにアタッチされるミニフィルターのインスタンスごとに付く一意の番号。数字が大きいほどスタックの上(アプリ寄り)に位置し、複数のフィルターが同じ操作を見る際の呼び出し順序を決定的に決める。Microsoftが割り当て・管理する。
標高
ロード順グループ
ファイルシステムフィルター用に用途別(Activity Monitor、Anti-Virus、Replicationなど)に定義されたグループで、それぞれにアルティチュードの番号帯が割り当てられる。
fltmc
登録されているミニフィルターの一覧、ボリュームごとのアタッチ状況、ロード・アンロードを操作できる管理者向けコマンドラインツール。
アルティチュードの申請
新しいミニフィルターのアルティチュード識別子をMicrosoftへ申請する手続き。fsfcomm@microsoft.comへの英文メールで行い、処理に30営業日を見込む。
Process Monitor(procmon.exe)
ファイルI/O・レジストリ・プロセス/スレッド活動をリアルタイムに監視できるSysinternalsのツール。Advanced Outputを有効にすると、IRPやファストI/Oのカーネル側の語彙で操作を表示する。
ウイルス対策ミニフィルター
ファイルI/O中のウイルス検出・駆除を行うミニフィルター。FSFilter Anti-Virus帯(320000〜329999)に位置する。Microsoft DefenderのWdFilterなどが該当する。
AVミニフィルター
クラウドファイルフィルター(cldflt)
クラウドファイルAPIを実装するミニフィルター。OneDriveのファイルオンデマンドの実行部隊で、プレースホルダーが開かれたときに実体を取得する。
OneDriveのファイルオンデマンド
実データが手元にないクラウド上のファイルをプレースホルダー(リパースポイント)としてローカルに見せ、アクセス時にクラウドフィルターが実体を取得する仕組み。
クラウドファイル
ファストI/O
キャッシュに載っているファイルへの同期I/Oのために、IRPを組み立てずキャッシュマネージャーと直接データをやり取りする高速経路。処理できない場合は通常のIRP経路に折り返す。
スキャンによる性能コスト
ウイルス対策ミニフィルターによるファイルスキャンがI/Oに追加する処理時間。大量の小ファイルを扱うワークロードで支配的になりやすい。
スキャンコスト
除外設定(フォルダー除外)
指定したパス・プロセスをウイルス対策のスキャン対象から外す設定。効くのはその設定を持つ製品自身のフィルターだけで、保護レベルを下げるトレードオフを伴う。
フォルダー除外
スキャン除外
保護レベルの低下
除外設定などによってスキャン対象から外れた結果、その範囲の脅威検出・防御が働かなくなること。
Dev Drive
開発ワークロード向けに設計された専用ボリューム。Microsoft Defenderがパフォーマンスモード(非同期スキャン)で動作し、フォルダー除外の安全な代替と位置付けられる。
FltMgrフレーム
レガシーフィルターとの共存のため、FltMgrがI/Oスタックの複数箇所にアタッチする単位。fltmcの出力のFrame列で確認できる。
ドライバーオブジェクト
ドライバーのロード時にI/Oマネージャーが作るオブジェクト。要求の種類ごとの処理関数(ディスパッチルーチン)への対応表であるMajorFunction配列を持つ。
レガシーフィルターは、ファイルシステムへの要求を横取りできるファイルシステムフィルタードライバーの古い実装方式である
ミニフィルターは、ファイルシステムフィルタードライバーの現在の標準的な実装方式である
ミニフィルターは、デバイススタックに直接割り込むレガシーフィルターの問題(順序不定・安全にアンロードできない)を解決するために導入された
レガシーフィルターは、自分のデバイスオブジェクトをファイルシステムのデバイススタックに直接積み重ねる方式で動く
レガシーフィルターは積まれる順序がロード順に依存して保証しにくく、一度積んだら安全にアンロードできないなどの問題を抱えていた
順序をアルティチュードで制御でき、任意のタイミングでロードでき、対応フィルターなら稼働中のアンロードもできるため、レガシー時代の順序不定・アンロード不可の問題を防ぐ
ミニフィルターは、Windows付属のフィルターマネージャー(FltMgr)にコールバックを登録する方式で動く
FltMgrは、興味を宣言した操作について各ミニフィルターのpre/postコールバックを呼び出す
ミニフィルターは操作の前(pre)と後(post)に呼ばれるコールバックを実装し、素通し・拒否・肩代わり・書き換えを行う
複数のミニフィルターが同じ操作を見るときの呼び出し順序は、アルティチュード(標高)という一意の番号で決定的に決まる
アルティチュードの値は、用途別に定義されたロード順グループごとの番号帯から割り当てられる
fltmc(fltmc filters)で、登録されているフィルターとそのアルティチュードを一覧できる
新しいアルティチュード識別子はMicrosoftによって割り当て・管理されており、自分で名乗ることはできない
自社のミニフィルターを配布する前に、件名「Filter altitude request」のメールをfsfcomm@microsoft.comへ送って申請し、処理に30営業日を見込んでアルティチュードを取得しておくべき
fltmc filtersの出力(Filter Name / Num Instances / Altitude / Frame)で、ロードされているミニフィルターの構成を確認できる
fltmc filtersの出力でFrame列が<Legacy>になっているものは、FltMgrを介さないレガシーファイルシステムフィルタードライバーである
Process Monitorは、起動時にActivity Monitor帯のミニフィルターとして自分自身をFltMgrに登録することで、ファイルシステムの活動をリアルタイムに監視する
Procmonはミニフィルターとして全ボリュームのI/O操作のpre/postコールバックに立ち会うことで、どのプロセスがどのファイルに何をしたかを漏れなく記録する
ウイルス対策のミニフィルターは、ファイルのオープンが成立した直後(post-create)にpostコールバックで中身をスキャンし、問題があればオープンを取り消せる
ウイルス対策のミニフィルターは、FSFilter Anti-Virus帯(320000〜329999)のアルティチュードに位置する(例: WdFilterは328010)
クラウドファイルAPIを実装するクラウドフィルター(cldflt)は、プレースホルダーとして表現されたファイルがアクセスされた際の実体の取得を自動で行う
FltMgrはファストI/O経路にもコールバック機構を通しているため、ミニフィルターはIRPを作らない近道であるファストI/Oにも立ち会える(レガシー時代は近道を通られると見えなかった)
ファイルを開くたびのスキャンや変更後の再スキャンが、特に大量の小ファイルを扱うワークロードで支配的なコストになりうる
除外リストに一致するパスのI/Oでは、その製品のフィルターのスキャン処理が省略され、性能コストが下がる
除外は防御を減らすものであり、必要性を評価した上で慎重に定義すべきと公式ドキュメントが繰り返し注意している
ウイルス対策のミニフィルターがどのパスをスキャン対象から外すかは、除外設定で構成する(効くのはその設定を持つ製品自身のフィルターだけ)
Dev Driveでは既定でMicrosoft Defenderがパフォーマンスモード(非同期スキャン)で動作し、開発ワークロードの性能コストを緩和する
フォルダー除外の安全な代替(secure alternative to folder exclusions)と位置付けられ、除外ほど保護レベルを下げずに性能とのバランスを取れる
Dev Driveでもパフォーマンスモードで動作するウイルス対策フィルターを維持することが前提で、フィルターを完全に外す運用は重大なセキュリティリスクだと公式に警告されている
レガシーフィルターとの共存のため、FltMgrは複数の「フレーム」としてI/Oスタックの複数箇所にアタッチできる
fltmc filtersの出力のFrame列で、各フィルターがどのフレームに属しているかを確認できる
レガシーフィルターも、デバイスオブジェクトをスタックへ積むための通常のカーネルドライバー(ドライバーオブジェクト)として実装される
ミニフィルターも、FltMgrに登録されるカーネルドライバー(ドライバーオブジェクト)として実装される
FltMgr自身もOS付属のフィルターとしてファイルシステムのデバイススタックに立ち、個々のミニフィルターはそのFltMgrにコールバックを登録する
FltMgrはWindowsに付属するカーネルモードドライバーであり、ミニフィルタードライバーの開発を簡素化する機能を公開する