检索设备实例的状态和问题代码

在 Windows Vista 和更高版本的 Windows 中, 统一设备属性模型 包括 设备状态属性问题代码属性。 统一设备属性模型使用 属性键 来表示这些属性。

Windows Server 2003、Windows XP 和 Windows 2000 不支持统一属性模型的属性键,也不支持表示这些属性的相应注册表项值。 但是,可以通过调用 CM_Get_DevNode_Status 函数来检索相应的信息。 为了保持与早期 Windows 版本的兼容性,Windows Vista 及更高版本还支持 CM_Get_DevNode_Status。 但是,应使用统一设备属性模型的属性键来访问设备属性。

此外,在Windows 8及更高版本的 Windows 中,还有一个问题状态属性。 此属性包含 一个 NTSTATUS 值,该值可能包含与设备上设置的问题代码相关的其他信息。 如果问题状态值为STATUS_SUCCESS,则在设备上设置问题代码时,没有与问题代码相关的其他信息可用。

有关如何使用属性键访问 Windows Vista 及更高版本中的设备驱动程序属性的信息,请参阅 访问 Windows Vista 和更高版本 (设备实例属性)

若要访问 Windows Server 2003、Windows XP 和 Windows 2000 上的设备实例的状态和问题代码,请调用 CM_Get_DevNode_Status 并提供以下参数:

  • pulStatus 设置为指向 ULONG 类型值的指针,该值接收为设备实例设置的状态位标志。 状态值可以是 Cfg.h 中定义的具有前缀“DN_”的位标志的任意组合。

  • pulProblemNumber 设置为指向 ULONG 类型值的指针,该值接收为设备实例设置的问题号。 问题编号是在 Cfg.h 中定义的前缀为“CM_PROB_”的常量之一。 pulStatus 中设置了DN_HAS_PROBLEM时,CM_Get_DevNode_Status设置问题编号。

  • dnDevInst 设置为要检索其状态和问题代码的设备实例句柄。

  • ulFlags 设置为零。

如果调用 CM_Get_DevNode_Status 成功, CM_Get_DevNode_Status 检索设备实例的请求状态和问题代码,并返回CR_SUCCESS。 如果函数调用失败, CM_Get_DevNode_Status 返回 Cfgmgr32.h 中定义的前缀为“CR_”的错误代码之一。

使用设备管理器查找设备的问题代码和问题状态

当设备出现问题时,设备管理器会在树视图中覆盖设备的图标,其中带有感叹号的黄色三角形。 通过右键单击设备并选择“属性”,将显示一个对话框,其中包含有关设备的详细信息。 问题代码显示在“ 常规 ”选项卡上的“ 设备状态 ”字段中。

问题状态”属性显示在设备管理器设备“详细信息”选项卡上的“属性”下拉列表中。

使用调试器查找设备的问题代码和问题状态

若要查看内核调试器中存在问题代码的所有设备,请使用 !devnode 0 21 扩展。 这还会显示设备上的 ProblemStatus。 例如:

0: kd> !devnode 0 21
Dumping IopRootDeviceNode (= 0x85d37e30)
DevNode 0x8ad6ab78 for PDO 0x81635c30
  InstancePath is "ROOT\DIINSTALLDRIVER\0003"
  ServiceName is "isolated"
  State = DeviceNodeRemoved (0x312)
  Previous State = DeviceNodeInitialized (0x302)
  Problem = CM_PROB_FAILED_ADD
  Problem Status = 0xc00000bb

还可以通过在DEVICE_NODE地址上发出 !devnode 来查看问题代码和问题状态:

0: kd> !devnode 0x8ad6ab78 
DevNode 0x8ad6ab78 for PDO 0x81635c30
  Parent 0x85d37e30   Sibling 0x8adee670   Child 0000000000   
  ...
  Problem = CM_PROB_FAILED_ADD
  Problem Status = 0xc00000bb

另请参阅