Recuperar o status e o código do problema de uma instância de dispositivo

Em Windows Vista e versões posteriores do Windows, o modelo de propriedade do dispositivo unificado inclui uma propriedade de status do dispositivo e uma propriedade de código de problema. O modelo de propriedade do dispositivo unificado usa chaves de propriedade para representar essas propriedades.

Windows Server 2003, Windows XP e Windows 2000 não dão suporte às chaves de propriedades do modelo de propriedade unificada, nem dão suporte a valores de entrada do Registro correspondentes que representam essas propriedades. No entanto, as informações correspondentes podem ser recuperadas chamando a função CM_Get_DevNode_Status . Para manter a compatibilidade com versões anteriores do Windows, o Windows Vista e versões posteriores também dão suporte a CM_Get_DevNode_Status. No entanto, você deve usar as chaves de propriedade do modelo de propriedade do dispositivo unificado para acessar as propriedades do dispositivo.

Além disso, em Windows 8 e versões posteriores do Windows, também há uma propriedade de status do problema. Essa propriedade contém um valor NTSTATUS que pode conter informações adicionais relacionadas a um código de problema definido no dispositivo. Se o valor de status do problema for STATUS_SUCCESS, nenhuma informação adicional relacionada ao código do problema estava disponível quando o código do problema foi definido no dispositivo.

Para obter informações sobre como usar chaves de propriedade para acessar as propriedades do driver de dispositivo em Windows Vista e versões posteriores, consulte Acessando propriedades da instância do dispositivo (Windows Vista e posterior).

Para acessar o status e o código de problema de uma instância de dispositivo no Windows Server 2003, Windows XP e Windows 2000, chame CM_Get_DevNode_Status e forneça os seguintes parâmetros:

  • Defina pulStatus como um ponteiro para um valor do tipo ULONG que recebe os sinalizadores de bits de status definidos para uma instância de dispositivo. O valor de status pode ser qualquer combinação dos sinalizadores de bit com o prefixo "DN_" definido em Cfg.h.

  • Defina pulProblemNumber como um ponteiro para um valor do tipo ULONG que recebe o número de problema definido para uma instância de dispositivo. O número do problema é uma das constantes com o prefixo "CM_PROB_" definidas em Cfg.h. CM_Get_DevNode_Status atribui o número do problema somente se DN_HAS_PROBLEM estiver definido em pulStatus.

  • Defina dnDevInst como um handle de instância de dispositivo para o dispositivo para o qual recuperar o status e o código do problema.

  • Defina ulFlags como zero.

Se a chamada para CM_Get_DevNode_Status for bem-sucedida, CM_Get_DevNode_Status recuperará o status solicitado e o código de problema da instância do dispositivo e retornará CR_SUCCESS. Se a chamada de função falhar, CM_Get_DevNode_Status retornará um dos códigos de erro com o prefixo "CR_" definido no Cfgmgr32.h.

Usando Gerenciador de Dispositivos para localizar o código do problema e o status do problema para um dispositivo

Quando houver um problema com um dispositivo, o Gerenciador de Dispositivos sobreporá o ícone do dispositivo na exibição em árvore com um triângulo amarelo com um ponto de exclamação nele. Clicando com o botão direito do mouse no dispositivo e escolhendo Propriedades, uma caixa de diálogo aparecerá com mais informações sobre o dispositivo. O código de problema aparece na guia Geral , no campo Status do dispositivo .

A propriedade Status do problema aparece na lista suspensa Propriedade na guia Detalhes do dispositivo no Gerenciador de Dispositivos.

Usando o depurador para localizar o código do problema e o status do problema para um dispositivo

Para exibir todos os dispositivos que têm um código de problema no depurador de kernel, use a extensão !devnode 0 21 . Isso também mostra o ProblemStatus no dispositivo. Por exemplo:

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

Você também pode exibir o código do problema e o status do problema emitindo !devnode em um endereço 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

Consulte Também