诊断并排除 KMDF 驱动程序安装故障
Updated: June 26, 2006
您在 Kernel-Mode Driver Framework (KMDF) 1.1 驱动程序安装过程中遇到过麻烦吗?下面是关于诊断驱动程序安装故障的一些建议,以及一些常见的错误和可能的解决方案。
安装错误日志
安装和设置中涉及的每个组件都把信息记录到日志文件中。您可以检查这些日志文件以获取关于 KMDF 和您的驱动程序的信息:
| • | KMDF 1.1 安装日志 (%windir%\wdf01001inst.log) 包含关于 KMDF 1.1 安装期间发生的事件和错误的信息。 |
| • | 安装程序操作日志 (%windir%\setupact.log) 包含来自 KMDF 共同安装程序的调试信息。 |
| • | SetupAPI 日志 (%systemroot%\setupapi.log) 包含每次驱动程序被安装到系统上时 SetupAPI 记录的信息。 |
您可以通过设置影响日志的注册表项来控制 SetupAPI 日志中每个事件的信息量。记录更多的信息通常有助于找到安装问题的根源。安装驱动程序期间发生的错误实际上可能是安装设备堆栈中其他地方的另一个驱动程序产生错误的结果。因此,为所有安装程序增加日志等级有时会很有用。
要控制为所有设备安装程序记录的信息量,请检查下列注册表子项的 LogLevel 条目的值:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
\Setup
如果这个子项不包含 LogLevel 条目,那么创建一个新的 REG_DWORD 值。然后将 LogLevel 条目的值设置为您首选的日志等级。
想要仅控制为您的驱动程序的安装程序记录的信息量,请检查下列注册表子键的值:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
\CurrentVersion\Setup\AppLogLevels
要为您的驱动程序启用详细日志,那么创建一个与安装程序具有相同文件名的条目并将该日志等级指定给该条目。例如:
MyDriverInstaller = 0x2000FFFF
最常用的日志等级如下:
| • | 0x00000000,指定默认的日志(没有任何特殊标志)。 |
| • | 0x00006060,记录大部分消息。但是,这个等级并不记录对匹配 INF 文件的搜索中的所有 INF 文件。 |
| • | 0x2000FFFF,指定应该记录所有内容并且在写入每条消息之后日志文件不应该被写到磁盘。这个等级被建议用于详细日志。 |
常见的 KMDF 安装错误
安装期间的致命错误
有几个问题会导致这种错误。要解决这个错误,请尝试下列步骤:
1. | 确保在 Microsoft Windows 的发布版本上使用发布版本的共同安装程序,在 Windows 的调试版本上使用调试版本的共同安装程序。 注意: 如果您以前收到了这种消息并且已经编辑您的 INF 文件来使用正确的共同安装程序,那么您还必须手动删除下列文件: %windir%\system32\wdfcoinstaller01001.dll 安装程序 API 不会覆盖此文件。 |
2. | 确保加密服务正在运行: | • | 右键单击我的电脑,然后单击管理。 | | • | 在计算机管理对话框中,通过单击加号 (+) 展开服务和应用程序文件夹,然后单击服务。 | | • | 在右侧的服务面板中,向下拉动滚动条并单击Cryptographic Services。 | | • | 在Cryptographic Services 的属性对话框的常规选项卡上,确保服务状态为已启动。 |
|
3. | 在 KMDF 版本 1.1 中,INF 文件的 Wdf 节只能包含一个 KmdfService 指令和一个 KmdfLibraryVersion 指令。(这是 KMDF 1.1 中的缺陷,将在以后的发布版本中修正。) 如果您使用单个 INF 来安装多个 KMDF 驱动程序(例如一个功能驱动程序和一个筛选器驱动程序),那么应该将应用于任何其他驱动程序的 KmdfService 和 KmdfLibraryVersion 指令注释掉。例如,下面的 INF 片断包含安装两个驱动程序的信息,从而包含两个 KmdfService 指令和两个 KmdfLibraryVersion 指令。在下面的例子中,应该将粗体显示的行注释掉来解决错误: [ToasterFilter.NT.Wdf] ;KmdfService = DevUpper, DevUpper_wdfsect KmdfService = wdffeatured, wdffeatured_wdfsect [DevUpper_wdfsect] KmdfLibraryVersion = 1.1 ;[wdffeatured_wdfsect] ;KmdfLibraryVersion = 1.1 |
4. | 如果前面的步骤不能解决问题,那么请检查 KMDF 1.1 安装日志 (%windir%\wdf01001inst.log),它包含的信息可以帮助您进行故障诊断。 |
错误代码 37
这种错误可以指示共同安装程序或 DriverEntry 例程出现问题。
如果在安装程序操作日志 (%windir%\setupact.log) 中显示下列消息之一,那么 DriverEntry 例程中的失败可能导致错误:
| • | 最终状态:error(0) 操作成功完成。 |
| • | GetLatestInstalledVersion 安装版本主版本号 0x1、次版本号 0x1 小于或等于最新的主版本号 0x1、从版本号 0x1,请求进行后续处理 |
| • | WdfCoInstaller:DIF_INSTALLDEVICE:后续处理 |
错误代码 37 在您将 KMDF 1.0 驱动程序更新到 KMDF 1.1 时也可能发生。如果在试图安装新驱动程序时现有的驱动程序已经被加载到内存,那么新的驱动程序尝试动态绑定到已经加载的 KMDF 1.0 运行时库。绑定失败,错误被记录到系统的事件日志中。(要查看系统事件日志,请单击开始、单击控制面板、双击管理工具、双击事件查看器,然后单击系统。)
错误代码 31
这种错误始终是由驱动程序中出现的问题引起的。确保 EvtDriverDeviceAdd 回调例程返回 STATUS_SUCCESS。
其他安装错误
根据安装程序操作日志 (%windir%\setupact.log) 中的条目,安装期间的大部分其他错误原因应该已经很明显了。
共同安装程序报告诸如 setupact.log 文件中的 [Wdf] 格式不正确等错误。例如:
WdfCoInstaller:ReadComponents:Error Non-existent wdf section Please refer to the Kmdf samples/documentation to add the Wdf Section
Setupact.log 文件还指示 INF 使用的主要和次要的 KMDF 版本。您应该会看到类似于下面的行:
ReadComponents setting the WdfSection for Driver Service Ramdisk using KMDF lib version Major 0x1, minor 0x1
主要和次要版本都应该是 1。如果您不更新 INF 文件来使用 KMDF 1.1 共同安装程序 (WdfCoInstaller01001.dll),日志文件会指示 INF 在使用版本 1.0。您还必须更新 KmdfLibraryVersion 指令来指定 1.1。
一些安装由于设备管理器使用过时的而不是更新的 INF 文件而失败。要避免这个问题,请执行下列操作之一:
| • | 从 %windir%\inf 文件夹中删除版本 1.0 的 oem*.inf 和 oem*.pnf 文件,从而使得错误的 INF 不可用。 |
| • | 指定新驱动程序的搜索路径,而不是允许设备管理器使用其默认值。 |
您应该做什么?
| • | 检查日志文件中关于驱动程序安装的信息。 |
| • | 设置 SetupAPI 日志等级来提供驱动程序安装的详细信息。 |
| • | 为 KMDF 版本和操作系统平台使用正确的 KMDF 共同安装程序。 |
| • | 使用正确版本的 INF 来安装驱动程序。 |
| • | 在 KMDF 1.1 使用的 INF 文件中,只指定一个 KmdfService 指令和一个 KmdfLibraryVersion 指令。 |
| • | 检查系统事件日志,以了解 KMDF 驱动程序动态绑定到库期间发生的错误。 |
更多信息:
白皮书:
构建、安装、测试和调试 KMDF 驱动程序方法简介
使用 SetupAPI 日志文件排除设备安装故障
Windows Driver Kit (WDK):
“安装基于框架的驱动程序”
MSDN:
使用 SetupAPI 日志