次の方法で共有


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

使用状況の検証

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

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

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

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

  • フィルター コンテキスト (ストリーム コンテキスト、ファイル コンテキストなど)
  • コールバック データ構造体
  • キューに入れられた作業項目
  • 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 文字のコマンドのいずれかを入力します。

  • B または bBreak: これにより、デバッガーに移り、さらに調査を行うことができます。
  • Iまたはi無視を選択すると、実行を再開します。 この違反が再び発生した場合、フィルター検証ツールは違反メッセージをデバッガーに出力し、実行を停止して、プロンプトを表示します。
  • Zまたは Zapz: 実行を再開します。 この違反が再び発生した場合、フィルター検証ツールは違反メッセージをデバッガーに出力しますが、実行は停止しません。
  • Rまたは削除r: 実行を再開します。 この違反が再び発生した場合、フィルター検証ツールは違反メッセージを出力せず、実行を停止しません。

コンパイラの最適化を有効にしてビルドされたドライバーでフィルター検証ツールを使用する場合、コード内のリークの原因が見つからない場合でも、フィルター検証ツールエラーが常に発生し、フィルターによって 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 つ以上のドライバーのファイル システム フィルター検証機能をアクティブ化できます。 詳細については、「 ドライバー検証ツールオプションの選択」を参照してください。

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

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

フィルター検証ツールを起動する推奨される方法は、特殊なプールやプール追跡などの追加の便利な機能を提供するため、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