UMDF ドライバーのデバッグを有効にする方法

次の構成を使用して、開発中に User-Mode Driver Framework (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 以降では既定で有効になっています。

  • UmdfHostProcessSharingProcessSharingDisabled に設定して、プールを無効にします。 詳細については、「 INF ファイルでの WDF ディレクティブの指定」を参照してください。

  • 既定では、UMDF デバイスが失敗すると、フレームワークは最大 5 回再起動を試みます。 DebugModeFlags を0x01に設定することで、自動再起動をオフにすることができます。 詳細については、「 WDF ドライバーをデバッグするためのレジストリ値」を参照してください。

  • コンピューターを再起動します。

  • UMDF ドライバーの問題をデバッグする場合は、 リフレクターがホスト プロセスを終了した理由UMDF ドライバーのクラッシュのデバッグを確認してください

WinDbg を使用して手動でアタッチする (ユーザー モード デバッグ)

ターゲット コンピューターでは、ドライバーをホストする WUDFHost のインスタンスに WinDbg を手動でアタッチできます。 アタッチすると、デバッガーに侵入し、ドライバーでブレークポイントを設定できます。

ドライバーの初期化は WUDFHost が読み込まれた直後に発生するため、初期化コードをデバッグする時間に手動でアタッチすることはできません。 代わりに、レジストリ値を設定して、ホストの初期化またはドライバーの読み込み時間にホスト プロセスが数秒待機するようにすることができます。 この遅延により、WUDFHost プロセスの正しいインスタンスに WinDbg をアタッチする時間が与えられます。

次の手順に従います。

  1. ターゲット コンピューターのレジストリで、 HostProcessDbgBreakOnStart または HostProcessDbgBreakOnDriverLoad を数秒に設定し、再起動します。
  2. ターゲット コンピューターで、管理者として WinDbg を開きます。
  3. [ ファイル ] メニューの [ プロセスにアタッチ] を選択します。 [実行可能ファイル別] を選択し、WUDFHost.exeという名前のすべてのプロセスを見つけます (存在しない可能性があります)。 WUDFHost.exeという名前のプロセスがある場合は、後で参照できるようにプロセス識別子を書き留めます。
  4. デバイス マネージャーで、ドライバーを有効にします。
  5. 手順 2. を繰り返し、WUDFHost.exeの新しいインスタンスを見つけます。 WUDFHost.exeの新しいインスタンスが表示されない場合は、[ キャンセル] をクリックし、[ プロセスにアタッチ] をもう一度選択します。 WUDFHost.exeの新しいインスタンスが見つかると、そのインスタンスを選択し、[ OK] をクリックします。

デバイス プールが使用中で、HostProcessDbgBreakOnDriverLoad レジストリ値を設定すると、他のドライバーの読み込みによりデバッガーが中断することがあります。 UMDF デバッグ モードを使用して、デバイス プールをオフにすることができます。

デバッグ モードを使用するには、Visual Studio で F5 オプションを使用するか、レジストリで DebugModeFlagsDebugModeBinaries の値を設定します。

UMDF レジストリ値の詳細については、 WDF ドライバー (KMDF と UMDF) をデバッグするためのレジストリ値を参照してください。

WinDbg を使用したホスト コンピューターからのリモート デバッグ (カーネル モード デバッグ)

リモート ホストからカーネル モード デバッグ セッションを確立し、ドライバーをホストしている Wudfhost のインスタンスに現在のプロセスを設定します。 リモート カーネル デバッガーからデバッグする場合は、 HostProcessDbgBreakOnDriverStart または HostProcessDbgBreakOnDriverLoad を 0x80000000 に設定してタイムアウトを指定しますが、カーネル デバッガーに分割できます。

次の手順を使用します:

  1. プールを無効にします。 DebugModeFlags を有効にして、DebugModeBinaries でドライバーを一覧表示する

  2. ドライバーが UMDF 1.11 以降を使用している場合、 HostFailKdDebugBreak は既定で有効になっています。 この手順をスキップします。

    ドライバーが UMDF 1.9 以前を使用している場合は、 HostFailKdDebugBreak を 1 に設定します。

  3. タイムアウトに関連する問題をデバッグする場合は、 HostProcessDbgBreakOnDriverStartHostProcessDbgBreakOnDriverLoad をオフにします。 ( HostProcessDbgBreakOnDriverStart または HostProcessDbgBreakOnDriverLoad が 0 以外の場合、ユーザー モード デバッガーがホスト プロセスにアタッチされているときにリフレクターがホストを終了しないように、フレームワークはタイムアウトを無効にします)。ドライバーの初期化コードをデバッグする必要がある場合は、これらの 2 つの値を使用する代わりに、ドライバーが読み込まれる前に WinDbg で次のコマンドを発行してみてください : sxe ld:MyDriver.dll (モジュールの読み込み時に中断)

  4. レジストリを変更した場合は再起動します。

  5. 上記の選択内容に応じて、ドライバーがターゲットに対して読み込みまたはアンロードされると、リモート カーネル デバッガーが中断されます。