访问 WER 报表中的 UMDF 元数据

本主题介绍User-Mode驱动程序框架 (UMDF) 崩溃时操作系统创建的Windows 错误报告 (WER) 的位置和内容。

系统为三种不同的 UMDF 事件类型生成 WER 报告: WUDFHostProblemWUDFUnhandledExceptionWUDFVerifierFailure

当反射器终止驱动程序主机进程(有时由于超过 主机超时 阈值)时,系统会生成一个名为 Report.wer 的文件,其中包含 WER 信息。 具体而言,Report.wer 包含 UMDF 元数据,如果你尝试调试 UMDF 驱动程序而无法访问实时调试目标,这些元数据可能会很有用。

在 Windows 8.1 中,可以在 C:\ProgramData\Microsoft\Windows\WER\ReportQueue 目录中找到 Report.wer 文件。 在此目录中,打开最新的 NonCritical_HostProblem_* 文件夹并找到 Report.wer。

还可以使用以下 PowerShell 命令访问 UMDF 的 WER 报表:

get-winevent -providername "Windows Error Reporting" | where-object {$_.Message -like "*wudf*"} | format-list | out-file UmdfReports.txt

WUDFHostProblem 示例报表

下面是 WUDFHostProblem 类型的示例 UMDF WER 报告。 它是从上述 ReportQueue 目录获取的。 如果使用 PowerShell 检索报表,字段可能标记为 P0、P1、P2,而不是 Sig[0]、Sig[1]、Sig[2]。 否则,字段是相同的,并且包含相同的可能值。 此示例是从使用 OSR USB-FX2 硬件参考板的 WDK 示例之一生成的。

Sig[0].Name=EventClass
Sig[0].Value=HostProblem
Sig[1].Name=Problem
Sig[1].Value=HostTimeout
Sig[2].Name=DetectedBy
Sig[2].Value=2
Sig[3].Name=UMDFVersion
Sig[3].Value=6.3.9600
Sig[4].Name=ExitCode
Sig[4].Value=103
Sig[5].Name=Operation
Sig[5].Value=3
Sig[6].Name=Message
Sig[6].Value=11b00
Sig[7].Name=Status
Sig[7].Value=ffffffff
Sig[8].Name=HardwareId
Sig[8].Value=USB\VID_0547&PID_1002&REV_0000

WUDFHostProblem 字段

下表描述了 WUDFHostProblem 类型的报表中字段的可能值。

索引 名称
0 EventClass

框架将此值设置为 HostProblem

1 问题

此字段包含以下值之一:

  • HostFailure
  • SendFailure
  • HostTimeout
  • BadRequest
  • BadReply
  • HostFailure
  • 其他
  • HostDisconnect
  • LeakedHandle
  • InvalidInterruptState
  • IsrTimedOut
2 DetectedBy

包含以下枚举值之一:

cpp WdfComponentInvalid = 0, WdfComponentPlatform, WdfComponentReflector, WdfComponentDriverManager, WdfComponentHost, WdfComponentFramework, WdfComponentTest, WdfComponentMax
3 UMDFVersion

指定当前正在使用的 UMDF 库的版本。 请注意,如果用户执行了更新框架库的操作,则可能是操作系统附带的更高版本。

4 ExitCode

包含以下枚举值之一:

cpp WdfHostExit_StillActive = 0x103, WdfHostExit_CodeUnknown = 0x70000000, WdfHostExit_InternalDriverStopReported, WdfHostExit_InternalDriverStopReportFailed, WdfHostExit_ExternalTermination

WdfHostExit_StillActive 指示主机进程在框架创建错误报告时正在运行。

5 Operation

包含以下枚举值之一:

cpp WudfOperation_Invalid, WudfOperation_Init, WudfOperation_HostShutdown, WudfOperation_Pnp, WudfOperation_Cleanup, WudfOperation_Close, WudfOperation_Cancel, WudfOperation_IO, WudfOperation_Interrupt, WudfOperation_PoFx, WudfOperation_Other, WudfOperation_Max
6 消息

此字段的第一个数字始终为 1,表示操作涉及 IRP。 后续数字对分别表示 IRP 的 MajorFunctionMinorFunction

例如,在上面的示例报告中,此字段包含值 11b00。 这意味着操作是反射器代表驱动程序主机进程处理的 IRP,主要函数值为 IRP_MJ_PNP,次要函数值为 IRP_MN_START_DEVICE (1 = IRP 消息,1b = IRP_MJ_PNP,00 = IRP_MN_START_DEVICE) 。

7 状态

框架始终将 此值设置为 0xffffffff。

8 HardwareId

此字段包含与有问题的驱动程序关联的设备的硬件 ID。

WUDFUnhandledException 字段

下表描述了 WUDFUnhandledException 类型的报表中字段的可能值。

索引 名称
0 EventClass

框架将此值设置为 UnhandledException

1 组件

此字段包含以下值之一:

  • 无效
  • 平台
  • Reflector
  • DriverManager
  • 主机
  • 框架
  • 测试
2 ExceptionCode

发生异常的原因。 有关值列表,请参阅 EXCEPTION_RECORD

3 RelativeFaultingAddress

发生异常的地址。

4 CrashingModuleName 引发异常的驱动程序的名称。
5 CrashingFileVersion 驱动程序的框架版本。
6 LastDriverName 驱动程序堆栈中第一个非 UMDF 驱动程序组件的名称。
7 LastDriverVersion 驱动程序堆栈中第一个非 UMDF 驱动程序组件的版本号。
8 UMDFVersion

指定当前正在使用的 UMDF 库的版本。 请注意,如果用户执行了更新框架库的操作,则可能是操作系统附带的更高版本。

9 HardwareId

从 Windows 8 开始,硬件 ID 在单独的文件中提供。 在这种情况下,框架将此值设置为 单独转储

WUDFVerifierFailure 字段

下表描述了 WUDFVerifierFailure 类型的报表中字段的可能值。

索引 名称
0 EventClass

框架将此值设置为 VerifierFailure

1 FoundBy

框架将此值设置为 Framework

2 类别

此字段包含以下值之一:

  • 内部
  • 驱动程序
  • 调用方
  • 外部
  • UnhandledException
3 ErrorNumber 仅限内部使用。
4 位置 仅限内部使用。
5 驱动程序 失败的驱动程序模块的名称。
6 CallerAddress 开始生成报表的例程的地址。
7 UMDFVersion

指定当前正在使用的 UMDF 库的版本。 请注意,如果用户执行了更新框架库的操作,则可能是操作系统附带的更高版本。

8 HardwareId

从 Windows 8 开始,硬件 ID 在单独的文件中提供。 在这种情况下,框架将此值设置为 单独转储