UMDF ドライバーの読み込みに失敗する理由または UMDF デバイスの起動に失敗する理由の確認
UMDF ドライバーの読み込みに失敗する理由または UMDF デバイスの起動に失敗する理由を確認するには、次の手順を実行します。
次のファイルが正しいことを確認して、設定をチェックします。
ドライバーの INF ファイル。
ChkINF ツールを使用して、ドライバーの INF ファイルを検証します。
%windir%\inf\setupapi.dev.log (Windows XP の場合は setupapi.log)、%windir%\setupact.log、および %windir%\temp\wudf_update.log の各ファイル。
設定に問題がなかった場合は、WDF Verifier コントロール アプリケーション (WdfVerifier.exe) を使用して、HostProcessDbgBreakOnStart レジストリ エントリを有効にします。HostProcessDbgBreakOnStart を有効にすると、デバイスのドライバー ホスト プロセス (WUDFHost.exe) が、WUDFHost.exe の開始直後からドライバー DLL の読み込みまでの間にデバッガーに割り込みます。
HostProcessDbgBreakOnStart は、カーネル モード デバッガーではなくユーザー モード デバッガーで有効にする必要があります。カーネル モード デバッガーは、既定では、ユーザー モード モジュールの読み込みとアンロードの通知を受け取りません。したがって、遅延ブレークポイントを設定できません。
ホストの開始を確認できない場合は、次の手順を実行してデバイスを正しく構成します。
- INF を通じてインストールしたすべてのドライバーが存在し、オペレーティング システムにコピーされていることを確認します。
- リフレクター (WUDFRd.sys とも呼ばれます) がデバイスのサービスでない場合は、サービスとなるドライバーにサービス エントリ ('sc qc foo' など) があり、そのドライバーが自動的に起動するように設定されていることを確認します。
ドライバーのシンボルがシンボル パス (.sympath) にあることを確認します。
次の項目を 1 つずつ確認します。次の手順では、ドライバーが foo.dll であることを前提としています。
- ドライバーの DllMain ルーチンが呼び出されることを確認します (bu Foo!DllMain など)。
- ドライバー DLL を読み込む場合は、後続の手順のために、HostProcessDbgBreakOnDriverLoad レジストリ エントリも使用できます。HostProcessDbgBreakOnDriverLoad が設定されていると、ドライバー DLL が読み込まれた後に WUDFHost.exe がデバッガーに割り込みます。ドライバーの読み込みおよびデバイスの起動プロセスのこの時点では、ドライバー コードでブレークポイントを設定できるので、HostProcessDbgBreakOnDriverLoad はカーネル モード デバッガーでも使用できます。
- ドライバーの DllGetClassObject ルーチンが呼び出されることを確認します。ドライバーのクラス識別子 (ID) が正しいことを確認します。DllGetClassObject が正常に実行されており、ドライバー オブジェクトを返すことを確認します (bu Foo!DllGetClassObject など)。
- ドライバーの IDriverEntry::OnDeviceAdd メソッドが呼び出されることを確認します。このメソッドによってデバイスが作成され、制御が正常に戻ることを確認します (bu Foo!CMyDriver::OnDeviceAdd など)。
- ドライバーの IPnpCallbackHardware::OnPrepareHardware メソッドまたは IPnpCallback::OnD0Entry メソッドが呼び出されることを確認します。このメソッドから制御が正常に戻ることを確認します (bu Foo!CMyDevice::OnPrepareHardware または Foo!CMyDevice::OnD0Entry など)。
- 上記の操作がそれぞれ正常に実行されても、後続の操作が実行されない場合は、次の項目をチェックする必要があります。
- ユーザー モード スタックでドライバーの上位および下位にあるすべてのドライバーでもこれらの操作が正常に実行されることを確認します。
- ドライバーの下位にあるカーネル スタックで IRP_MJ_PNP IRP と IRP_MN_START_DEVICE IRP が正常に完了されることを確認します。