Windows I/Oの深層(第6回・最終回) ── フィルタードライバーとミニフィルター:ProcmonとウイルススキャンがI/Oに割り込める理由

· · Windows, Win32, I/O, ミニフィルター, カーネル, デバイスドライバー, セキュリティ, 不具合調査

連載「Windows I/Oの深層」、最終回です。

第1回のデバイススタックの図に「ファイルシステムフィルター(ウイルス対策・暗号化・Procmonなど)」という箱を描いてから、この連載には間に挟まる者たちが何度も顔を出してきました。Procmonが全I/Oを記録できる理由(第1回)。「あの環境でだけファイルアクセスが遅い」(第2回)。開かれた瞬間にOneDriveがダウンロードを始めるリパースポイント(第5回)。今回はいよいよ、その挟まる仕組みそのもの──ファイルシステムフィルタードライバーとミニフィルター──を正面から扱い、連載の伏線をすべて回収します。

1. まず結論

  • 「I/Oに割り込む」はOS公認の拡張点です。ファイルシステムフィルターは、ファイルシステムへの要求を見て、書き換え、拒否し、代わりに処理できます(2章)。1
  • 現在の標準はミニフィルターです。デバイススタックに直接割り込むレガシー方式の問題(順序不定・アンロード不可)を解決するため、Windows付属のフィルターマネージャー(FltMgr)にコールバックを登録する方式に世代交代しました(2章)。23
  • 動きはpre/postコールバックです。各操作の前と後に、登録順=アルティチュード順で呼ばれます。素通し・完了・拒否・書き換え──第1回で見た「ドライバーの選択肢」がそのまま使えます(3章)。2
  • アルティチュード(標高)が順序を決めます。用途別のグループに番号帯が割り当てられ(Activity Monitor 360000〜389999、Anti-Virus 320000〜329999など)、ボリュームにアタッチされるインスタンスごとに一意の番号が付きます(4章)。45
  • あなたのPCの住人は fltmc で見られます。Procmon(起動中のみ)、ウイルス対策、OneDriveのクラウドフィルター──全員ここに並びます(5章)。
  • ウイルス対策の除外設定とは「その製品自身のスキャンの省略」であり、他のミニフィルターには影響しません。除外は保護を弱めるトレードオフで、開発ボリュームにはDev Drive(非同期スキャン)というより安全な選択肢があります(6章)。67
  • 「あの環境だけ遅い」の調査は、ProcmonのDuration列と fltmc の構成比較からです(7章)。

2. 挟まる者たちの歴史 ── レガシーフィルターからFltMgrへ

ファイルシステムフィルタードライバーは、ファイルシステム(またはその下のボリューム)に向かう要求を横取りできるドライバーです。要求を記録し、監視し、内容を変更し、さらには拒否や代替処理までできる──ウイルス対策、暗号化、バックアップ、階層記憶といったソフトの土台です。1

古い実装方式(レガシーフィルター)は、第1回で見たデバイススタックに自分のデバイスオブジェクトを直接積む方式でした。仕組みとしては素直ですが、実務では問題だらけでした──積まれる順序はロード順に依存して保証しにくく、一度積んだら安全に抜けない(アンロードできない)、フィルター同士の相性バグの温床になる。

そこでWindowsはフィルターマネージャー(FltMgr)を導入しました。FltMgr自身がOS付属のフィルターとしてスタックに立ち、個々のフィルター機能はミニフィルターとしてFltMgrにコールバックを登録する方式です。2

ミニフィルター方式(現在の標準)コールバック登録コールバック登録フィルターマネージャー(FltMgr)OS付属。スタックに立つのはこれだけミニフィルターA(アルティチュード高)ミニフィルターB(アルティチュード低)ファイルシステム順序はアルティチュードで決定的任意のタイミングでロード可(対応フィルターはアンロードも可)レガシー方式レガシーフィルターAレガシーフィルターBファイルシステム順序はロード順まかせ安全なアンロード不可

図1: 世代交代。スタックに「積む」のではなく、FltMgrに「登録する」方式へ

