擷取裝置實例的狀態和問題碼
在 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