プールのトラック
プール追跡は、ドライバーによるメモリ割り当てを監視します。 ドライバーがアンロードされると、ドライバー検証ツールは、ドライバーによるすべての割り当てが解放されたことを確認します。
頻度の低いメモリ割り当て (メモリ リークとも呼ばれます) は、オペレーティング システムのパフォーマンス低下の一般的な原因です。 これらはシステム プールを断片化し、最終的にシステム クラッシュの原因となる可能性があります。
このオプションがアクティブな場合、ドライバー検証ツールは、すべての割り当てを解放せずにドライバーがアンロードされた場合、バグ チェック 0xC4 (パラメーター 1 が 0x62 と等しい) を発行します。
ドライバー検証ツールがこのバグ チェックを発行し、パラメーター 1 が 0x51、0x52、0x53、0x54、または0x59と等しい場合、ドライバーは割り当て外部のメモリに書き込まれています。 この場合は、特別なプール機能を有効にして、エラーの原因を特定する必要があります。
バグ チェック パラメータのリストについては、バグ チェック 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) を参照してください。
Windows Vista 以降では、[プールの追跡] オプションを有効にすると、ロックされたページの追跡も有効になります。 このオプションがアクティブであるときに、ドライバー検証ツールは、I/O 操作後にドライバーがロックされたページを解放できない場合、 バグ チェック 0xCB (DRIVER_LEFT_LOCKED_PAGES_IN_PROCESS) を発行します。
Windows 7 以降のバージョンの Windows オペレーティング システムでは、プール追跡オプションは、次のカーネル API を使用して割り当てられたメモリをサポートします。
I/O 要求パケット (IRP) データ構造を割り当てることができる IoAllocateIrp およびその他のルーチン
RtlAnsiStringToUnicodeString およびその他のランタイム ライブラリ (RTL) 文字列ルーチン
Windows 7 以降のバージョンの Windows オペレーティング システムでは、プール追跡がアクティブになると、ドライバー検証ツールは、アイドル プロセスのコンテキストでクォータを使用してカーネル プール メモリを割り当てようとする試行を検出できます。 このような試行は通常、ドライバーが DPC ルーチンからメモリを割り当てることを意味します。 DPC ルーチンのスレッドまたはプロセス コンテキストは信頼性が低いので、そのプロセスにクォータを請求しようとするのは誤りです。
監視プールの追跡
メモリ プールの割り当ての統計情報は、検証対象のドライバーごとに個別に監視できます。 これらの統計情報は、ドライバー検証ツール マネージャー、Verifier.exeコマンド ライン、またはログ ファイルで表示できます。 詳細については、 個別カウンター の監視 を参照してください。
カーネル デバッガー拡張機能 !verifier 0x3 は、ドライバーのアンロード後に未処理のメモリ割り当てを見つけたり、ドライバーの実行中に現在の割り当てを追跡したりする際に使用できます。 この拡張機能には、プール タグ、プールのサイズ、各割り当てのアロケーターのアドレスも表示されます。 デバッガー拡張機能の詳細については、「Windows デバッグ」を参照してください。
DPC ルーチンからのプール クォータの請求
カーネル ドライバーは、 ExAllocatePoolWithQuotaTagを呼び出してカーネル プール メモリを割り当て、現在のプロセスのプール クォータに割り当てられているバイト数を請求できます。 ドライバーは通常、アプリケーションからの要求に直接関連するメモリ割り当てにクォータを使用します。
遅延プロシージャ 呼び出し (DPC) ルーチンは、任意のプロセスのコンテキストで実行できます。 そのため、DPC ルーチンからのクォータを課金すると、ランダムなプロセスが請求されます。 さらなる悪影響として、DPC ルーチンがアイドル プロセスのコンテキストで実行されると、この状態によってメモリが破損したり、システムがクラッシュしたりする可能性があります。
Windows 7 以降、ドライバー検証ツールは、DPC ルーチンからの ExAllocatePoolWithQuotaTag 呼び出しを検出します。
このオプションをアクティブにする
Driver Verifier Manager または Verifier.exe コマンド ラインを使用して、1 つ以上のドライバーに対してプール追跡機能をアクティブ化できます。 詳細については、「ドライバー検証ツール オプションの選択」をご参照ください 。
コマンドラインで
コマンド ラインでは、[Iプール追跡] オプションは ビット 3 (0x8)で表されます。 プール追跡をアクティブにするには、0x8のフラグ値を使用するか、フラグ値に0x8を追加します。 次に例を示します。
verifier /flags 0x8 /driver MyDriver.sys
この機能は次回の起動後に有効になります。
Windows Vista 以降のバージョンの Windows では、/volatile パラメーターをコマンドに追加することで、コンピューターを再起動せずにプール追跡をアクティブ化および非アクティブ化することもできます。 次に例を示します。
verifier /volatile /flags 0x8 /adddriver MyDriver.sys
この設定はすぐに有効になりますが、コンピューターをシャットダウンまたは再起動すると失われます。 詳細については、「揮発性設定の使用」をご参照ください。
プール追跡機能も標準設定に含まれています。 次に例を示します。
verifier /standard /driver MyDriver.sys
ドライバー検証マネージャーの使用
- ドライバー検証マネージャーを起動します。 コマンド プロンプト ウィンドウに「検証ツール」と入力します。
- 「カスタム設定の作成 (コード開発者用)」 を選択し、 「次へ」をクリックします。
- 選択 全リストから [個々の設定を選択] を選択します。
- [プールの追跡] を選択 (チェック)します。
プール追跡機能も標準設定に含まれています。 この機能を使用するには、ドライバー検証ツール マネージャーで、 [標準設定の作成]をクリックします。