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

在 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 型別值的指標,以接收為裝置實例設定的狀態位旗標。 狀態值可以是在 Cfg.h中定義的前置詞 「DN_」 之位旗標的任何組合。

  • 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 擴充功能。 這也會顯示裝置上的 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

您也可以在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

另請參閱