ミニフィルター方式の利点は公式に列挙されています──いつでもロードでき、順序を制御でき、アンロードコールバックを実装したフィルターなら稼働中のアンロードもできる(実装していない・拒否するフィルターは外せません)。3 レガシーフィルターとの共存のためにFltMgrは複数の「フレーム」としてスタックの複数箇所に立つことができ、ミニフィルターはアンロード後の再ロードでも同じ位置(同じアルティチュード)に戻ることが保証されます。2 現代のウイルス対策・監視・同期ソフトは、ほぼすべてこのミニフィルターです。

3. ミニフィルターの動き ── pre/postコールバック

ミニフィルターは「どの操作に興味があるか」をFltMgrに宣言します。たとえば IRP_MJ_CREATE(開く)と IRP_MJ_WRITE(書く)にだけ興味がある、という具合です。すると、その操作が流れるたびに、操作の前(preコールバック)操作の後(postコールバック)が呼ばれます。

NTFSミニフィルターB(アルティチュード低)ミニフィルターA(アルティチュード高)FltMgrI/OマネージャーNTFSミニフィルターB(アルティチュード低)ミニフィルターA(アルティチュード高)FltMgrI/Oマネージャー要求(IRP_MJ_CREATEなど。第1回の世界)preコールバックpreコールバックファイルシステムへ処理結果postコールバックpostコールバック完了(第1回の完了の流れへ)

図2: pre/postコールバック。行きはアルティチュードの高い順、帰りは逆順で呼ばれる

各コールバックで何ができるか。第1回4.3節の「ドライバーの3つの選択肢」と同じ構図が、より安全なAPIで提供されます。

preコールバックが呼ばれたこの操作をどうするか素通しする(postも要らなければそれも宣言)拒否するアクセス拒否などを即座に返す例: ウイルス検出、書き込み禁止自分で完了する例: クラウドフィルターが実体を取得して差し出すパラメーターや内容に手を入れて流す例: 暗号化フィルター

図3: preコールバックの選択肢。「見る・止める・肩代わりする・書き換える」がすべて公式にできる

そして第4回の宿題がここで回収されます──ミニフィルターはファストI/O(IRPを作らない近道)にも立ち会えます。FltMgrがファストI/O経路にもコールバック機構を通しているためで、レガシー時代のように「近道を通られると見えない」ことがありません。Procmonのログに FASTIO_ の行まで並ぶのは、この立ち位置のおかげです。

4. アルティチュード ── 「標高」が順序を決める

複数のフィルターが同じ操作に興味を持つとき、誰が先に見るかは重大な問題です。暗号化より先にウイルス対策が見なければ暗号文をスキャンする羽目になり、監視ツールは全員より上にいなければ全体を観察できません。

この順序を決めるのがアルティチュード(altitude:標高)です。フィルターの種類ごとにロード順グループと番号帯が定義されています。正確に言うと、アルティチュードが付く単位はドライバー全体ではなく、ボリュームにアタッチされるミニフィルターの「インスタンス」です。番号は一意で、数字が大きいほどスタックの上(アプリ寄り)に位置します。4 1つのドライバーが複数のインスタンス定義を持ち、異なる標高に現れる構成も可能で、fltmc instances の一覧がインスタンス単位なのはこのためです。

アプリ寄り(数字が大きい)FSFilter Activity Monitor: 360000〜389999I/Oの観察・記録(Procmonはここ)FSFilter Undelete: 340000〜349999削除ファイルの復元FSFilter Anti-Virus: 320000〜329999ウイルスの検出・駆除FSFilter Replication: 300000〜309999リモートへの複製FSFilter Continuous Backup: 280000〜289999継続バックアップさらに下へ: Content Screener /Quota Management / System Recovery /暗号化・圧縮などの帯が続くファイルシステム寄り(数字が小さい)

図4: アルティチュード帯(抜粋)。用途ごとに「立つべき標高」が決まっている

重要なのは、この番号がMicrosoftによって割り当て管理されていることです。5 ベンダーが勝手に名乗るのではなく申請して受け取る──だからどのPCでも「監視はウイルス対策より上、ウイルス対策は暗号化より上」という秩序が保たれます。レガシー時代の「ロード順ガチャ」への、これが答えでした。

5. 住人紹介 ── fltmcで見るあなたのPC

理屈はここまでにして、実物を見ましょう。管理者権限のコマンドプロンプトで:

:: 登録されているミニフィルターの一覧(アルティチュード付き)
fltmc

:: どのボリュームにどのフィルターが付いているか
fltmc instances

:: ボリューム側から見る
fltmc volumes

環境によって顔ぶれは違いますが、典型的な住人はこの連載の常連ばかりです。

  • WdFilter ── Microsoft Defenderのミニフィルター。Anti-Virus帯にいます。多くのPCで、すべてのファイルI/Oが必ず通る関所です。
  • cldflt ── クラウドファイルのフィルター。OneDriveのファイルオンデマンドの実行部隊で、第5回で見たリパースポイント(プレースホルダー)が開かれたときに実体を用意します。8
  • PROCMON24(など) ── Process Monitorを起動している間だけ現れる、Activity Monitor帯の一時的なミニフィルター。Procmonが全I/Oを見られる種明かしはこれです9 起動前後で fltmc を実行して比べてみてください。
  • そのほか、バックアップソフト、暗号化(情報漏えい対策)製品、EDR、仮想化ストレージなど──業務PCほど住人は増えます。

第1回から使ってきたProcmonという道具を、最終回で道具箱の外から眺め直すと、「観察者もまた、観察対象と同じ仕組みの住人だった」というきれいな循環になっています。

6. ウイルス対策はどこで時間を使うのか

フィルターの実務影響として最大のものが、ウイルス対策のスキャンコストです。どこで時間が発生するのかを図にします(製品により詳細は異なります。以下は典型形です)。

NTFSAVミニフィルターアプリNTFSAVミニフィルターアプリpre-create: パスやポリシーの事前判定未スキャンのファイルならここで中身をスキャンし問題があればオープンを取り消す── 開くのが遅くなる主因変更されたファイルはクローズ時などに再スキャン対象へ大量の小ファイル(ビルドの中間生成物など)ではこの往復がファイル数ぶん積み重なるファイルを開く通す(オープンの実行)オープン成立(post-create)問題なければハンドルが返る書き込み・閉じる

図5: スキャンコストの発生地点。1ファイルあたりは僅かでも、数万ファイルなら支配的になる

これを踏まえると、2つの実務トピックが正確に理解できます。

除外設定の技術的意味。除外リストに一致するパスのI/Oでは、フィルターのスキャン処理が省略されます。フィルターがスタックから消えるわけではなく、「検査しない」という判断が早く行われるようになる、というのが実態です。そしてもうひとつ大事な限定があります──除外が効くのは、その設定を持つ製品自身のフィルターだけです。Microsoft Defenderの除外設定が変えるのは WdFilter のスキャンであって、同居している他のミニフィルター(他社ウイルス対策・EDR・バックアップ・暗号化など)の動作には何の影響もありません。「除外を入れたのに遅いままだ」というときは、別の住人が時間を使っている可能性を疑ってください(7章の fltmc 比較)。効果は大きい一方、除外はその場所の保護を確実に弱めます。Microsoftのドキュメントも、除外は防御を減らすためリスク評価の上で最小限に、と繰り返し警告しています。6 誤検知対応と性能影響の実務は「自社開発のWindowsアプリがウイルス扱いされたら」で扱いました。

Dev Driveという新しい答え。開発ワークロード(大量小ファイル)のために設計された専用ボリュームで、Microsoft Defenderがパフォーマンスモード(非同期スキャン)で動作します。フォルダー除外のより安全な代替と位置付けられており、既定では追加のフィルターがアタッチされない一方、フィルターを全部外して運用することへの強い警告も明記されています。7 「ビルドを速くしたいが除外は怖い」への、現在のMicrosoftの推奨解です。

7. 「あの環境だけ遅い」の調査手順

連載で積み上げた道具を、最後に1本の手順にまとめます。

