メモリの破損は、一般的なドライバーの問題です。 ドライバーエラーは、発生したエラーの後に長時間にわたってクラッシュを引き起こす可能性があります。 これらのエラーの中で最も一般的なのは、既に解放されているメモリにアクセスし、 n バイトを割り当ててから n+1 バイトにアクセスすることです。
メモリの破損を検出するために、ドライバー検証ツールは、特別なプールからドライバー メモリを割り当て、そのプールの不正なアクセスを監視できます。 特別なプールのサポートは、 ExAllocatePoolWithTag などのカーネル モードのシステム提供ルーチンと、 EngAllocMem などの GDI システム提供ルーチンにも提供されます。
配置別の特別なプール
特別なプールの 2 つのアラインメントを使用できます。
- [開始の確認] アラインメントは、アクセス アンダーランの検出に適しています。
- Verify End アラインメントは、アクセス オーバーランの検出に適しています。
[開始の確認] オプションと [終了の確認] オプションの使用方法の詳細については、「オーバーランとアンダーランの検出」を参照してください。 メモリ破損の大部分は、アンダーランではなくてオーバーランが原因であることに注意してください。
特別なプール機能がアクティブで 、[終了の確認 ] が選択されている場合、ドライバーによって要求された各メモリ割り当てが個別のページに配置されます。 ページの末尾にメモリを揃えるために、割り当てがページに収まるようにする可能な限り最大のアドレスが返されます。 ページの前の部分は、特殊なパターンで記述されています。 前のページと次のページはアクセス不可としてマークされます。
ドライバーが割り当ての終了後にメモリにアクセスしようとすると、ドライバー検証ツールはすぐにこれを検出し、 バグ チェック 0xCDを発行します。 ドライバーがバッファーの先頭の前にメモリに書き込む場合、これは (おそらく) パターンを変更します。 バッファーが解放されると、ドライバー検証ツールは変更を検出し、 バグ チェック 0xC1を発行します。
ドライバーがバッファーを解放した後に読み取りまたは書き込みを行うと、ドライバー検証ツールは バグ チェック 0xCCを発行します。
[開始の確認] が選択されている場合、メモリ バッファーはページの先頭に配置されます。 この設定では、アンダーランによって即時のバグ チェックが発生し、オーバーランによってメモリが解放されたときにバグ チェックが発生します。 それ以外の場合、このオプションは [ 終了の確認 ] オプションと同じです。
オーバーランエラーはアンダーランエラーよりもはるかに一般的であるため、Verify End が既定のアラインメントです。
個々のメモリ割り当ては、これらの設定をオーバーライドし、優先順位パラメーターを XxxSpecialPoolOverrun または XxxSpecialPoolUnderrun に設定して ExAllocatePoolWithTagPriority を呼び出すことによって、その配置を選択できます。 (このルーチンは、特殊プール機能をアクティブ化または非アクティブ化したり、通常のプールから割り当てられないメモリ割り当てのために特殊プールを要求したりすることはできません。このルーチンから制御できるのは、アラインメントだけです)。
Windows 7 以降のバージョンの Windows オペレーティング システムでは、特別なプール オプションは、次のカーネル API を使用して割り当てられたメモリをサポートします。
I/O 要求パケット (IRP) データ構造を割り当てることができる IoAllocateIrp およびその他のルーチン
RtlAnsiStringToUnicodeString およびその他のランタイム ライブラリ (RTL) 文字列ルーチン
プール タグまたは割り当てサイズ別の特別なプール
ドライバー検証ツールの特別なプール機能に加えて、指定した ドライバーによる割り当ての特別なプールを要求する、特別なプールを使用する方法は他に 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 デバッグ」を参照してください。
特別なプール オプションのアクティブ化
ドライバー検証ツール マネージャーまたは Verifier.exe コマンド ラインを使用して、1 つ以上のドライバーの特別なプール機能をアクティブ化できます。 詳細については、「 ドライバー検証ツールオプションの選択」を参照してください。
注
プール タグまたは割り当てサイズによって特別なプール機能をアクティブ化するか、または Verify Start (detect underruns) と Verify End (detect overruns) アライメントを設定するには、 グローバル フラグ ユーティリティを使用します。これらの配置設定は、すべての特別なプール割り当てに適用されます。
コマンド ラインで
コマンド ラインでは、[特別なプール] オプションは ビット 0 (0x1) で表されます。 特殊プールをアクティブにするには、0x1のフラグ値を使用するか、フラグ値に0x1を追加します。 例えば次が挙げられます。
verifier /flags 0x1 /driver MyDriver.sysこの機能は、次の起動時にアクティブになります。
また、 /volatile パラメーターをコマンドに追加することで、コンピューターを再起動せずに特殊プールをアクティブ化および非アクティブ化することもできます。 例えば次が挙げられます。
verifier /volatile /flags 0x1 /adddriver MyDriver.sysこの設定はすぐに有効ですが、コンピューターをシャットダウンまたは再起動すると失われます。 詳細については、「 揮発性設定の使用」を参照してください。
特別なプール機能も標準設定に含まれています。 例えば次が挙げられます。
verifier /standard /driver MyDriver.sysドライバー検証ツール マネージャーの使用
- (コード開発者向けの) [カスタム設定の作成] を選択し、[次へ] をクリックします。
- 完全な一覧から [個々の設定を選択] を選択します。
- [特別なプール] を選択 (チェック) します。
特別なプール機能も標準設定に含まれています。 この機能を使用するには、ドライバー検証ツール マネージャーで、[ 標準設定の作成] をクリックします。