トレーニング
モジュール
Troubleshoot device driver failures - Training
This module focuses on the role of device drivers and troubleshooting problems that pertain to them.
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
この記事では、クライアント ドライバーが特定の障害ケースをテストできるようにする、USB 3.0 ドライバー スタックの USB クライアント ドライバー検証機能について説明します。
USB クライアント ドライバー検証ツールは、Windows 8 に含まれる USB 3.0 ドライバー スタックの機能です。 検証ツールが有効になると、USB ドライバー スタックが失敗するか、クライアント ドライバーによって実行される特定の操作が変更されます。 これらのエラーは、見つけにくいエラー状態をシミュレートし、後で望ましくない結果を招く可能性があります。 シミュレートされた障害により、ドライバーが障害に適切に対処できることを確認する機会が得られます。 クライアントは、エラー処理コードを通じてエラーに対処することも、別のコード パスを実行することもできます。
たとえば、クライアント ドライバーは、一括エンドポイントの静的ストリームを介して I/O 操作をサポートします。 検証ツールを使用すると、さまざまなホスト コントローラーでサポートされているストリームの数に関係なく、ドライバーのストリーム ロジックが動作することを確認できます。 このシナリオをシミュレートするには、UsbVerifierStaticStreamCountOverride 設定を使用します (後で説明)。 ドライバーが USBD_QueryUsbCapability を呼び出して、ホスト コントローラーがサポートする静的ストリームの最大数を決定するたびに、ルーチンは異なる値を返します。
重要
USB クライアント ドライバー検証ツールは、さまざまな xHCI コントローラーに対してのみドライバーをテストします。 チェーンされた MDL サポートの欠如など、固有の 2.0 コントローラー動作の一部をシミュレートします。 ただし、クライアント ドライバーは USB 2.0 コントローラーでテストする必要があり、このツールをコントローラーの代替として使用しないことをお勧めします。
Windows ハードウェア ラボ キット (HLK) テストは、システム、USB ホスト コントローラー、ハブ、デバイスの追加のテストに使用できます。 これらのテストでは、基本的なデバイス機能、信頼性、および Windows との互換性について説明します。 詳細については、「USB の Windows ハードウェア ラボ キット (HLK) テスト」を参照してください。
USB クライアント ドライバー検証ツールを使用するには、Windows 8 を実行しているターゲット コンピューターでそれを有効にします。 ターゲット コンピューターには、USB デバイスが接続されている xHCI コントローラーが必要です。
USB クライアント ドライバー検証ツールは、クライアント ドライバーのドライバー検証ツールを有効にすると自動的に有効になります。 または、このレジストリ エントリを設定して、検証ツールを有効にすることもできます。
注意
Windows Driver Foundation (WDF) 検証ツール コントロール アプリケーション (WdfVerifier.exe) を有効にしても、USB クライアント ドライバー検証ツールは自動的に有効になりません。
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
services
<Client Driver>
Parameters
UsbVerifierEnabled (DWORD)
UsbVerifierEnabled レジストリ エントリは DWORD 値を受け取ります。 UsbVerifierEnabled が 1 の場合、USB クライアント ドライバー検証ツールが有効になります。0 では無効になります。 クライアント ドライバーでドライバー検証ツールが有効で、 UsbVerifierEnabled が 0 の場合、USB クライアント ドライバー検証ツールは無効になります。
検証ツールが有効になっている場合、USB ドライバー スタックは、クライアント ドライバーが割り当てる USBD_xxxUrbAllocate ルーチンを呼び出すことによって URB を継続的に追跡します (USB ルーチンを参照)。 クライアント ドライバーが URB をリークした場合、USB ドライバー スタックはその情報を使用して、ドライバー検証ツールによるバグチェックを実行します。 その場合、!usbanalyze -v コマンドを使用してリークの原因を特定します。
さらに、オプションで、特定のルーチンを変更または失敗するように USB クライアント ドライバー ベリファイアを構成し、ルーチンが失敗する頻度を指定できます。 検証ツールを構成するには、次のようにレジストリ エントリを設定します。
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
services
<Client driver>
Parameters
<USB client driver verifier setting> (DWORD)
<USB クライアント ドライバー検証ツール設定>レジストリ エントリは、DWORD 値を受け取ります。 設定を追加、変更、または削除する場合は、設定を適用するために、システムでデバイスを再列挙する必要があります。
次の表に、<USB クライアント ドライバー検証ツール>の設定で使用できる値を示します。 設定は、services キーで指定されたクライアント ドライバーに適用されます。
USB クライアント ドライバー検証ツールの設定 | 次の可能な値のいずれかを選択します。 | シミュレートに使用... |
---|---|---|
UsbVerifierFailRegistration クライアント ドライバーによる次のルーチンの呼び出しは失敗します。 |
|
クライアント ドライバーの登録エラー。 クライアント ドライバーの初期化タスクの 1 つは、それ自体を基礎となるドライバー スタックに登録することです。 登録は、後続のいくつかの呼び出しで必要となります。 たとえば、クライアント ドライバーは登録のために USBD_CreateHandle を呼び出します。 ドライバーは、ルーチンが常に STATUS_SUCCESS を返すと想定し、失敗を処理するコードを実装していないとします。 ルーチンがエラー NTSTATUS コードを返した場合、ドライバーは誤ってエラーを無視し、無効な USBD ハンドルを使用して後続の呼び出しを続行する可能性があります。 この設定を使用すると、失敗したコード パスをテストできるように、呼び出しを失敗させることができます。 登録が失敗した場合に予想されるクライアント ドライバーの動作:
|
UsbVerifierFailChainedMdlSupport 呼び出し元が CapabilityType パラメーターに GUID_USB_CAPABILITY_CHAINED_MDLS を渡すと、クライアント ドライバーのこれらのルーチンの呼び出しが失敗します。 |
|
チェーンされた MDL をサポートしていないホスト コントローラーとのコミュニケーション。 クライアント ドライバーがチェーンされた MDL (MDL を参照) を送信するには、USB ドライバー スタックとホスト コントローラーでサポートされている必要があります。 この設定を使用すると、クライアント ドライバーが連鎖 MDL 要求をサポートしていないホスト コントローラーに接続されているデバイスに送信するときに実行されるコードをテストできます。 ホスト コントローラーがチェーンされた MDL をサポートしているかどうかに関係なく、呼び出しは失敗します。 USB ドライバー スタックでのチェーンされた MDL のサポートの詳細については、「チェーンされた MDL を送信する方法」を参照してください。 ホスト コントローラーがチェーン MDL をサポートしていない場合に予期されるクライアント ドライバーの動作:
|
UsbVerifierFailStaticStreamsSupport 呼び出し元が CapabilityType パラメーターに GUID_USB_CAPABILITY_STATIC_STREAMS を渡すと、クライアント ドライバーのこれらのルーチンの呼び出しが失敗します。 |
|
静的ストリームをサポートしていないホスト コントローラーとのコミュニケーション。 クライアント ドライバーが一括エンドポイントの静的ストリームを通じて I/O 転送を送信するには、ホスト コントローラーがストリームをサポートしている必要があります。 ストリームをサポートしていないホスト コントローラーにデバイスが接続されており、ドライバーがストリーム I/O 転送を実行しようとすると、それらの転送は失敗します。 この設定を使用すると、このようなエラーが発生した場合にコードをテストできます。 ホスト コントローラーが静的ストリームをサポートしていない場合に予期されるクライアント ドライバーの動作:
|
UsbVerifierStaticStreamCountOverride クライアントが GUID_USB_CAPABILITY_STATIC_STREAMS を使用してこれらのルーチンを呼び出すときに OutputBuffer パラメーターで受け取った値を変更します。 OutputBuffer 値は、ホスト コントローラーがサポートする静的ストリームの最大数を示します。 |
|
さまざまなホスト コントローラーとのコミュニケーション。それぞれが異なる値の最大ストリーム数をサポートします。 この設定を使用すると、さまざまなホスト コントローラーでサポートされているストリームの数に関係なく、ドライバーのストリーム ロジックが動作することを確認できます。 I/O 転送に使用できるストリームの数は、ホスト コントローラーがサポートするストリームの数によって制限されます。 クライアント ドライバーで静的ストリームをサポートする方法については、「USB 一括エンドポイントで静的ストリームを開いたり閉じたりする方法」を参照してください。 ホスト コントローラーがサポートするストリームがエンドポイントよりも少ない場合に予期されるクライアント ドライバーの動作:
|
UsbVerifierFailEnableStaticStreams クライアント ドライバーのオープン静的ストリーム要求 (URB_FUNCTION_OPEN_STATIC_STREAMS) が失敗します。 |
注:USBD_QueryUsbCapability または WdfUsbTargetDeviceQueryUsbCapability への以前の呼び出しが失敗した場合、オープン静的ストリーム要求は失敗します。 |
静的ストリームをサポートしているが、他の理由により要求が失敗するホスト コントローラーとのコミュニケーション。 たとえば、デバイスはストリームをサポートするホスト コントローラーに接続されています。 クライアント ドライバーは、ホスト コントローラーでサポートされているストリームの最大数を超える数 (開くストリームの数) を含むオープン ストリーム要求を送信します。 USB ドライバー スタックは、このような要求に失敗します。 この設定を使用すると、オープン ストリーム要求エラーのエラー処理コードをテストできます。 オープンストリーム要求が失敗した場合に予想されるクライアント ドライバーの動作:
|
トレーニング
モジュール
Troubleshoot device driver failures - Training
This module focuses on the role of device drivers and troubleshooting problems that pertain to them.