Поделиться через


Получение состояния и кода проблемы для экземпляра устройства

В 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, которое получает битовые флаги состояния, заданные для экземпляра устройства. Значением состояния может быть любое сочетание битовых флагов с префиксом "DN_", определенных в Cfg.h.

  • Задайте для pulProblemNumber указатель на значение типа ULONG, которое получает номер проблемы, заданный для экземпляра устройства. Номер проблемы является одной из констант с префиксом "CM_PROB_", определенных в Cfg.h. CM_Get_DevNode_Status задает номер проблемы, только если DN_HAS_PROBLEM задано в pulStatus.

  • Присвойте dnDevInst дескриптор экземпляра устройства устройству, для которого требуется получить код состояния и проблемы.

  • Задайте для ulFlags нулевое значение.

Если вызов CM_Get_DevNode_Status выполнен успешно, CM_Get_DevNode_Status извлекает запрошенное состояние и код проблемы для экземпляра устройства и возвращает CR_SUCCESS. Если вызов функции завершается сбоем, CM_Get_DevNode_Status возвращает один из кодов ошибок с префиксом "CR_", определенных в Cfgmgr32.h.

Использование диспетчер устройств для поиска кода проблемы и состояния проблемы для устройства

При возникновении проблемы с устройством диспетчер устройств наложит значок устройства в виде дерева желтым треугольником с восклицательным знаком. Щелкнув устройство правой кнопкой мыши и выбрав Свойства, откроется диалоговое окно с дополнительными сведениями об устройстве. Код проблемы отображается на вкладке Общие в поле Состояние устройства .

Свойство Состояние проблемы отображается в раскрывающемся списке Свойство на вкладке Сведения для устройства в диспетчер устройств.

Использование отладчика для поиска кода проблемы и состояния проблемы для устройства

Чтобы просмотреть все устройства с кодом проблемы в отладчике ядра, используйте расширение !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

Вы также можете просмотреть код проблемы и состояние проблемы, выпустив !devnode по адресу DEVICE_NODE:

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

См. также: