Получение состояния и кода проблемы для экземпляра устройства
В 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