ファイル システム フィルターの検証

使用状況の検証

フィルター検証ツールは、ミニフィルター ドライバーで次の使用法を検証します。

  • パラメーターと呼び出し元コンテキストの正しい使用
  • プリ操作および事後操作コールバック ルーチンからの正しい戻り値
  • コールバック データ内のパラメーターに対する一貫性のあるコヒーレントな変更

フィルター マネージャー オブジェクト追跡

フィルター検証ツールは、次のフィルター マネージャー オブジェクトを追跡します。

  • フィルター コンテキスト (ストリーム コンテキスト、ファイル コンテキストなど)
  • コールバック データ構造体
  • キューに入れられた作業項目
  • NameInformation 構造体
  • ファイルオブジェクト
  • オブジェクトをフィルター処理します
  • インスタンス オブジェクト
  • Volume オブジェクト

フィルター コンテキストや名前情報構造体などの参照カウントされた構造体の場合、フィルター検証ツールは、参照カウントがリークされているように見える場合、フィルター ドライバーのアンロード時にデバッガーに中断します。 !fltkd デバッガー拡張機能 を使用してリークした構造を見つける方法について説明します。

検証ツール違反のフィルター処理

フィルター検証ツールは、違反を検出すると、違反を説明するメッセージをデバッガーに出力します。 ほとんどの違反では、実行も停止し、ユーザーに何らかのアクションを実行するよう求めます。 次に例を示します。

FILTER VERIFIER ERROR: A filter returned an unknown pre-operation callback status.
(Filter = FFFFAC04A21CD8A0 (MyFilter), Status = 0xbaadf00d)
Break, ignore, zap or remove ?

続行するには、次の 4 つの 1 文字のコマンドのいずれかを入力します。

  • BreakB または b: デバッガーがブレークされ、そこでさらに調査を実行できます。
  • IgnoreI または i: 実行を再開します。 この違反が再び発生した場合、フィルター検証ツールは違反メッセージをデバッガーに出力し、実行を停止して、プロンプトを表示します。
  • ZapZ または z: 実行を再開します。 この違反が再び発生した場合、フィルター検証ツールは違反メッセージをデバッガーに出力しますが、実行は停止しません。
  • RemoveR または r: 実行を再開します。 この違反が再び発生した場合、フィルター検証ツールは違反メッセージを出力せず、実行を停止しません。

Note

コンパイラの最適化を有効にしてビルドされたドライバーでフィルター検証ツールを使用する場合、コード内のリークの原因が見つからない場合でも、フィルター検証ツールエラーが常に発生し、フィルターによって 1 つ以上のリソースへの参照がリークされたと主張されることがあります。 メッセージは次のようなテキストで始まります。

FILTER VERIFIER ERROR: A filter (Filter = FFFFAC04A21CD8A0 (MyFilter)) leaked references to the following resources:

次のようなオブジェクト追跡が同期されないことを示すメッセージが表示される場合もあります。

FILTER VERIFIER WARNING: Filter manager verifier object tracking may be out of sync for the system

この状態の最も一般的な原因は、末尾呼び出しの最適化により、フィルター検証ツールがフィルター マネージャー API の真の呼び出し元を識別できなかったということです。 これは、ドライバーのルーチンがフィルター マネージャー API を最後の行として呼び出すときに発生する可能性があります。 次に例を示します。

void MyWorkItemCallback(PFLT_GENERIC_WORKITEM WorkItem,
                        PVOID Filter,
                        PVOID Context)
{
   // Do some stuff
   ...
   FltFreeGenericWorkItem(WorkItem);
}

これが発生したことを確認するには、いくつかの方法があります。

  1. #pragma optimize("", off) ... #pragma optimize("", on)で疑わしいルーチンをラップ して、疑わしいルーチンの最適化を無効にします。
  2. フィルター マネージャー API 呼び出しがルーチンで最後に発生しないようにコードを並べ替えます。

これらのオプションのいずれかを試してもエラーが再現されなくなった場合は、誤検知である可能性があります。

このオプションのアクティブ化

verifier.exe コマンド ラインを使用して、1 つ以上のドライバーのファイル システム フィルター検証機能をアクティブ化できます。 詳細については、「ドライバー検証ツール オプションの選択」をご参照ください 。

Note

Windows ビルド 25126 より前のバージョンでは、検証のために ntoskrnl が選択されている 1 つまたは複数のミニフィルターでファイル システム フィルター検証を有効にすることはサポートされていません。 これを行うと、誤った検証ツール エラーが発生する可能性があります。

この問題を回避するには、ビルド 25126 の後に Windows のバージョンを確認またはアップグレードするコンポーネントの一覧に ntoskrnl を含めないでください。

フィルター検証ツールを起動する推奨方法は、 verifier.exe/standard オプションを使用することです。これは、 特別なプールプールの追跡 などの追加の便利な機能を提供するためです。

verifier.exe /standard /driver MyFilter.sys

ミニフィルター ドライバーがフィルター マネージャーに登録されると、検証が開始されます。

  • Windows 11 以降のバージョンの Windows でフィルター検証ツールのみを有効にする フィルター検証ツール チェックの最小セットを有効にするには、ドライバー検証ツール (verifier.exe) で I/O 検証 オプションと ファイル システム フィルター検証 オプションを有効にします。 次に例を示します。

    verifier.exe /ruleclasses 5 37 /driver MyFilter.sys
    
  • Windows 10 以前のバージョンの Windows でフィルター検証ツールのみを有効にする フィルター検証ツール チェックの最小セットを有効にするには、ミニフィルター ドライバーの名前を指定し、ドライバー検証ツール (verifier.exe) で I/O 検証 オプションを有効にします。 次に例を示します。

    verifier.exe /flags 0x10 /driver MyFilter.sys