UMDF ドライバーの読み込み失敗または UMDF デバイスの起動失敗の理由の特定
このトピックでは、UMDF ドライバーの読み込みに失敗した場合、または関連付けられているデバイスの起動に失敗した場合に使用できるトラブルシューティング手順について説明します。
UMDF バージョン 1 と 2 の両方のドライバーで、次の手法を使用できます。
次のファイルが正しいことを確認して、セットアップを確認します。
ドライバーの INF ファイル。
InfVerif ツールを使用して、ドライバーの INF ファイルを検証します。
%windir%\inf\setupapi.dev.log (Windows XP の setupapi.log)、%windir%\setupact.log、%windir%\temp\wudf_update.log ファイル。
セットアップの問題が見つからない場合は、WDF 検証ツール コントロール アプリケーション (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 は、ドライバーの読み込みとデバイスの開始プロセスのこの時点で、ドライバー コードにブレークポイントを設定できるため、カーネルモード デバッガーでも使用できます。
この手順は、UMDF バージョン 1 ドライバーにのみ適用されます。 ドライバーの DllGetClassObject ルーチンが呼び出されていることを確認します。 ドライバーのクラス識別子 (ID) が正しいことを確認します。 DllGetClassObject が正常に実行され、ドライバー オブジェクト (例: bu Foo!DllGetClassObject) を返すことを確認します。
UMDF バージョン 1 の場合は、ドライバーの IDriverEntry::OnDeviceAdd メソッドが呼び出されていることを確認します。 メソッドがデバイスを作成し、正常に返されることを確認します (例: bu Foo!CMyDriver::OnDeviceAdd)。
UMDF バージョン 2 の場合は、ドライバーの EvtDriverDeviceAdd 関数が呼び出されていることを確認します。 関数がデバイスを作成し、正常に返されることを確認します (例: bu Foo!MyDriverDeviceAdd)。
UMDF バージョン 1 の場合は、ドライバーの IPnpCallbackHardware::OnPrepareHardware または IPnpCallback::OnD0Entry メソッドが呼び出されていることを確認します。 メソッドが正常に返されることを確認します (例: bu Foo!CMyDevice::OnPrepareHardware または Foo!CMyDevice::OnD0Entry)。
UMDF バージョン 2 の場合は、ドライバーの EvtDevicePrepareHardware または EvtDeviceD0Entry 関数が呼び出されていることを確認します。 関数が正常に返されることを確認します (例: bu Foo!MyDevicePrepareHardware または Foo!MyDeviceD0Entry)。
前の各操作が正常に実行されたが、その次の操作が実行されない場合は、次の項目をチェックする必要があります。
- ユーザーモード スタック内のドライバーの上下のすべてのドライバーも、これらの操作を正常に実行することを確認します。
- ドライバーの下のカーネル スタックによって、IRP_MJ_PNP および IRP_MN_START_DEVICE IRP が正常に完了したことを確認します。