Share via


ドライバー検証ツールでの特別なプール メモリ破損の検出

メモリの破損は、一般的なドライバーの問題です。 ドライバーエラーは、エラーが発生した後に長い間クラッシュする可能性があります。 これらのエラーの中で最も一般的なのは、既に解放されているメモリにアクセスし、n バイトを割り当ててから n+1 バイトにアクセスすることです。

メモリの破損を検出するために、ドライバー検証ツールは、特別なプールからドライバー メモリを割り当て、そのプールの不正なアクセスを監視できます。 特別なプールのサポートは、ExAllocatePoolWithTag などのカーネル モードのシステム提供ルーチンと、EngAllocMem などの GDI システム提供ルーチンにも提供されます。

配置別の特別なプール

特別なプールの 2 つのアラインメントを使用できます。

  • [開始の 確認] アラインメントは、アクセス アンダーランの検出に適しています。
  • [終了の確認] アラインメントは、アクセス オーバーランの検出に適しています。

[開始の確認] オプションと [終了の確認] オプションの使用方法の詳細については、「オーバーランとアンダーランの検出」をご参照ください。 メモリ破損の大部分は、アンダーランではなくオーバーランが原因であることにご注意ください。

特別なプール機能がアクティブで、[終了の確認] が選択されている場合、ドライバーによって要求された各メモリ割り当てが個別のページに配置されます。 メモリがページの末尾に合うように、ページに収まるように割り当てを許可する可能な最大アドレスが返されます。 ページの前の部分は、特殊なパターンで記述されています。 前のページと次のページはアクセス不可としてマークされます。

ドライバーが割り当ての終了後にメモリにアクセスしようとすると、ドライバー検証ツールはすぐにこれを検出し、バグ チェック 0xCD を発行します。 ドライバーがバッファーの先頭の前にメモリに書き込む場合、これは (おそらく) パターンを変更します。 バッファーが解放されると、ドライバー検証ツールは変更を検出し、バグ チェック 0xC1 を発行します。

ドライバーがバッファーを解放した後に読み取りまたは書き込みを行うと、ドライバー検証ツールはバグ チェック 0xCC を発行します。

[開始の確認] が選択されている場合、メモリ バッファーはページの先頭に配置されます。 この設定では、アンダーランによってすぐにバグチェックが発生し、メモリが解放されたときにオーバーランによってバグ チェックが発生します。 それ以外の場合、このオプションは [終了の確認] オプションと同じです。

[終了の確認] は、オーバーラン エラーがアンダーラン エラーよりもドライバーで一般的であるため、既定のアラインメントです。

個々のメモリ割り当ては、これらの設定をオーバーライドし、優先順位パラメーターを XxxSpecialPoolOverrun または XxxSpecialPoolUnderrun に設定して ExAllocatePoolWithTagPriority を呼び出すことによって、その配置を選択できます。 (このルーチンは、特殊プール機能をアクティブ化または非アクティブ化したり、通常のプールから割り当てられないメモリ割り当てのために特殊プールを要求したりすることはできません。このルーチンから制御できるのは、アラインメントだけです)。

Windows 7 以降の Windows オペレーティング システムでは、特別プール オプションは、次のカーネル API を使用して割り当てられたメモリをサポートします:

プール タグまたは割り当てサイズによる特別プール

ドライバー検証ツールの特別なプール機能に加えて、指定したドライバーによる割り当ての特別なプールを要求する、特別なプールを使用する方法は他に 2 つあります。

  • プール タグ。 指定されたプール タグを持つすべての割り当てに対して特別なプールを要求します。

  • サイズ。 特定のサイズ範囲内のすべての割り当てに対して、特別なプールを要求します。

プール タグまたはサイズ範囲の特別なプールを要求するには、Windows 用デバッグ ツールに含まれているツールである Gflags を使用します。 詳細については、「グローバル フラグ ユーティリティの使用」をご参照ください。

ドライバー検証ツールの特別なプール機能と Gflags の特別なプール機能を同時に使用できます。 その場合は、特別なプールが制限されていること、特別なプールから割り当てようとするすべての試行が成功したわけではないこと、および通常のメモリ プールからの割り当てによって満たされた特殊なプールからの割り当て試行が失敗した場合に Windows が成功状態を返す点にご注意ください。

特別なプール効率