はいはいいいえいいえ(散発的)症状: 同じアプリなのに特定環境だけファイルアクセスが遅いProcmonでDuration列を見るどの操作(IRP_MJ_CREATE? WRITE?)に時間が消えているか特定の操作が一様に遅い?fltmc instances を速い環境と比較フィルター構成の差分を見る差分のフィルターが原因?除外設定(リスク評価つき)やDev Driveの検討・ベンダーへの相談フィルター以外を疑う:キャッシュ(第4回)・断片化やMFT(第5回)・ネットワーク先(UNC)・デバイス自体

図6: フィルター起因の遅さの切り分け。鍵は「操作単位の所要時間」と「環境間のフィルター構成差分」

ポイントは2つです。第一に、Procmonは操作ごとの所要時間(Duration)を持っています。「遅い」を「どの操作が遅い」に分解できれば、犯人探しは半分終わりです。第二に、環境差はフィルター構成の差であることが多い。開発機と本番機、自社PCと客先PC──fltmc の出力を並べるだけで、疑うべき候補が見えてきます。

8. 連載の総仕上げ ── 6回の地図

これで、第1回に描いた地図のすべての箱を開けました。全体を1枚にします。

完了はここへ戻るキャッシュ有効I/Oは協調(ファイルシステムがキャッシュ機能を呼ぶ)割り込み→完了(第1回)アプリケーションReadFile / WriteFile / async-await第2回: 同期・非同期I/OハンドルのモードとOVERLAPPED第3回: IOCPと.NETスレッドプール完了の受け取りと継続の実行第1回: I/OマネージャーとIRP名前解決・3つのオブジェクト・デバイススタック第6回: フィルターとミニフィルターFltMgr・アルティチュード・pre/post第4回: キャッシュマネージャー256KBビュー・lazy writer・ファストI/O(NTFSと協調して働く)第5回: NTFSMFT・ストリーム・リンク・2つのジャーナルストレージスタックとデバイス

図7: 連載全体の地図。キャッシュマネージャーは「通過する層」ではなくファイルシステムと協調する相棒で、キャッシュミス時にNTFSからストレージへの要求が出る

9. まとめ ── 連載の結びに

最終回のまとめです。

  • I/Oへの割り込みはOS公認の拡張点で、現在の標準はFltMgrへのコールバック登録(ミニフィルター)です。順序はアルティチュードで決定的に決まり、Microsoftが番号を割り当て管理しています。245
  • 動きはpre/postコールバック。素通し・拒否・肩代わり・書き換えができ、ファストI/Oにも立ち会えます。ProcmonもDefenderもOneDriveも、この同じ仕組みの住人です。198
  • 除外設定=スキャンの省略であり、保護とのトレードオフです。開発ボリュームにはDev Drive(非同期スキャン)というより安全な選択肢があります。67
  • 「あの環境だけ遅い」は、ProcmonのDurationと fltmc の構成差分から切り分ける──連載の道具がそのまま調査手順になります。

そして連載全体の結論を一行で言うなら、こうなります──WindowsのI/Oは、名前空間で宛先を決め、要求をパケット(IRP)にして層の間を流し、各層が「見る・預かる・肩代わりする」を選べるように作られた、一貫した設計であるFile.ReadAllText の1行の下に、この6回ぶんの構造が毎回動いています。APIの挙動を暗記する代わりに、この地図から「そうなるはずだ」と導ける──それがこの連載で手に入れてほしかった力です。長い旅にお付き合いいただき、ありがとうございました。

関連記事

関連する相談領域

合同会社小村ソフトでは、「特定の環境でだけ遅い」「セキュリティソフトと自社アプリが干渉する」といった、フィルタードライバーが絡むWindows業務アプリの性能問題・不具合の調査を扱っています。

