共用方式為


擷取裝置實例的狀態和問題碼

在 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中。 只有當 pulStatus中設定了DN_HAS_PROBLEM時,CM_Get_DevNode_Status 才會設定問題號碼。

  • dnDevInst 設定為用於擷取狀態和問題碼的設備實例句柄。

  • ulFlags 設為零。

如果呼叫 CM_Get_DevNode_Status 成功,CM_Get_DevNode_Status 擷取裝置實例的要求狀態和問題碼,並傳回CR_SUCCESS。 如果函式呼叫失敗,CM_Get_DevNode_Status 傳回其中一個錯誤碼,其前置詞為 “CR_”,其定義於 Cfgmgr32.h中。

使用設備管理器尋找裝置的問題碼和問題狀態

當裝置發生問題時,設備管理員會在裝置的圖示上覆蓋一個含有驚嘆號的黃色三角形。 以滑鼠右鍵按兩下裝置並選擇 [屬性],就會顯示對話框,其中包含裝置的詳細資訊。 問題碼會出現在 [一般] 索引標籤的 [裝置狀態] 欄位中。

問題狀態 屬性會在設備管理器中裝置的 [詳細] 索引標籤上的 [屬性] 下拉式清單中出現。

使用調試程式尋找裝置的問題碼和問題狀態

若要檢視核心調試程式中有問題程式代碼的所有裝置,請使用 !devnode 0 21 擴充功能。 這也會顯示裝置上的問題狀態。 例如:

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

您也可以在DEVICE_NODE位址上發出 !devnode,以檢視問題碼和問題狀態:

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

另請參閱