确定 UMDF 驱动程序无法加载或 UMDF 设备无法启动的原因

本主题介绍在 UMDF 驱动程序加载失败或关联设备无法启动时可以使用的故障排除步骤。

可以将以下技术用于 UMDF 版本 1 和 2 驱动程序。

  1. 通过确保以下文件正确检查设置:

    • 驱动程序的 INF 文件。

      使用 InfVerif 工具验证驱动程序的 INF 文件。

    • Windows XP 上的 %windir%\inf\setupapi.dev.log (setupapi.log) 、%windir%\setupact.log 和 %windir%\temp\wudf_update.log 文件。

  2. 如果未发现任何安装问题,请使用 WDF 验证程序控制应用程序 (WdfVerifier.exe) 启用 HostProcessDbgBreakOnStart 注册表项。 通过启用 HostProcessDbgBreakOnStart,将使设备的驱动程序主机进程 (WUDFHost.exe) 在启动WUDFHost.exe后不久,但在加载驱动程序 DLL 之前中断到调试器中。

    应使用用户模式调试器而不是内核模式调试器启用 HostProcessDbgBreakOnStart 。 默认情况下,内核模式调试器不接收用户模式模块加载和卸载通知。 因此,无法设置延迟的断点。

  3. 如果未看到主机启动,请执行以下步骤以正确配置设备:

    1. 确保通过 INF 安装的所有驱动程序都存在,并且已复制到操作系统。
    2. 如果反射器 (也称为WUDFRd.sys) 不是设备上的服务,请确保驱动程序(即为服务)具有服务条目 (,例如,“sc qc foo”) 并且设置为自动启动。
  4. 确保驱动程序的符号位于符号路径 (即 .sympath) 。

  5. 一次验证一个以下项。 在以下步骤中,假设驱动程序foo.dll:

    1. 验证驱动程序的 DllMain 例程是否 (例如 bu Foo!DllMain) 。

    2. 如果驱动程序 DLL 确实加载,则对于后续步骤,还可以使用 HostProcessDbgBreakOnDriverLoad 注册表项。 设置 HostProcessDbgBreakOnDriverLoad 会导致WUDFHost.exe在加载驱动程序 DLL 后进入调试器。 HostProcessDbgBreakOnDriverLoad 还可以与内核模式调试器一起使用,因为此时在驱动程序加载和设备启动过程中,可以在驱动程序代码中设置断点。

    3. 此步骤仅适用于 UMDF 版本 1 驱动程序。 验证是否已调用驱动程序的 DllGetClassObject 例程。 验证驱动程序的类标识符 (ID) 是否正确。 验证 DllGetClassObject 是否成功运行并返回驱动程序对象 (例如 bu Foo!DllGetClassObject) 。

    4. 对于 UMDF 版本 1,请验证是否已调用驱动程序的 IDriverEntry::OnDeviceAdd 方法。 验证 方法是否创建设备并成功返回 (例如 bu Foo!CMyDriver::OnDeviceAdd) 。

      对于 UMDF 版本 2,请验证是否已调用驱动程序的 EvtDriverDeviceAdd 函数。 验证函数是否创建设备并成功返回 (例如 bu Foo!MyDriverDeviceAdd) 。

    5. 对于 UMDF 版本 1,请验证是否调用了驱动程序的 IPnpCallbackHardware::OnPrepareHardwareIPnpCallback::OnD0Entry 方法。 验证方法是否成功返回 (例如 bu Foo!CMyDevice::OnPrepareHardware 或 Foo!CMyDevice::OnD0Entry) 。

      对于 UMDF 版本 2,请验证是否已调用驱动程序的 EvtDevicePrepareHardwareEvtDeviceD0Entry 函数。 验证函数是否成功返回 (例如 bu Foo!MyDevicePrepareHardware 或 Foo!MyDeviceD0Entry) 。

    6. 如果前面的每个操作都成功运行,但后面的操作未运行,则应检查以下项:

      1. 验证用户模式堆栈中驱动程序上方和下方的每个驱动程序是否也成功执行这些操作。
      2. 验证驱动程序下面的内核堆栈是否已成功完成 IRP_MJ_PNPIRP_MN_START_DEVICE IRP。