Pobieranie stanu i kodu problemu dla wystąpienia urządzenia

W Windows Vista i nowszych wersjach Windows ujednolicony model właściwości urządzenia zawiera właściwość stanu urządzenia i właściwość kodu problemu. Ujednolicony model właściwości urządzenia używa kluczy właściwości do reprezentowania tych właściwości.

Windows Server 2003, Windows XP i Windows 2000 nie obsługują kluczy właściwości ujednoliconego modelu właściwości ani nie obsługują odpowiednich wartości wpisu rejestru reprezentujących te właściwości. Odpowiednie informacje można jednak pobrać, wywołując funkcję CM_Get_DevNode_Status . Aby zachować zgodność z wcześniejszymi wersjami Windows, Windows Vista i nowsze wersje obsługują również CM_Get_DevNode_Status. Należy jednak użyć kluczy właściwości ujednoliconego modelu właściwości urządzenia, aby uzyskać dostęp do właściwości urządzenia.

Ponadto w Windows 8 i nowszych wersjach Windows występuje również właściwość stanu problemu. Ta właściwość zawiera wartość NTSTATUS , która może zawierać dodatkowe informacje dotyczące kodu problemu ustawionego na urządzeniu. Jeśli wartość stanu problemu jest równa STATUS_SUCCESS, żadne dodatkowe informacje dotyczące kodu problemu nie były dostępne w momencie ustawienia tego kodu na urządzeniu.

Aby uzyskać informacje na temat używania kluczy właściwości do uzyskiwania dostępu do właściwości wystąpienia urządzenia w systemie Windows Vista i nowszych wersjach, zobacz Uzyskiwanie dostępu do właściwości wystąpienia urządzenia (Windows Vista i nowsze wersje).

Aby uzyskać dostęp do stanu i kodu problemu dla wystąpienia urządzenia w Windows Server 2003, Windows XP i Windows 2000, wywołaj CM_Get_DevNode_Status i podaj następujące parametry:

  • Ustaw pulStatus tak, aby wskazywał na wartość typu ULONG, która odbiera flagi bitów stanu ustawione dla wystąpienia urządzenia. Wartość stanu może być dowolną kombinacją flag bitowych z prefiksem "DN_", które są zdefiniowane w cfg.h.

  • Ustaw parametr pulProblemNumber tak, aby wskazywał na wartość typu ULONG, która odbiera numer problemu ustawiony dla wystąpienia urządzenia. Numer problemu jest jedną z stałych z prefiksem "CM_PROB_", które są zdefiniowane w cfg.h. CM_Get_DevNode_Status ustawia numer problemu tylko wtedy, gdy w pulStatus ustawiono DN_HAS_PROBLEM.

  • Ustaw dnDevInst na uchwyt instancji urządzenia, dla którego ma zostać pobrany stan i kod problemu.

  • Ustaw wartość ulFlags na zero.

Jeśli wywołanie CM_Get_DevNode_Status powiedzie się, CM_Get_DevNode_Status pobiera żądany stan i kod problemu dla wystąpienia urządzenia i zwraca CR_SUCCESS. Jeśli wywołanie funkcji nie powiedzie się, CM_Get_DevNode_Status zwraca jeden z kodów błędów z prefiksem "CR_", które są zdefiniowane w cfgmgr32.h.

Jak znaleźć kod i stan problemu urządzenia za pomocą Menedżera urządzeń

Jeśli wystąpi problem z urządzeniem, Menedżer urządzeń nałoży na ikonę urządzenia w widoku drzewa żółty trójkąt z wykrzyknikiem. Po kliknięciu prawym przyciskiem myszy urządzenia i wybraniu pozycji Właściwości zostanie wyświetlone okno dialogowe zawierające więcej informacji o urządzeniu. Kod problemu zostanie wyświetlony na karcie Ogólne w polu Stan urządzenia .

Właściwość Stan problemu pojawia się na liście rozwijanej Właściwość na karcie Szczegóły urządzenia w Menedżer urządzeń.

Używanie debugera do znajdowania kodu problemu i stanu problemu dla urządzenia

Aby wyświetlić wszystkie urządzenia, które mają kod problemu w debugerze jądra, użyj rozszerzenia !devnode 0 21 . To również pokazuje parametr ProblemStatus na urządzeniu. Przykład:

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

Możesz również wyświetlić kod problemu i stan problemu, wydając !devnode na adresie 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

Zobacz także