UMDF ドライバーのデバッグを有効にする方法
開発時にユーザーモード ドライバー フレームワーク (UMDF) ドライバーをデバッグするには、次の構成を使用できます。 すべての構成には、ホストとターゲットの 2 つのマシンが含まれます。
- ドライバーをターゲットに手動でコピーします。 ターゲットでユーザーモード デバッグを実行します。 このシナリオでは、ターゲットで実行されているドライバー ホスト プロセスのインスタンスに手動でアタッチします。
- ドライバーをターゲットに手動でコピーし、ホストからカーネルモード デバッグを実行します。
カーネル デバッガーをアタッチした状態で、すべての UMDF ドライバーのテストと開発を行うことをお勧めします。
ベスト プラクティス
カーネル デバッガーをアタッチした状態で、すべての UMDF ドライバーのテストを行うことをお勧めします。
推奨される設定は、次のとおりです。 これらは手動で設定することも、WDK の WDF 検証ツール コントロール アプリケーション (WDFVerifier.exe) ツールを使用して、これらの設定を表示または変更することもできます。
WUDFHost.exe でアプリケーション検証ツールを有効にする:
AppVerif –enable Heaps Exceptions Handles Locks Memory TLS Leak –for WudfHost.exe
例外が発生した場合、アプリケーション検証ツールはデバッガーに診断メッセージを送信し、中断します。
カーネルモード デバッグ セッションを使用している場合は、ドライバー ホスト プロセスを終了する前にリフレクターがカーネルモード デバッガーを起動するように HostFailKdDebugBreak を設定します。 この設定は、Windows 8以降、既定で有効になっています。
UmdfHostProcessSharing を ProcessSharingDisabled に設定してプールを無効にします。 詳細については、「INFファイル での WDF ディレクティブの指定」を参照してください。
既定では、UMDF デバイスが失敗すると、フレームワークは最大 5 回再起動を試みます。 DebugModeFlags を 0x01 に設定することで、自動再起動をオフにすることができます。 詳しくは、Registry Values for Debugging WDF Driversをご参照ください。
コンピューターを再起動します。
UMDF ドライバーの問題をデバッグする場合は、「リフレクターがホスト プロセスを終了した理由の特定」と「UMDF ドライバーのクラッシュのデバッグ」を確認してください
WinDbg を使用して手動でアタッチする (ユーザーモード デバッグ)
ターゲット コンピューターで、ドライバーをホストする WUDFHost のインスタンスに WinDbg を手動でアタッチできます。 アタッチすると、デバッガーが起動され、ドライバーにブレークポイントを設定できます。
ドライバーの初期化は WUDFHost が読み込まれた直後に発生するため、初期化コードをデバッグするために手動で時間内にアタッチすることはできません。 代わりに、レジストリ値を設定して、ホストの初期化時またはドライバーの読み込み時にホスト プロセスが数秒待機するようにすることができます。 この遅延により、WINDbg を WUDFHost プロセスの正しいインスタンスにアタッチする時間が与えられます。
次のステップを実行します。
- ターゲット コンピューターのレジストリで、HostProcessDbgBreakOnStart または HostProcessDbgBreakOnDriverLoad を数秒に設定し、再起動します。
- ターゲット コンピューターで、WinDbg を管理者として起動します。
- [ファイル] メニューの [プロセスにアタッチ]をクリックします [実行可能ファイル別] を選択し、WUDFHost.exe という名前のすべてのプロセスを見つけます (存在しない可能性があります)。 WUDFHost.exeという名前のプロセスがある場合は、後で参照できるようにプロセス識別子を書き留めます。
- デバイス マネージャーで、ドライバーを有効にします。
- 手順 2 を繰り返し、WUDFHost.exeの新しいインスタンスを見つけます。 WUDFHost.exeの新しいインスタンスが表示されない場合は、[キャンセル] をクリックし、[プロセスにアタッチ] をもう一度選択します。 WUDFHost.exe の新しいインスタンスが見つかったら、そのインスタンスを選択し、[OK] をクリックします。
デバイス プールが使用中で、HostProcessDbgBreakOnDriverLoad レジストリ値を設定すると、他のドライバーの読み込みによってデバッガーが中断することがあります。 UMDF デバッグ モードを使用して、デバイス プールをオフにすることができます。
デバッグ モードを使用するには、Visual Studio で F5 オプションを使用するか、レジストリで DebugModeFlags と DebugModeBinaries の値を設定します。
UMDF レジストリ値の詳細については、「WDF ドライバー (KMDF および UMDF) をデバッグするためのレジストリ値」を参照してください。
WinDbg を使用したホスト コンピューターからのリモート デバッグ (カーネル モード デバッグ)
リモート ホストからカーネルモード デバッグ セッションを確立し、現在のプロセスを、ドライバーをホストしている Wudfhost のインスタンスに設定します。 リモート カーネル デバッガーからデバッグする場合は、HostProcessDbgBreakOnDriverStart または HostProcessDbgBreakOnDriverLoad を 0x80000000 に設定してタイムアウトを指定せずにカーネル デバッガーを起動できます。
次の手順に従います:
プールの無効化 DebugModeFlags を有効にして DebugModeBinaries でドライバーを一覧表示します
ドライバーが UMDF 1.11 以降を使用している場合、HostFailKdDebugBreak は既定で有効になっています。 この手順をスキップします。
ドライバーで UMDF 1.9 以前を使用している場合は、HostFailKdDebugBreak を 1 に設定します。
タイムアウトに関連する問題をデバッグする場合は、HostProcessDbgBreakOnDriverStart と HostProcessDbgBreakOnDriverLoad をオフにします。 (HostProcessDbgBreakOnDriverStart または HostProcessDbgBreakOnDriverLoad が 0 以外の場合、ユーザーモード デバッガーがホスト プロセスにアタッチされている間に、リフレクターがホストを終了しないように、フレームワークはタイムアウトを無効にします)。ドライバーの初期化コードをデバッグする必要がある場合は、これら 2 つの値を使用する代わりに、ドライバーが読み込まれる前に WinDbg で sxe ld:MyDriver.dll コマンドを発行してみてください (モジュールの読み込み時に中断)
レジストリを変更した場合は再起動します。
上記で選択した内容に応じて、ドライバーがターゲットで読み込まれたりアンロードされたりすると、リモート カーネル デバッガーが起動しれます。