Récupération du code d'état et de problème d'une instance d'appareil

Dans Windows Vista et les versions ultérieures de Windows, le modèle unifié de propriétés de périphérique inclut une propriété d’état du périphérique et une propriété de code de problème. Le modèle de propriété d’appareil unifié utilise des clés de propriété pour représenter ces propriétés.

Windows Server 2003, Windows XP et Windows 2000 ne prennent pas en charge les clés de propriété du modèle de propriété unifié, ni ne prennent pas en charge les valeurs d’entrée de Registre correspondantes qui représentent ces propriétés. Toutefois, les informations correspondantes peuvent être récupérées en appelant la fonction CM_Get_DevNode_Status . Pour maintenir la compatibilité avec les versions antérieures de Windows, Windows Vista et versions ultérieures prennent également en charge CM_Get_DevNode_Status. Toutefois, vous devez utiliser les clés de propriété du modèle de propriété d’appareil unifié pour accéder aux propriétés de l’appareil.

En outre, dans Windows 8 et versions ultérieures de Windows, il existe également une propriété d’état de problème. Cette propriété contient une valeur NTSTATUS qui peut contenir des informations supplémentaires relatives à un code de problème défini sur l’appareil. Si la valeur d’état du problème est STATUS_SUCCESS, aucune information supplémentaire relative au code du problème n’a été disponible lorsque le code du problème a été défini sur l’appareil.

Pour plus d’informations sur l’utilisation des clés de propriété pour accéder aux propriétés du pilote de périphérique dans Windows Vista et versions ultérieures, consultez Accès aux propriétés d’instance de périphérique (Windows Vista et versions ultérieures).

Pour accéder au code d’état et de problème d’une instance d’appareil sur Windows Server 2003, Windows XP et Windows 2000, appelez CM_Get_DevNode_Status et fournissez les paramètres suivants :

  • Définissez pulStatus sur un pointeur vers une valeur typée ULONG qui reçoit les indicateurs de bits d’état définis pour une instance de périphérique. La valeur d’état peut être n’importe quelle combinaison des indicateurs de bits avec le préfixe « DN_ » qui sont définis dans Cfg.h.

  • Définissez pulProblemNumber sur un pointeur vers une valeur typée ULONG qui reçoit le numéro de problème défini pour une instance de périphérique. Le numéro de problème est l’une des constantes avec le préfixe « CM_PROB_ » qui sont définies dans Cfg.h. CM_Get_DevNode_Status définit le numéro de problème uniquement si DN_HAS_PROBLEM est défini dans pulStatus.

  • Définissez dnDevInst sur un handle d’instance du périphérique pour lequel récupérer l’état et le code de problème.

  • Définissez ulFlags sur zéro.

Si l’appel à CM_Get_DevNode_Status réussit, CM_Get_DevNode_Status récupère l’état et le code de problème demandés pour l’instance de l’appareil et retourne CR_SUCCESS. Si l’appel de fonction échoue, CM_Get_DevNode_Status retourne l’un des codes d’erreur avec le préfixe « CR_ » défini dans Cfgmgr32.h.

Utiliser le Gestionnaire de périphériques pour trouver le code et l'état du problème d'un périphérique

En cas de problème avec un périphérique le Gestionnaire de périphériques superpose à l'icône du périphérique dans l'arborescence un triangle jaune contenant un point d'exclamation. En cliquant avec le bouton droit sur l’appareil et en choisissant Propriétés, une boîte de dialogue s’affiche avec plus d’informations sur l’appareil. Le code du problème apparaît sous l’onglet Général, dans le champ État de l’appareil.

La propriété État du problème s’affiche dans la liste déroulante Propriété sous l’onglet Détails de l’appareil dans Gestionnaire de périphériques.

Utilisation du débogueur pour rechercher le code de problème et l’état du problème pour un appareil

Pour afficher tous les appareils qui ont un code problématique dans le débogueur du noyau, utilisez l’extension !devnode 0 21 . Cela vous montre également le ProblemStatus sur l’appareil. Par exemple:

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

Vous pouvez également afficher le code de problème et l’état du problème en émettant !devnode sur une adresse 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

Voir aussi