参考リンク

  1. Microsoft Learn, About file system filter drivers. ファイルシステムフィルタードライバーが、ファイルシステムまたは他のフィルタードライバーに向かう要求を横取り(インターセプト)できるオプションのドライバーであること、要求を横取りすることで元の宛先に渡る前に機能を拡張・置換でき、要求の記録・監視・データの変更・動作の防止ができること、ウイルス対策ユーティリティ・暗号化プログラム・階層記憶管理システムなどがフィルタードライバーの例であることについて。  2 3

  2. Microsoft Learn, Filter Manager Concepts. フィルターマネージャー(FltMgr)がWindowsに付属するカーネルモードドライバーであり、ミニフィルタードライバーの開発を簡素化する機能を公開すること、ミニフィルターがI/O操作の前後(pre/postコールバック)に処理を登録できること、レガシーフィルターとの共存のためにFltMgrがフレームとしてI/Oスタックの複数箇所にアタッチできること、ミニフィルターがアンロード・再ロードされても同じフレームの同じアルティチュードに戻ることについて。  2 3 4 5

  3. Microsoft Learn, Advantages of the Filter Manager Model. ミニフィルターモデルがレガシーフィルターモデルに対して持つ利点として、フィルターのロード順のより良い制御ができること、レガシーフィルターと異なりミニフィルターは任意の時点でロードできること、アンロードが可能なこと、DAXボリュームへの接続などが挙げられていることについて。  2

  4. Microsoft Learn, Load order groups and altitudes for minifilter drivers. ファイルシステムフィルター用に用途別のロード順グループが定義され、各グループにアルティチュードの範囲が割り当てられていること、すべてのフィルタードライバーが一意のアルティチュード識別子を持ち、それがI/Oスタック内での他のフィルターに対する相対位置を定めること、グループの例としてFSFilter Activity Monitor(360000〜389999、I/Oの観察と報告)、FSFilter Undelete(340000〜349999)、FSFilter Anti-Virus(320000〜329999、ファイルI/O中のウイルス検出と駆除)、FSFilter Replication(300000〜309999)、FSFilter Continuous Backup(280000〜289999)などがあることについて。  2 3

  5. Microsoft Learn, Allocated altitudes. ミニフィルターのアルティチュードがMicrosoftによって割り当て・管理されており、公開されている割り当て済みアルティチュードの一覧が維持されていることについて。  2 3

  6. Microsoft Learn, Configure and validate exclusions for Microsoft Defender Antivirus. Microsoft Defenderの除外設定により、除外対象のファイル・フォルダー・プロセスがスキャンの対象から外れること、除外は保護レベルを下げるため、必要性を評価した上で慎重に定義すべきであると繰り返し注意されていることについて。  2 3

  7. Microsoft Learn, Set up a Dev Drive on Windows 11. Dev Driveが開発ワークロード向けに設計されたボリュームであり、Microsoft Defenderがパフォーマンスモード(非同期スキャン)で動作すること、これが速度と性能を考慮しつつフォルダー除外の安全な代替(secure alternative to folder exclusions)として位置付けられていること、追加のフィルターは既定でDev Driveにアタッチされないこと、ウイルス対策フィルターを外した運用は重大なセキュリティリスクであると警告されていることについて。  2 3

  8. Microsoft Learn, Cloud Files API. クラウドファイルAPI(クラウドフィルター)が、クラウド上のファイルをプレースホルダーとしてローカルに見せ、アクセス時に実体を取得する同期エンジン(OneDriveのファイルオンデマンド等)の土台であることについて。  2

  9. Microsoft Learn, Process Monitor - Sysinternals. Process Monitorがファイルシステム・レジストリ・プロセス/スレッドの活動をリアルタイムに表示する高度な監視ツールであることについて(本文のとおり、動作中はfltmcの一覧にミニフィルターとして現れることが観察できる)。  2

同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。

このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。

この記事は次のサービスページにつながります。近い入口からご覧ください。

よくある質問

この記事のテーマについて、相談時によくある質問をまとめています。

ファイルシステムフィルタードライバーとミニフィルターは何が違いますか?
どちらも「ファイルシステムへのI/O要求に割り込むドライバー」ですが、割り込み方の世代が違います。古いレガシーフィルターは、ファイルシステムのデバイススタックに自分のデバイスオブジェクトを直接積み重ねる方式で、読み込み順で位置が決まるため順序が保証しにくく、一度ロードしたら安全にアンロードできないなどの問題がありました。現在の標準であるミニフィルターは、Windows付属のフィルターマネージャー(FltMgr)に「この操作の前後で呼んでほしい」とコールバックを登録する方式です。位置はアルティチュードという番号で決定的に決まり、任意のタイミングでロードでき、アンロードコールバックを実装したフィルターなら稼働中に取り外すこともできます。ウイルス対策・暗号化・監視ツール・クラウド同期など現代のフィルターはほぼすべてミニフィルターとして実装されています。
なぜウイルス対策ソフトはすべてのファイルアクセスを検査できるのですか?
OSが公式にそのための拡張点を用意しているからです。ミニフィルターは、ファイルを開く・読む・書くといった操作の前(preコールバック)と後(postコールバック)に呼び出されるコードをフィルターマネージャーに登録できます。ウイルス対策のフィルターはアンチウイルス用のアルティチュード帯(320000〜329999)に位置し、たとえばファイルのオープンが成立した直後(post-create)に中身をスキャンし、問題があればそのオープンを取り消してアクセスを失敗させることができます。連載第1回で見たとおり、すべてのファイルI/Oはデバイススタックを流れるので、その通り道の決まった位置に立てば全アクセスを検査できる、という理屈です。ハックではなく、OSの設計に組み込まれた仕組みです。
ウイルス対策ソフトの除外設定(フォルダー除外)は技術的に何をしているのですか?
除外リストに一致するパスへのI/Oについて、その製品のフィルターが行うスキャン処理を省略させています。フィルター自体がスタックから消えるわけではなく、「このパスは検査しない」という判断が早期に行われるようになる、というのが実態に近い理解です。重要な限定として、除外が効くのはその設定を持つ製品自身だけです。たとえばMicrosoft Defenderの除外設定が変えるのはDefenderのフィルター(WdFilter)のスキャンであって、同居する他社ウイルス対策・EDR・バックアップなど他のミニフィルターの動作には影響しません。製品ごとに個別の除外設定が必要で、「除外したのに遅いまま」の場合は別のフィルターが原因のことがあります。またMicrosoftのドキュメントが繰り返し警告するとおり、除外はその場所の保護を弱めるため、リスク評価とセットで最小限にすべきです。開発用途では、フォルダー除外の安全な代替として設計されたDev Drive(パフォーマンスモード=非同期スキャン)の検討も価値があります。
Process Monitorはどうやって全部のI/Oを記録しているのですか?
Procmon自身が、起動時にActivity Monitor(活動監視)用のアルティチュード帯のミニフィルターとして自分をフィルターマネージャーに登録するからです。Procmonを起動した状態で管理者権限のコマンドプロンプトからfltmcを実行すると、PROCMONで始まる名前のフィルターが一覧に現れるのが確認できます。ミニフィルターとして全ボリュームのI/O操作のpre/postに立ち会えるため、どのプロセスがどのファイルにどんな操作をしたかを漏れなく記録できます。連載で見てきたIRPやファストI/Oの用語がProcmonの表示にそのまま出てくるのは、まさにI/Oの通り道そのものに立って観察しているからです。
開発マシンのビルドが遅いとき、フィルタードライバーを疑うべきですか?
疑う価値は大いにあります。ビルドは大量の小ファイルの作成・読み書き・削除の塊で、その1つ1つがフィルター群(特にウイルス対策のスキャン)の検査対象になるため、フィルターのコストが最も表面化しやすいワークロードです。調査はProcmonでDuration列を見て時間がどの操作に消えているかを確認し、fltmc instancesで環境ごとのフィルター構成の差を比較するのが基本手順です。対策としては、リスクを評価した上での除外設定のほか、開発ボリューム専用に設計されたDev Driveの利用が挙げられます。Dev Driveではウイルス対策がパフォーマンスモード(非同期スキャン)で動作し、除外設定より安全な代替になるとMicrosoftが位置付けています。

著者プロフィール

記事の著者プロフィールページです。

小村 豪

合同会社小村ソフト 代表

Windows ソフト開発、技術相談、不具合調査を中心に、既存資産が残る案件や原因が見えにくい障害調査に強みがあります。

ブログ一覧に戻る