すべての特別なプール要求が満たされるわけではありません。 特別なプールからの各割り当てでは、1 ページの非ページング物理メモリと 2 ページの仮想アドレス空間が使用されます。 プールが使い果たされた場合、特別なプールが再び利用可能になるまで、メモリは標準的な方法で割り振られます。 標準プールから特別なプール要求が入力されると、プール要求が成功したので、要求関数はエラーを返しません。 したがって、特別なプール機能がアクティブ化されている場合は、複数のドライバーを同時に検証することはお勧めしません。

多数の小さなメモリ要求を行う 1 つのドライバーでも、このプールが枯渇する可能性があります。 このような場合は、ドライバーのメモリ割り当てにプール タグを割り当て、特別なプールを一度に 1 つのプール タグ専用にすることをお勧めします。

特別なプールのサイズは、システム上の物理メモリの量に応じて増加します。理想的には、これは少なくとも 1 ギガバイト (GB) である必要があります。 x86 マシンでは、仮想 (物理領域に加えて) が消費されるため、/3 GB ブート オプションを使用しないでください。 また、ページ ファイルの最小/最大数量を 2 ~ 3 倍に増やすこともお勧めします。

ドライバーのすべての割り当てがテストされていることを確認するには、長時間にわたってドライバーに負荷をかけるためにお勧めします。

特別なプールの監視

プールの割り当てに関連する統計を監視できます。 これらの統計情報は、ドライバー検証ツール マネージャー、Verifier.exe コマンド ライン、またはログ ファイルで表示できます。 詳細については、グローバル カウンターの監視をご参照ください。

プール割り当てに成功した特殊プール カウンターがプール割り当て成功したカウンターと等しい場合、特別なプールはすべてのメモリ割り当てをカバーするのに十分です。 前者のカウンターが後者より低い場合、特別なプールは少なくとも 1 回使い果たされています。

特別なプールは適用できないため、サイズが 1 ページ以上の割り当ては追跡されません。

特殊プール機能が有効になっていても、すべてのプール割り当ての 95% 未満が特殊プールから割り当てられている場合は、警告が表示されます。 Windows 2000 では、この警告はドライバーの 状態画面に表示されます。 Windows XP 以降では、この警告はグローバル カウンター画面に表示されます。 このような場合は、ドライバーの短い一覧を確認するか、プール タグによって個々のプールを確認するか、システムに物理メモリを追加する必要があります。

カーネル デバッガー拡張機能 !verifier を使用して、特別プールの使用を監視することもできます。 ドライバー検証ツール マネージャーと同様の情報が表示されます。 デバッガー拡張機能の詳細については、「Windows デバッグ」を参照してください。

特別なプール オプションのアクティブ化

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

Note

プール タグまたは割り当てサイズによって特別なプール機能をアクティブ化するか、[開始の確認] (アンダーランの検出) および [終了の確認] (オーバーランの検出) の配置を設定するには、グローバル フラグ ユーティリティを使用します。これらの配置設定はすべての特別なプール割り当てに適用されます。

  • コマンドラインで

    コマンド ラインでは、[特別追跡] オプションはビット 0 (0x1) で表されます。 特殊プールをアクティブにするには、0x1 のフラグ値を使用するか、フラグ値に 0x1 を追加します。 次に例を示します。

    verifier /flags 0x1 /driver MyDriver.sys
    

    この機能は次回の起動後に有効になります。

    また、コマンドに /volatile パラメーターを追加することで、コンピュータを再起動することなく特別 プールの有効/無効を切り替えることができます。 次に例を示します。

    verifier /volatile /flags 0x1 /adddriver MyDriver.sys
    

    この設定はすぐに有効になりますが、コンピューターをシャットダウンまたは再起動すると失われます。 詳細については、「揮発性設定の使用」をご参照ください。

    特別プール機能も標準設定に含まれています。 次に例を示します。

    verifier /standard /driver MyDriver.sys
    
  • ドライバー検証マネージャーの使用

    1. 「カスタム設定の作成 (コード開発者用)」 を選択し、 「次へ」をクリックします。
    2. 選択 全リストから [個々の設定を選択] を選択します
    3. [特別プール] を選択 (チェック) します。

    特別プール機能も標準設定に含まれています。 この機能を使用するには、ドライバー検証ツール マネージャーで、 [標準設定の作成]をクリックします。