Share via


低リソースのシミュレーション

低リソース シミュレーション オプション (Windows 8.1 では ランダム化低リソース シミュレーション と呼ばれます) がアクティブな場合、ドライバー検証ツールは、ドライバーがメモリ不足のコンピューターで実行されていた場合に発生する可能性があるドライバーのメモリ割り当てのランダム なインスタンスに失敗します。 これにより、メモリ不足やその他のリソース不足の状況に適切に応答するドライバーの機能がテストされます。

低リソース シミュレーション テストでは、 ExAllocatePoolWithXXXMmGetSystemAddressForMdlSafeMmProbeAndLockPagesMmMapLockedPagesSpecifyCacheMmMapIoSpace など、いくつかの異なる関数の呼び出しによって要求された割り当てが失敗します。

Windows Vista 以降、低リソース シミュレーション テストでは、 IoAllocateIrpIoAllocateMdlIoAllocateWorkItemIoAllocateErrorLogEntryMmAllocateContiguousMemoryMmAllocateContiguousMemorySpecifyCacheMmAllocatePagesForMdlMmAllocatePagesForMdlEx にもエラーが挿入されます。 さらに、Windows Vista 以降では、低リソース シミュレーションが有効になっている場合、 Alertable パラメーターを TRUE に設定して KeWaitForMultipleObjects または KeWaitForSingleObject を呼び出すと、特権のないプロセスのコンテキストで実行しているときにSTATUS_ALERTEDを返すことができます。 これにより、同じ非特権アプリケーション内の別のスレッドから発生する可能性のあるスレッド アラートがシミュレートされます。

低リソース シミュレーション テストでは、次の GDI 関数にもエラーが挿入されます。 EngAllocMem, EngAllocUserMem, EngCreateBitmap, EngCreateDeviceSurface, EngCreateDeviceBitmap, EngCreatePalette, EngCreateClip, EngCreatePath, EngCreateWnd, EngCreateDriverObj, BRUSHOBJ_pvAllocRbrush, および CLIPOBJ_ppoGetPath.

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

Windows 8.1 以降では、低リソース シミュレーション オプションも、MmAllocateNodePagesForMdlEx の呼び出しによって要求された割り当てに失敗します。 さらに、一部の関数では、ドライバー検証ツールによって、割り当てられたメモリにランダム なパターンが入力されるようになりました。 ただし、関数が初期化されていないメモリを返す場合に限ります。 次のような関数があります。

低リソース シミュレーション用のカスタム 設定

Windows Vista 以降のバージョンの Windows では、次のカスタム設定を指定できます。

  • 特定の割り当てが失敗する確率。 既定値は 6% です。

  • 影響を受けるアプリケーション。 この設定により、挿入された失敗した割り当てが、指定されたアプリケーションに制限されます。 既定では、すべての割り当てが影響を受ける。

  • 影響を受けるプール タグ 。 この設定により、挿入された障害が、指定されたプール タグを使用した割り当てに制限されます。 既定では、すべての割り当てが影響を受ける。

  • 割り当てが失敗するまでの遅延 (分単位)。 この遅延により、障害が挿入される前にシステムを起動して安定することができます。 既定値は 8 分です。

Windows Vista より前のオペレーティング システムでは、これらの設定をカスタマイズすることはできません。 オペレーティング システムでは既定値が使用されます。

再起動を伴わない低リソース シミュレーション

/volatile パラメーターを使用してコンピューターを再起動しなくても、Windows 2000 以降のバージョンの Windows で低リソース シミュレーションをアクティブ化できます。 設定はすぐに有効になりますが、コンピューターをシャットダウンまたは再起動すると失われます。

/volatile パラメーターを省略して、低リソース シミュレーションの設定をレジストリに格納することもできます。 これらの設定は、コンピューターを再起動した場合にのみ有効ですが、変更するまで有効のままです。

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

ドライバー検証ツール マネージャーまたは Verifier.exe コマンド ラインを使用して、1 つ以上のドライバーの低リソース シミュレーション オプションをアクティブにすることができます。 詳細については、 「ドライバー検証ツール オプションの選択」を参照してください 。

  • コマンド ラインで

    コマンド ラインでは、[低リソース シミュレーション] オプションは ビット 2 (0x4)で表されます。 低リソース シミュレーションをアクティブにするには、0x4のフラグ値を使用するか、フラグ値に0x4を追加します。 次に例を示します。

    verifier /flags 0x4 /driver MyDriver.sys
    

    このオプションは、次の起動時にアクティブになります。

    Windows Vista 以降のバージョンの Windows では、 /faults パラメーターまたはフラグ値 0x4 を使用して、低リソース シミュレーションをアクティブ化できます。 低リソース シミュレーションの設定を変更するには、 /faults を使用する必要があります。 次に例を示します。

    verifier /faults /driver MyDriver.sys
    

    Windows 2000 以降のバージョンの Windows では、 /volatile パラメーターをコマンドに追加することで、コンピューターを再起動せずに低リソース シミュレーションをアクティブ化および非アクティブ化することもできます。 次に例を示します。

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

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

    Windows Vista では、 /faults パラメーターを使用して、 /volatile パラメーターを使用して低リソース シミュレーションを表し、再起動せずに有効な設定を表すことができます。 設定変更が表示されます。 次に例を示します。

    0>  verifier /volatile /faults /adddriver MyDriver.sys
    New Low Resources Simulation options:
    
    - Use default fault injection probability.
    - Allocations using any pool tag can be failed.
    - Simulate low resources conditions in any application.
    
    The new settings are in effect until you restart this computer
    or change them again.
    
  • ドライバー検証ツール マネージャーの使用

    1. ドライバー検証ツール マネージャーを起動します。 コマンド プロンプト ウィンドウで、 検証ツール と入力します。
    2. [カスタム設定の作成 (コード開発者用)] を選択し、 [次へ] をクリックします。
    3. 全一覧から [個々の設定を選択]を選択します。
    4. [低リソース シミュレーション]を選択します。

設定のカスタマイズ (Windows Vista 以降)

Windows Vista 以降では、[低リソース シミュレーション] オプションの遅延、確率、アプリケーション、プール タグのプロパティの既定の設定を変更できます。 これらの設定は、ドライバー検証ツール マネージャーまたは Verifier.exe コマンド ラインを使用して変更できます。 詳細については、 「ドライバー検証ツール オプションの選択」を参照してください 。

コマンド ラインでは、これらの設定の構文は次のとおりです。

verifier [/volatile] /faults[Probability|PoolTags|Applications|DelayMins][/driver|DriverList]

注: カスタム設定パラメーターは、表示された順序で表示する必要があります。 値を省略した場合は、引用符を入力してその位置を保持します。

サブパラメータ

  • /faults

    ドライバー検証ツールの [低リソース シミュレーション] オプションを有効にします。 (カスタム設定サブパラメーターで /flags 0x4を使用することはできません)。

  • 確率

    Probability - ドライバーの検証ツール ユーティリティで特定の割り当てが失敗する確率を指定します。 10,000 回のうちドライバーの検証ツール ユーティリティが割り当てに失敗する回数を表す値 (10 進数または 16 進数形式) を入力します。 既定値の 600 は、600/10000 つまり 6% を意味します。

  • PoolTags

    ドライバーの検証ツール ユーティリティが失敗する可能性がある割り当てを、指定したプール タグを持つ割り当てに制限します。 ワイルドカード文字 (*) を使って、複数のプール タグを表すことができます。 複数のプール タグのリストを指定するには、タグをスペースで区切ります。 既定では、すべての割り当てが失敗する可能性があります。

  • アプリケーション

    ドライバーの検証ツールが失敗する可能性がある割り当てを、指定されたプログラムへの割り当てに制限します。 実行可能ファイルの名前を入力します。 プログラムのリストを指定するには、プログラム名をスペースで区切ります。 既定では、すべての割り当てが失敗する可能性があります。

  • DelayMins

    ドライバーの検証ツール ユーティリティが意図的に割り当てを失敗させない、起動後の時間 (分単位) を指定します。 この遅延により、ドライバーが読み込まれ、テストが開始される前にシステムが安定します。 値 (10 進数または 16 進数形式) を入力します。 既定値は 8 (分) です。

たとえば、次のコマンドは、プール タグ Tag1 と Fred、およびアプリケーション Notepad.exe に対して、確率 10% (1000/10000) と 5 分の遅延で低リソース シミュレーションを有効にします。

verifier /faults 1000 "Tag1 Fred" Notepad.exe 5

次のコマンドは、遅延を 10 分に延長することを除き、既定値で低リソース シミュレーションを有効にします。

verifier /faults "" "" "" 0xa

ドライバー検証ツール マネージャーの使用

  1. ドライバー検証ツール マネージャーを起動します。 コマンド プロンプト ウィンドウで、 検証ツール と入力します。

  2. [カスタム設定の作成 (コード開発者用)] を選択し、 [次へ] をクリックします。

  3. 全一覧から [個々の設定を選択]を選択します。

  4. [低リソース シミュレーション] を選択し、 [次へ] をクリックします。

  5. 必要に応じて、遅延、確率、アプリケーション、プール タグのプロパティの設定を変更します。

結果の表示

Driver Verifier Faults Injected グローバル カウンターを表示することで、ドライバー検証ツール がリソースの割り当てを意図的に失敗した 回数を監視できます。 このカウンターには、前回の起動以降にドライバー検証ツールが意図的に失敗したリソース割り当ての合計数が表示されます。

このカウンターは、ドライバー検証ツールのログ ファイル (/ログ)、コマンド ライン (/クエリ) またはドライバー検証ツール マネージャーで表示できます。 Windows 2000 では、グローバル カウンターを表示するには、 [グローバル カウンター] タブを選択します。新しいバージョンの Windows では、 [現在確認されているドライバー タスクに関する情報を表示する] を選択し、 [次へ] を 2 回押します。 詳細については、「グローバル カウンターの監視」を参照してください。

!verifier デバッガー拡張機能を使用して、意図的に失敗した割り当ての数と合計割り当ての数 (確率を計算するため) を表示することもできます。 次の例は、 !verifier の出力例を示しています。

この例では、 リソースが少ないランダムな API エラーを挿入する と、低リソース シミュレーションが有効になっていることを示します 。 [失敗したリソースの割り当て] は意図的に 失敗した割り当ての数を表し、 プールの割り当て試行回数 は割り当ての合計数を表します。

!verifier

Verify Level 5 ... enabled options are:
        Special pool
        Inject random low-resource API failures

Summary of All Verifier Statistics

RaiseIrqls                             0x2c671f
AcquireSpinLocks                       0xca1a02
Synch Executions                       0x10a623
Trims                                  0x0

Pool Allocations Attempted             0x862e0e
Pool Allocations Succeeded             0x8626e3
Pool Allocations Succeeded SpecialPool 0x768060
Pool Allocations With NO TAG           0x0
Pool Allocations Failed                0x34f
Resource Allocations Failed Deliberately   0x3f5

ドライバー検証ツールによって最近失敗した割り当てのスタック トレースを表示するには、カーネル デバッガーで !verifier 4 を使用します。

次の例は、 !verifier4 からの出力例を示しています。 既定では、 !verifier 4 では、最後に失敗した 4 つの割り当てからのスタック トレースが表示されますが、 Quantity パラメーターを使用して、表示されるスタック トレースの数を増やすことができます。 たとえば、!verifier 0x80では、最近失敗した 128 個の割り当てが表示されます。

この例では、検証ツールが ExAllocatePoolWithTag へのドライバーの呼び出しをインターセプトして 置き換えたことに注意してください。 ドライバーがクラッシュする最も一般的な原因の 1 つは、ドライバーがメモリを割り当てようとしたときに発生し、割り当て関数が返すポインターを使用してから NULL ではないことを確認します。

kd> !verifier 4
Resource fault injection history:
Tracker @ 8354A000 (# entries: 80, size: 80, depth: 8)

Entry @ 8354B258 (index 75)

    Thread: C2638220

    816760CB nt!VerifierExAllocatePoolWithTag+0x49
    A4720443 win32k!bDeleteAllFlEntry+0x15d
    A4720AB0 win32k!GreEnableEUDC+0x70
    A47218FA win32k!CleanUpEUDC+0x37
    A473998E win32k!GdiMultiUserFontCleanup+0x5
    815AEACC nt!MiDereferenceSession+0x74
    8146D3B4 nt!MmCleanProcessAddressSpace+0x112
    815DF739 nt!PspExitThread+0x603

Entry @ 8354B230 (index 74)

    Thread: 8436D770

    816760CB nt!VerifierExAllocatePoolWithTag+0x49
    A462141C win32k!Win32AllocPool+0x13
    A4725F94 win32k!StubGdiAlloc+0x10

低リソース シミュレーション テストの経験から、ほとんどのドライバーのクラッシュは、割り当てが最近失敗した場合に発生します。 上記の例では、クラッシュは win32k!GreEnableEUDC。 割り当てのパス内のコードを調べて、クラッシュの原因を見つけます。

!verifier の情報については、 Debugging Tools for Windows のドキュメントを参照してください。

コマンド ラインでレジストリの設定を表示するには、 /querysettings オプションを使用します。 次に例を示します。

C:\>verifier /querysettings
Special pool: Disabled
Pool tracking: Disabled
Force IRQL checking: Disabled
I/O verification: Disabled
Enhanced I/O verification: Disabled
Deadlock detection: Disabled
DMA checking: Disabled
Security checks: Disabled
Force pending I/O requests: Disabled
Low resources simulation: Enabled
IRP Logging: Disabled
Miscellaneous checks: Disabled

Low Resources Simulation options:

- Fault injection probability: 1/10000.
- Fail only allocations using pool tags: Tag1 Tag2.
- Simulate low resources conditions only in applications: test1.exe test2.exe.
- Boot time delay: 2 minutes.

Verified drivers:

blah.sys