デバイス インスタンスの状態と問題コードの取得

Windows Vista 以降のバージョンの Windows では、統合デバイス プロパティ モデルには、デバイスステータスプロパティ問題コードプロパティが含まれます。 統合デバイス プロパティ モデルでは、プロパティ キーを使用してこれらのプロパティを表します。

Windows Server 2003、Windows XP、および Windows 2000 では、統合プロパティ モデルのプロパティ キーはサポートされておらず、これらのプロパティを表す対応するレジストリ エントリ値もサポートされていません。 ただし、対応する情報は、CM_Get_DevNode_Status 関数を呼び出すことによって取得できます。 これらの以前のバージョンの Windows との互換性を維持するために、Windows Vista とそれ以降のバージョンの Windows でも、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 を呼び出し、次のパラメーターを指定します。

  • デバイス インスタンスに設定 されている状態ビット フラグを受け取る ULONG 型の値へのポインターに pulStatus を設定します。 ステータス値には、Cfg.h で定義されているプレフィックス "DN_" を持つビット フラグの任意の組み合わせを指定できます。

  • pulProblemNumber を、デバイス インスタンスに設定されている問題番号を受け取る ULONG 型の値へのポインターに設定します。 問題番号は、Cfg.h で定義されているプレフィックス "CM_PROB_" を持つ定数の 1 つです。 CM_Get_DevNode_Status は、DN_HAS_PROBLEMが pulStatus に設定されている場合にのみ、問題番号を設定します。

  • dnDevInst を、状態と問題コードを取得するデバイスのデバイス インスタンス ハンドルに設定します。

  • ulFlags を 0 に設定します。

CM_Get_DevNode_Status の呼び出しが成功した場合、CM_Get_DevNode_Status デバイス インスタンスの要求された状態と問題のコードを取得し、CR_SUCCESS を返します。 関数呼び出しが失敗した場合、CM_Get_DevNode_Status は、Cfgmgr32.h で定義されているプレフィックス "CR_" のエラー コードの 1 つを返します。

デバイス マネージャーを使用してデバイスの問題コードと問題の状態を検索

デバイスに問題がある場合、デバイス マネージャーは、ツリー ビュー内のデバイスのアイコンに感嘆符が付いた黄色の三角形でオーバーレイされます。 デバイスを右クリックし、[プロパティ] を選択すると、デバイスに関する詳細情報を含むダイアログが表示されます。 [全般] タブの [デバイスの状態] フィールドに問題コードが表示されます。

[問題の状態] プロパティは、デバイス マネージャーのデバイスの [詳細] タブの [プロパティ] ドロップダウンに表示されます。

デバッカーを使用してデバイスの問題コードと問題の状態を検索

カーネル デバッガーで問題のあるコードを持つすべてのデバイスを表示するには、!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

参照