次の方法で共有


UMDF ドライバーの読み込みに失敗する理由または UMDF デバイスの起動に失敗する理由の確認

UMDF ドライバーの読み込みに失敗する理由または UMDF デバイスの起動に失敗する理由を確認するには、次の手順を実行します。

  1. 次のファイルが正しいことを確認して、設定をチェックします。

    • ドライバーの INF ファイル。

      ChkINF ツールを使用して、ドライバーの INF ファイルを検証します。

    • %windir%\inf\setupapi.dev.log (Windows XP の場合は setupapi.log)、%windir%\setupact.log、および %windir%\temp\wudf_update.log の各ファイル。

  2. 設定に問題がなかった場合は、WDF Verifier コントロール アプリケーション (WdfVerifier.exe) を使用して、HostProcessDbgBreakOnStart レジストリ エントリを有効にします。HostProcessDbgBreakOnStart を有効にすると、デバイスのドライバー ホスト プロセス (WUDFHost.exe) が、WUDFHost.exe の開始直後からドライバー DLL の読み込みまでの間にデバッガーに割り込みます。

    HostProcessDbgBreakOnStart は、カーネル モード デバッガーではなくユーザー モード デバッガーで有効にする必要があります。カーネル モード デバッガーは、既定では、ユーザー モード モジュールの読み込みとアンロードの通知を受け取りません。したがって、遅延ブレークポイントを設定できません。

  3. ホストの開始を確認できない場合は、次の手順を実行してデバイスを正しく構成します。

    1. INF を通じてインストールしたすべてのドライバーが存在し、オペレーティング システムにコピーされていることを確認します。
    2. リフレクター (WUDFRd.sys とも呼ばれます) がデバイスのサービスでない場合は、サービスとなるドライバーにサービス エントリ ('sc qc foo' など) があり、そのドライバーが自動的に起動するように設定されていることを確認します。
  4. ドライバーのシンボルがシンボル パス (.sympath) にあることを確認します。

  5. 次の項目を 1 つずつ確認します。次の手順では、ドライバーが foo.dll であることを前提としています。

    1. ドライバーの DllMain ルーチンが呼び出されることを確認します (bu Foo!DllMain など)。
    2. ドライバー DLL を読み込む場合は、後続の手順のために、HostProcessDbgBreakOnDriverLoad レジストリ エントリも使用できます。HostProcessDbgBreakOnDriverLoad が設定されていると、ドライバー DLL が読み込まれた後に WUDFHost.exe がデバッガーに割り込みます。ドライバーの読み込みおよびデバイスの起動プロセスのこの時点では、ドライバー コードでブレークポイントを設定できるので、HostProcessDbgBreakOnDriverLoad はカーネル モード デバッガーでも使用できます。
    3. ドライバーの DllGetClassObject ルーチンが呼び出されることを確認します。ドライバーのクラス識別子 (ID) が正しいことを確認します。DllGetClassObject が正常に実行されており、ドライバー オブジェクトを返すことを確認します (bu Foo!DllGetClassObject など)。
    4. ドライバーの IDriverEntry::OnDeviceAdd メソッドが呼び出されることを確認します。このメソッドによってデバイスが作成され、制御が正常に戻ることを確認します (bu Foo!CMyDriver::OnDeviceAdd など)。
    5. ドライバーの IPnpCallbackHardware::OnPrepareHardware メソッドまたは IPnpCallback::OnD0Entry メソッドが呼び出されることを確認します。このメソッドから制御が正常に戻ることを確認します (bu Foo!CMyDevice::OnPrepareHardware または Foo!CMyDevice::OnD0Entry など)。
    6. 上記の操作がそれぞれ正常に実行されても、後続の操作が実行されない場合は、次の項目をチェックする必要があります。
      1. ユーザー モード スタックでドライバーの上位および下位にあるすべてのドライバーでもこれらの操作が正常に実行されることを確認します。
      2. ドライバーの下位にあるカーネル スタックで IRP_MJ_PNP IRP と IRP_MN_START_DEVICE IRP が正常に完了されることを確認します。